使用最近邻居进行分类
两两距离度量
根据查询点与训练数据集中点的距离对查询点进行分类是一种简单而有效的分类新点的方法。您可以使用各种指标来确定距离,下面将对此进行描述。使用pdist2
求一组数据和查询点之间的距离。
距离度量
给定一个mx——- - - - - -n数据矩阵X,被视为mx(1 -n)行向量x1,x2、……xmx和一个我的——- - - - - -n数据矩阵Y,被视为我的(1 -n)行向量y1,y2、……y我的,向量之间的各种距离x年代和yt定义如下:
欧氏距离
欧氏距离是闵可夫斯基距离的一种特殊情况,其中p= 2.
标准化的欧几里得距离
在哪里V是n——- - - - - -n对角矩阵的j对角元素是(年代(j))2,在那里年代是每个维度的比例因子向量。
Mahalanobis距离
在哪里C是协方差矩阵。
城市街区的距离
城市街区距离是闵可夫斯基距离的一个特例,其中p= 1.
闵可夫斯基距离
对于特殊情况p= 1,闵可夫斯基距离为城市街区距离。对于特殊情况p= 2,闵可夫斯基距离给出了欧氏距离。对于特殊情况p=∞,闵可夫斯基距离就是切比乔夫距离。
Chebychev距离
切比乔夫距离是闵可夫斯基距离的一个特例,其中p=∞.
余弦距离
相关距离
在哪里
和
汉明距离
Jaccard距离
斯皮尔曼的距离
在哪里
k-最近邻搜索和半径搜索
给定一组X的n点和距离函数,k最近的邻居(k搜索让你找到k最近的点X到一个查询点或一组点Y
.的k神经网络搜索技术k基于神经网络的算法被广泛用作基准学习规则。相对简单的k神经网络搜索技术可以很容易地将其他分类技术的结果进行比较k神经网络的结果。该技术已应用于多个领域,例如:
生物信息学
图像处理和数据压缩
文档检索
计算机视觉
多媒体数据库
营销数据分析
您可以使用kNN搜索其他机器学习算法,例如:
k神经网络分类
局部加权回归
缺失数据的插补
密度估计
你也可以用k神经网络搜索具有许多基于距离的学习功能,如K-means聚类。
相反,对于正的实值r
,rangesearch
找到所有的要点X
在一定距离内r
的每一点Y
.这种固定半径搜索与k神经网络搜索,因为它支持相同的距离度量和搜索类,并使用相同的搜索算法。
k-使用穷尽搜索的最近邻搜索
当您的输入数据满足以下任何一个条件时,knnsearch
默认情况下使用穷举搜索方法查找k最近的邻居:
的列数
X
大于10。X
是稀疏的。距离度量是:
“seuclidean”
“mahalanobis”
的余弦
“相关”
“枪兵”
“汉明”
“jaccard”
自定义距离函数
knnsearch
如果您的搜索对象是ExhaustiveSearcher
模型对象。穷尽搜索方法查找从每个查询点到中的每个点的距离X
,将它们按升序排列,并返回k距离最小的点。例如,这张图显示了k= 3最近的邻居。
k最近邻搜索使用Kd-Tree
当您的输入数据满足以下所有条件时,knnsearch
创建一个Kd-树默认查找k最近的邻居:
的列数
X
小于10。X
不是稀疏。距离度量是:
“欧几里得”
(默认)“cityblock”
闵可夫斯基的
“chebychev”
knnsearch
还使用了一个Kd树,如果你的搜索对象是KDTreeSearcher
模型对象。
Kd-树将数据划分为最多的节点BucketSize
(默认值为50)个节点点,基于坐标(与类别相反)。下面的图表说明了这个概念补丁
对象来对不同的“桶”进行颜色编码。
当你想要找到k-与给定查询点最近的邻居,knnsearch
以下:
确定查询点所属的节点。在下面的示例中,查询点(32,90)属于节点4。
找到最接近的k节点内的点及其到查询点的距离。在下面的示例中,红色圆圈中的点与查询点的距离相等,并且是Node 4中离查询点最近的点。
选择从查询点到。的任意方向上具有相同距离的任意区域的所有其他节点k最近的点。在本例中,只有节点3与以查询点为中心的实心黑圆重叠,其半径等于节点4中到最近点的距离。
在该范围内的节点中搜索接近查询点的任何点。在下面的示例中,红色方格中的点比Node 4中的点更接近查询点。
使用一个K对于小于10维(列)的大型数据集,使用d-树比使用穷尽搜索方法要高效得多knnsearch
只需要计算距离的一个子集。使…的效率最大化Kd树,使用KDTreeSearcher
模型。
什么是搜索模型对象?
基本上,模型对象是存储信息的一种方便方法。相关模型具有与指定搜索方法相关的值和类型的相同属性。除了在模型中存储信息之外,您还可以对模型执行某些操作。
你可以有效地执行k-最近邻居搜索在你的搜索模型使用knnsearch
.或者,您可以使用搜索模型和搜索指定半径内的所有邻居rangesearch
.此外,还有一种通用的knnsearch
和rangesearch
不创建或使用模型进行搜索的函数。
要确定哪种类型的模型和搜索方法最适合您的数据,请考虑以下几点:
您的数据是否有很多列,比如超过10列?的
ExhaustiveSearcher
模型可能表现更好。你的数据稀疏吗?使用
ExhaustiveSearcher
模型。你是否想要使用这些距离指标去寻找最近的邻居?使用
ExhaustiveSearcher
模型。“seuclidean”
“mahalanobis”
的余弦
“相关”
“枪兵”
“汉明”
“jaccard”
自定义距离函数
您的数据集是否庞大(但列数少于10列)?使用
KDTreeSearcher
模型。您正在为大量的查询点搜索最近的邻居吗?使用
KDTreeSearcher
模型。
分类查询数据
这个例子展示了如何按以下方式对查询数据进行分类:
种植Kd-tree
进行一项k使用已生长的树进行最近邻居搜索。
为每个查询点分配在它们各自最近的邻居中具有最高表示的类。
根据Fisher虹膜数据的最后两列对一个新点进行分类。只使用最后两列更容易绘图。
负载fisheririsx =量(:,3:4);gscatter (x (: 1) x(:, 2),物种)传说(“位置”,“最佳”)
画出新的点。
Newpoint = [5 1.45];线(newpoint (1) newpoint (2),“标记”,“x”,“颜色”,“k”,...“markersize”10“线宽”, 2)
准备一个Kd-树邻居搜索器模型。
Mdl = KDTreeSearcher (x)
Mdl = KDTreeSearcher属性:BucketSize: 50距离:'euclidean' DistParameter: [] X: [150x2 double]
Mdl
是一个KDTreeSearcher
模型。默认情况下,它用于搜索邻居的距离度量是欧氏距离。
找出最接近新点的10个样本点。
[n、d] = knnsearch (Mdl newpoint,“k”10);线(x (n, 1), x (n, 2),“颜色”,(。5。5。5),“标记”,“o”,...“线型”,“没有”,“markersize”, 10)
看来,knnsearch
只找到了最近的八个邻居。事实上,这个特定的数据集包含重复的值。
x (n,:)
ans =10×25.5000 1.5000 1.9000 1.5000 5.1000 1.1000 1.6000 4.8000 1.4000 5.000 1.7000 4.7000 1.5000
使坐标轴相等,这样计算出的距离与图轴上的视距离相等,并放大以更好地看到相邻的距离。
xlim ([4.5 - 5.5]);ylim ([1 - 2]);轴广场
找出10个邻居的物种。
汇总(物种(n))
值计数百分比virginica 2 20.00% versicolol8 80.00%
使用基于10个最近邻居的多数投票的规则,您可以将这个新点分类为versicolor。
通过在一组邻居周围画一个圈来直观地识别它们。根据新点的位置定义圆的圆心和直径。
CTR = newpoint - d(end);直径= 2 * d(结束);在10个最近的邻居周围画一个圈。。h =矩形(“位置”(ctr,直径,直径),...“弯曲”[1]);h.LineStyle =“:”;
使用相同的数据集,找到三个新点的10个最近的邻居。
图newpoint2 = [5 1.45;6 2;2.75 .75];gscatter (x (: 1) x(:, 2),物种)传说(“位置”,“最佳”) [n2,d2] = knnsearch(Mdl,newpoint2,“k”10);线(x (n2, 1), x (n2, 2),“颜色”,(。5。5。5),“标记”,“o”,...“线型”,“没有”,“markersize”10)线(newpoint2 (: 1), newpoint2 (:, 2),“标记”,“x”,“颜色”,“k”,...“markersize”10“线宽”2,“线型”,“没有”)
找出每一个新点最近的10个近邻的物种。
汇总(物种(n2 (1,:)))
值计数百分比virginica 2 20.00% versicolol8 80.00%
汇总(物种(n2 (2:)))
值计数百分比virginica 10 100.00%
汇总(物种(n2 (3,:)))
价值计数百分比多彩7 70.00%彩色3 30.00%
有关更多示例,请使用knnsearch
方法和函数,请参阅个别参考页。
使用自定义距离度量查找最近的邻居
这个例子展示了如何找到三个最近的观测值的指标X
的每一个观察Y
关于卡方距离。这种距离度量用于对应分析,特别是在生态应用中。
随机生成正态分布数据到两个矩阵。行数可以变化,但列数必须相等。本示例使用2-D数据进行绘图。
rng (1)%的再现性X = randn (50, 2);Y = randn (4,2);h = 0 (3,1);图h(1) = plot(X(:,1),X(:,2),“软”);持有在h(2) =情节(Y (: 1), Y (:, 2),“rs”,“MarkerSize”10);标题(异构数据的)
的行X
和Y
对应于观察结果,列通常是维度(例如,预测器)。
卡方距离j维点x和z是
在哪里 重量与尺寸有关吗j.
为每个维度选择权重,并指定卡方距离函数。距离函数必须:
的一行作为输入参数
X
,例如,x
,和矩阵Z
.比较
x
到每一行Z
.返回一个向量
D
的长度 ,在那里 行数是多少Z
.的每个元素D
观察到的距离是否对应于x
和对应于每一行的观察值Z
.
w = (0.4;0.6);chiSqrDist = @ (x, Z)√(bsxfun (@minus, x, Z)。^ 2)* w);
本示例使用任意权重进行说明。
中最近的三个观测值的指数X
的每一个观察Y
.
k = 3;[Idx D] = knnsearch (X, Y,“距离”chiSqrDist,“k”、k);
idx
和D
4-by-3矩阵。
idx (j, 1)
最近的观察的行索引在吗X
来观察j的Y
,D (j, 1)
是他们的距离。idx (j, 2)
下一个最近的观察的行索引在吗X
来观察j的Y
,D (j, 2)
是他们的距离。等等。
找出图中最近的观察点。
为j = 1:k h(3) = plot(X(Idx(:,j),1),X(Idx(:,j),2),“柯”,“MarkerSize”10);结束传奇(h, {“\ texttt {X}’,“\ texttt {Y}’,“最近邻”},“翻译”,“乳胶”)标题(“异构数据和最近邻居”)举行从
数的观察Y
分享最近的邻居。
验证卡方距离度量等价于欧氏距离度量,但带有可选的缩放参数。
[IdxE, DE] = knnsearch (X, Y,“距离”,“seuclidean”,“k”、钾、...“规模”1. / (sqrt (w)));AreDiffIdx = sum(sum(Idx ~= IdxE))
AreDiffIdx = 0
AreDiffDist = sum(sum(abs(D - DE) > eps))
AreDiffDist = 0
三个最近邻的两个实现之间的索引和距离实际上是相等的。
K-监督学习的最近邻分类
的ClassificationKNN
分类模型让你:
构建资讯分类器
这个例子展示了如何构造一个k- Fisher虹膜数据的最近邻分类器。
加载Fisher虹膜数据。
负载fisheririsX =量;%使用所有数据进行拟合Y =物种;%响应数据
使用以下内容构建分类器fitcknn
.
Mdl = fitcknn (X, Y)
Mdl = ClassificationKNN ResponseName: 'Y' CategoricalPredictors: [] ClassNames: {'setosa' 'versicolor' 'virginica'} ScoreTransform: 'none' NumObservations: 150 Distance: 'euclidean' NumNeighbors: 1属性,方法
一个默认的k-最近邻分类器只使用单个最近邻。通常,如果一个分类器拥有更多的邻居,它就会更加健壮。
的邻域大小Mdl
来4
,这意味着Mdl
使用四个最近的近邻进行分类。
Mdl。NumNeighbors = 4;
KNN分类器的质量检验
这个例子展示了如何检查的质量k-使用替换和交叉验证的最近邻分类器。
为Fisher虹膜数据构造KNN分类器,如构建资讯分类器.
负载fisheririsX =量;Y =物种;rng (10);%的再现性Mdl = fitcknn (X, Y,“NumNeighbors”4);
检查替换损失,默认情况下,它是预测的错误分类的比例Mdl
.(关于非默认代价、权重或先验,请参见损失
)。
rloss = resubLoss (Mdl)
rloss = 0.0400
分类器对4%的训练数据进行了错误预测。
根据模型构造一个交叉验证的分类器。
CVMdl = crossval (Mdl);
检查交叉验证损失,这是在对不用于训练的数据进行预测时,每个交叉验证模型的平均损失。
克劳斯= kfoldLoss (CVMdl)
克劳斯= 0.0333
交叉验证的分类精度与替换精度相似。因此,你可以期待Mdl
对大约4%的新数据进行错误分类,假设新数据与训练数据的分布大致相同。
使用KNN分类器预测分类
这个例子展示了如何预测a的分类k最近的邻居分类器。
为Fisher虹膜数据构造KNN分类器,如构建资讯分类器.
负载fisheririsX =量;Y =物种;Mdl = fitcknn (X, Y,“NumNeighbors”4);
预测一朵普通花的分类。
flwr =意味着(X);一朵普通的花flwr flwrClass =预测(Mdl)
flwrClass =1 x1单元阵列{“癣”}
修改资讯分类器
这个例子展示了如何修改k最近的邻居分类器。
为Fisher虹膜数据构造KNN分类器,如构建资讯分类器.
负载fisheririsX =量;Y =物种;Mdl = fitcknn (X, Y,“NumNeighbors”4);
修改模型以使用三个最近邻,而不是默认的一个最近邻。
Mdl。NumNeighbors = 3;
比较替换预测和交叉验证损失与新的邻居数。
损失= resubLoss (Mdl)
损失= 0.0400
rng (10);%的再现性CVMdl = crossval (Mdl,“KFold”5);克劳斯= kfoldLoss (CVMdl)
克劳斯= 0.0333
在这种情况下,具有三个邻居的模型与具有四个邻居的模型具有相同的交叉验证损失(参见KNN分类器的质量检验).
修改模型以使用余弦距离代替默认值,并检查损失。要使用余弦距离,必须使用穷尽搜索方法重新创建模型。
CMdl = fitcknn (X, Y,“NSMethod”,“详尽”,“距离”,的余弦);CMdl。NumNeighbors = 3;克洛斯= resubLoss (CMdl)
克洛斯= 0.0200
分类器现在具有比以前更低的替换误差。
检查新模型交叉验证版本的质量。
CVCMdl = crossval (CMdl);kcloss = kfoldLoss (CVCMdl)
kcloss = 0.0200
CVCMdl
是否有更好的交叉验证损失CVMdl
.然而,一般来说,改进再替代误差并不一定会产生一个具有更好的测试样本预测的模型。