根据查询点与训练数据集中点的距离对查询点进行分类是一种简单而有效的新点分类方法。您可以使用各种度量来确定距离,下面将进行描述。使用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第Th对角元素为(年代(j))2,在那里年代是每个维度的比例因子向量。
Mahalanobis距离
在哪里C是协方差矩阵。
城市街区的距离
城市街区距离是闵可夫斯基距离的一种特殊情况p= 1.
闵可夫斯基距离
的特殊情况p= 1,闵可夫斯基距离表示城市街区距离。的特殊情况p= 2,闵可夫斯基距离给出了欧几里得距离。的特殊情况p=∞,闵可夫斯基距离给出了切比切夫距离。
Chebychev距离
切比切夫距离是闵可夫斯基距离的一种特殊情况p=∞.
余弦距离
相关距离
在哪里
和
汉明距离
Jaccard距离
斯皮尔曼的距离
在哪里
给定一组X的n点和距离函数,k最近的邻居(k搜索让你找到k最近的点X到一个查询点或一组点Y
.的k神经网络搜索技术k基于神经网络的算法被广泛应用于基准学习规则。相对简单的k神经网络搜索技术使其他分类技术的结果易于比较k神经网络的结果。该技术已被用于各个领域,如:
生物信息学
图像处理和数据压缩
文档检索
计算机视觉
多媒体数据库
营销数据分析
您可以使用kNN搜索其他机器学习算法,如:
k神经网络分类
局部加权回归
缺失的数据输入和插值
密度估计
你也可以用kNN搜索与许多基于距离的学习函数,如K-means聚类。
相反,对于一个正的实值r
,rangesearch
找到所有的点X
在一定距离内r
每个点的Y
.这种固定半径的搜索与kNN搜索,因为它支持相同的距离度量金宝app和搜索类,并使用相同的搜索算法。
当您的输入数据满足下列任何条件时,knnsearch
在默认情况下使用穷举搜索方法来查找k最近的邻居:
的列数X
大于10。
X
是稀疏的。
距离度量是:
“seuclidean”
“mahalanobis”
的余弦
“相关”
“枪兵”
“汉明”
“jaccard”
自定义距离函数
knnsearch
如果你的搜索对象是ExhaustiveSearcher
模型对象。穷举搜索方法是求出每个查询点到每个查询点的距离X
,将它们按升序排列,并返回k距离最小的点。例如,这个图显示了k= 3最近的邻居。
当您的输入数据满足以下所有条件时,knnsearch
创建一个KD-tree默认查找k最近的邻居:
的列数X
小于10。
X
不是稀疏。
距离度量是:
“欧几里得”
(默认)
“cityblock”
闵可夫斯基的
“chebychev”
knnsearch
还使用了一个K如果你的搜索对象是KDTreeSearcher
模型对象。
Kd-树将您的数据划分为节点最多BucketSize
(默认值是50)每个节点,基于坐标(而不是类别)。下面的图表使用补丁
对象的颜色编码不同的“桶”。
当你想找到k-给定查询点的最近邻,knnsearch
以下:
确定查询点所属的节点。本例中,查询点(32,90)属于节点4。
找到最接近的k该节点内的点及其到查询点的距离。在下面的示例中,红色圆圈中的点与查询点的距离相等,并且是节点4中距离查询点最近的点。
选择具有从查询点到。的任意方向相同距离内的任何区域的所有其他节点k最近的点。在本例中,只有节点3与以查询点为中心的实心黑圆重叠,半径等于节点4内最近点的距离。
在该范围内的节点中搜索距离查询点更近的任何点。在下面的示例中,红色方块中的点比节点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 with properties: BucketSize: 50 Distance: '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.0000 1.5000 4.9000 1.5000 4.9000 1.5000 5.1000 1.5000 5.1000 1.6000 4.8000 1.4000 5.0000 1.7000 4.7000 1.4000 4.7000 1.5000
使坐标轴相等,以便计算的距离与图轴上的视距离相等,并放大以更好地查看邻居。
xlim ([4.5 - 5.5]);ylim ([1 - 2]);轴广场
找出10个邻居的物种。
汇总(物种(n))
价值计数百分比维珍2 20.00%花斑8 80.00%
使用基于10个最接近的邻居的多数投票的规则,您可以将这个新点分类为杂色。
通过在他们周围画一个圈来直观地识别他们的邻居。根据新点的位置定义圆的中心和直径。
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,:)))
价值计数百分比维珍2 20.00%花斑8 80.00%
汇总(物种(n2 (2:)))
价值计数百分比10 100.00%
汇总(物种(n2 (3,:)))
值计数百分比花斑7 70.00%色度3 30.00%
要查看更多使用knnsearch
方法和函数,见个别参考页。
这个例子展示了如何找到三个最近的观测指数X
每一个观察结果Y
关于卡方距离。这种距离度量用于对应分析,特别是在生态应用中。
随机生成正态分布数据为两个矩阵。行数可以变化,但列数必须相等。本例使用2d数据进行绘图。
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)
是他们的距离。
等等。
在图中找出最近的观测结果。
为X(Idx(:,j),1),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
三个最近邻的两个实现之间的指标和距离实际上是等价的。
的ClassificationKNN
分类模型让您:
这个例子展示了如何构造一个kFisher虹膜数据的最近邻分类器。
载入费雪虹膜数据。
负载fisheririsX =量;%使用所有数据进行拟合Y =物种;%响应数据
使用以下命令构造分类器fitcknn
.
Mdl = fitcknn (X, Y)
Mdl = ClassificationKNN ResponseName: 'Y' CategoricalPredictors: [] ClassNames: {'setosa' 'versicolor' 'virginica'} ScoreTransform: 'none' NumObservations: 150距离:'euclidean' NumNeighbors: 1属性,方法
一个默认的k-nearest neighbor分类器只使用一个最近邻。通常,一个分类器有更多的邻居会更健壮。
改变的邻域大小Mdl
来4
,这意味着Mdl
使用四个最近的邻居进行分类。
Mdl。NumNeighbors = 4;
这个例子展示了如何检查一个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%的新数据进行错误分类,假设新数据与训练数据具有相同的分布。
这个例子展示了如何预测一个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
.然而,一般来说,改进再替代错误并不一定会产生一个具有更好的测试样本预测的模型。