主要内容

使用最近邻进行分类

成对距离指标

根据查询点与训练数据集中点的距离对查询点进行分类是一种简单而有效的新点分类方法。您可以使用各种度量来确定距离,下面将进行描述。使用PDIST2.找到一组数据和查询点之间的距离。

距离度量

给定一个mx——- - - - - -N.数据矩阵X,被视为mx(1-by-N.)行向量X1X2、……Xmx和一个我的——- - - - - -N.数据矩阵y,被视为我的(1-by-N.)行向量y1y2、……y我的,表示向量之间的不同距离XS.yT.定义如下:

  • 欧氏距离

    D. S. T. 2 = X S. y T. 的) X S. y T. 的) '

    欧几里得距离是闵可夫斯基距离的一种特例P.= 2

  • 标准化的欧几里得距离

    D. S. T. 2 = X S. y T. 的) V. 1 X S. y T. 的) '

    在哪里V.N.——- - - - - -N.对角线矩阵谁j第Th对角元素为S.j))2,在那里S.是每个维度的比例因子向量。

  • Mahalanobis距离

    D. S. T. 2 = X S. y T. 的) C 1 X S. y T. 的) '

    在哪里C是协方差矩阵。

  • 城市街区的距离

    D. S. T. = j = 1 N. | X S. j y T. j |

    城市街区距离是Minkowski距离的特殊情况,在哪里P.= 1

  • 闵可夫斯基距离

    D. S. T. = j = 1 N. | X S. j y T. j | P. P.

    的特殊情况P.= 1,闵可夫斯基距离表示城市街区距离。的特殊情况P.= 2,闵可夫斯基距离给出了欧几里得距离。的特殊情况P.=∞,闵可夫斯基距离给出了切比切夫距离。

  • Chebychev距离

    D. S. T. = 马克斯 j { | X S. j y T. j | }

    切比切夫距离是闵可夫斯基距离的一种特殊情况P.=∞

  • 余弦距离

    D. S. T. = 1 X S. y ' T. X S. X ' S. 的) y T. y ' T. 的) 的)

  • 相关距离

    D. S. T. = 1 X S. X ¯ S. 的) y T. y ¯ T. 的) ' X S. X ¯ S. 的) X S. X ¯ S. 的) ' y T. y ¯ T. 的) y T. y ¯ T. 的) '

    在哪里

    X ¯ S. = 1 N. j X S. j

    y ¯ T. = 1 N. j y T. j

  • 汉明距离

    D. S. T. = X S. j y T. j 的) / N. 的)

  • jaccard距离

    D. S. T. = [ X S. j y T. j 的) X S. j 0. 的) y T. j 0. 的) 的) ] [ X S. j 0. 的) y T. j 0. 的) ]

  • 斯皮尔曼的距离

    D. S. T. = 1 R. S. R. ¯ S. 的) R. T. R. ¯ T. 的) ' R. S. R. ¯ S. 的) R. S. R. ¯ S. 的) ' R. T. R. ¯ T. 的) R. T. R. ¯ T. 的) '

    在哪里

    • R.sjXsj接管X1jX2j, ...XMX,J.,如上所述tiedrank

    • R.tjytj接管y1jy2j, ...y我,J.,如上所述tiedrank

    • R.S.R.T.是坐标 - 明智的等级矢量XS.yT.,也就是说,R.S.=(R.S.1R.S.2, ...R.sn),R.T.=(R.T.1R.T.2, ...R.tn)。

    • R. ¯ S. = 1 N. j R. S. j = N. + 1 的) 2

    • R. ¯ T. = 1 N. j R. T. j = N. + 1 的) 2

K.-最近邻搜索和半径搜索

给定一组XN.点和距离函数,K.最近的邻居(K.搜索让你找到K.最近的点X到一个查询点或一组点y.这K.神经网络搜索技术K.基于神经网络的算法被广泛应用于基准学习规则。相对简单的K.神经网络搜索技术使其他分类技术的结果易于比较K.结果。该技术已用于各种领域,例如:

  • 生物信息学

  • 图像处理和数据压缩

  • 文件检索

  • 计算机视觉

  • 多媒体数据库

  • 营销数据分析

您可以使用K.nn搜索其他机器学习算法,例如:

  • K.神经网络分类

  • 局部加权回归

  • 缺失的数据输入和插值

  • 密度估计

你也可以用K.NN搜索与许多基于距离的学习函数,如K-means聚类。

相反,对于一个正的实值R.rangesearch找到所有的点X在一定距离内R.每个点y.这种固定半径的搜索与K.NN搜索,因为它支持相同的距离度量万博1manbetx和搜索类,并使用相同的搜索算法。

K.使用穷举搜索的最近邻搜索

当您的输入数据满足下列任何条件时,knnsearch.在默认情况下使用穷举搜索方法来查找K.- 最邻居:

  • 的列数X大于10。

  • X稀疏。

  • 距离度量是:

    • “seuclidean”

    • “mahalanobis”

    • '余弦'

    • “相关”

    • “枪兵”

    • '汉明'

    • “jaccard”

    • 自定义距离函数

knnsearch.如果您的搜索对象是一个,还使用详尽的搜索方法ExhaustiveSearcher模型对象。穷举搜索方法是求出每个查询点到每个查询点的距离X,将它们按升序排列,并返回K.距离最小的点。例如,该图显示了K.= 3最近的邻居。

K.-最近邻搜索K.d-Tree

当您的输入数据满足以下所有条件时,knnsearch.创建一个K.D-tree默认查找K.- 最邻居:

  • 的列数X小于10。

  • X不是稀疏。

  • 距离度量是:

    • “欧几里得”(默认)

    • “cityblock”

    • 闵可夫斯基的

    • 'chebychev'

knnsearch.还使用了一个K.如果你的搜索对象是KDTreeSearcher模型对象。

K.d-树将您的数据划分为节点最多铲斗(默认值是50)每个节点,基于坐标(而不是类别)。下面的图表使用补丁对象的颜色编码不同的“桶”。

当你想找到K.- 在给定的查询点的最佳邻居,knnsearch.是否有以下操作:

  1. 确定查询点所属的节点。本例中,查询点(32,90)属于节点4。

  2. 找到最接近的K.该节点内的点及其到查询点的距离。在下面的示例中,红色圆圈中的点与查询点的距离相等,并且是节点4中距离查询点最近的点。

  3. 选择具有从查询点到。的任意方向相同距离内的任何区域的所有其他节点K.最接近的点。在该示例中,只有节点3与以附近的查询点为中心的固体黑圆重叠,半径等于与节点4内的最近点的距离。

  4. 在该范围内的节点中搜索距离查询点更近的任何点。在下面的示例中,红色方块中的点比节点4中的点更接近查询点。

用一个K.对于具有少于10维(列)的大型数据集的D树(列)可以比使用详尽的搜索方法更有效,如knnsearch.只需要计算距离的一个子集。使…的效率最大化K.d树,使用KDTreeSearcher模型。

什么是搜索模型对象?

基本上,模型对象是存储信息的便捷方式。相关模型具有与与指定的搜索方法相关的值和类型相同的属性。除了在模型中存储信息外,您还可以对模型执行某些操作。

你可以有效地执行K.-最近的邻居搜索在您的搜索模型使用knnsearch..或者,您可以使用您的搜索模型和搜索指定半径内的所有邻居rangesearch.另外,还有一个通用的knnsearch.rangesearch不创建或使用模型进行搜索的函数。

要确定哪种类型的模型和搜索方法最适合您的数据,请考虑以下问题:

  • 您的数据是否有很多列,比如超过10列?这ExhaustiveSearcher模型可能表现更好。

  • 你的数据稀疏吗?使用ExhaustiveSearcher模型。

  • 您想使用这些距离度量之一来找到最近的邻居吗?使用ExhaustiveSearcher模型。

    • “seuclidean”

    • “mahalanobis”

    • '余弦'

    • “相关”

    • “枪兵”

    • '汉明'

    • “jaccard”

    • 自定义距离函数

  • 您的数据是否已设置巨大(但少于10列)?使用KDTreeSearcher模型。

  • 您是否在寻找最近的邻居进行大量查询点?使用KDTreeSearcher模型。

分类查询数据

这个例子展示了如何对查询数据进行分类:

  1. 种植K.d-tree

  2. 进行一项K.使用已长成的树进行最近邻搜索。

  3. 分配每个查询指向其各自最近邻居之间最高表示的类。

基于Fisher虹膜数据的最后两列对一个新点进行分类。仅使用最后两列更容易绘制。

加载fisheririsX = MEAS(:,3:4);g箭偶(x(:,1),x(:,2),物种)传奇(“位置”“最佳”的)

图中包含一个轴对象。轴对象包含3个类型为line的对象。这些物品代表着维珍卡。

绘制新点。

newpoint = [5 1.45];行(NewPoint(1),NewPoint(2),'标记''X'“颜色”“k”...“markersize”10“线宽”, 2)

图中包含一个轴对象。轴对象包含4个类型为line的对象。这些物品代表着维珍卡。

准备A.K.d-树邻居搜索器模型。

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)

图中包含一个轴对象。axis对象包含5个类型为line的对象。这些物品代表着维珍卡。

看来,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]);轴广场

图中包含一个轴对象。axis对象包含5个类型为line的对象。这些物品代表着维珍卡。

找到10个邻居的物种。

汇总(物种(n))
价值计数百分比维珍2 20.00%花斑8 80.00%

使用基于10个最接近的邻居的多数投票的规则,您可以将这个新点分类为杂色。

通过在他们周围画一个圈来直观地识别他们的邻居。根据新点的位置定义圆的中心和直径。

ctr = newpoint  -  d(结束);直径= 2 * D(结束);%在10个最近的邻居周围画一个圆圈。h =矩形(“位置”,[CTR,直径,直径],...'曲率'[1]);h.LineStyle =“:”;

图中包含一个轴对象。axis对象包含6个类型为直线、矩形的对象。这些物品代表着维珍卡。

使用相同的数据集,找到三个新点的10个最近的邻居。

图newpoint2 = [5 1.45;6 2;2.75 .75];g箭偶(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,“线型”'没有任何'的)

图中包含一个轴对象。axis对象包含5个类型为line的对象。这些物品代表着维珍卡。

为每个新点找出10个最近的邻居的物种。

Tabulate(物种(n2(1,:))))
价值计数百分比维珍2 20.00%花斑8 80.00%
Tabulate(物种(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))'bx');持有h(2) =情节(Y (: 1), Y (:, 2),'rs'“MarkerSize”10);标题('异构数据'的)

图中包含一个轴对象。标题为异构数据的axis对象包含2个类型为line的对象。

的行Xy对应于观察值,列通常是维度(例如,预测器)。

卡方距离j维点XZ.

χ X Z. 的) = j = 1 j W. j X j - Z. j 的) 2

在哪里 W. j 重量与尺寸有关吗j

为每个维度选择权重,并指定卡方距离函数。距离函数必须:

  • 作为输入参数一行X,例如,X,矩阵Z.

  • 比较X每一行Z.

  • 返回矢量D.的长度 N. Z. ,在那里 N. Z. 行数是多少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);

idxD.是4×3矩阵。

  • idx (j, 1)最近观测的行索引在吗X来观察jy,D (j, 1)是他们的距离。

  • idx (j, 2)下一个最近的观测的行索引在吗X来观察jy,D (j, 2)是他们的距离。

  • 等等。

确定情节中最近的观察结果。

为了j = 1:k h(3)= plot(x(id id(:,j),1),x(idx(:,j),2),“柯”“MarkerSize”10);结尾传奇(h, {'\ texttt {x}'“\ texttt {Y}’'最近的邻居'},“翻译”“乳胶”)标题(“异构数据和最近邻”)举行

图中包含一个轴对象。具有标题异构数据和最近邻居的轴对象包含5个类型的类型。这些对象表示\ texttt {x},\ texttt {y},最近的邻居。

数的观察y分享最近的邻居。

验证Chi-Square距离度量等同于欧几里德距离度量,而是具有可选的缩放参数。

[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分类模型让您:

根据程序准备您的分类数据监督学习的步骤.然后,使用fitcknn

构建KNN分类器

这个例子展示了如何构造一个K.Fisher虹膜数据的最近邻分类器。

载入费雪虹膜数据。

加载fisheririsx = meas;%使用所有数据进行拟合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分类器只使用一个最近邻。通常,一个分类器有更多的邻居会更健壮。

改变邻里大小Mdl4.,这意味着Mdl使用四个最近邻居进行分类。

mdl.numneighbors = 4;

KNN分类器的质量检验

此示例显示如何检查a的质量K.-使用重新替换和交叉验证的最近邻分类器。

为Fisher虹膜数据构造一个KNN分类器,如构建KNN分类器

加载fisheririsx = meas;y =物种;RNG(10);%的再现性mdl = fitcknn(x,y,“NumNeighbors”,4);

检查重新替换损失,默认情况下,这是根据预测错误分类的部分Mdl.(关于非默认成本、权重或先验值,请参见损失)。

rloss = resubLoss (Mdl)
rloss = 0.0400.

分类器对4%的训练数据预测错误。

从模型构造交叉验证的分类器。

CVMdl = crossval (Mdl);

检查交叉验证损失,这是每个交叉验证模型在对未用于训练的数据进行预测时的平均损失。

kloss = kfoldloss(cvmdl)
克劳斯= 0.0333

交叉验证的分类精度与再替换精度相似。因此,你可以期待Mdl对大约4%的新数据进行错误分类,假设新数据与训练数据具有相同的分布。

使用KNN分类器预测分类

这个例子展示了如何预测一个K.最近的邻居分类器。

为Fisher虹膜数据构造一个KNN分类器,如构建KNN分类器

加载fisheririsx = meas;y =物种;mdl = fitcknn(x,y,“NumNeighbors”,4);

预测一朵普通花的分类。

flwr =平均(x);%一朵普通的花flwr flwrClass =预测(Mdl)
flwrclass =1 x1单元阵列{'versicolor'}

修改资讯分类器

这个例子展示了如何修改K.最近的邻居分类器。

为Fisher虹膜数据构造一个KNN分类器,如构建KNN分类器

加载fisheririsx = meas;y =物种;mdl = fitcknn(x,y,“NumNeighbors”,4);

修改模型以使用三个最近的邻居,而不是默认的一个最近的邻居。

mdl.numneighbors = 3;

将重新替换预测和交叉验证损失与新邻居数量进行比较。

损失= resubLoss (Mdl)
损失= 0.0400.
RNG(10);%的再现性cvmdl = crossval(mdl,“KFold”5);kloss = kfoldloss(cvmdl)
克劳斯= 0.0333

在这种情况下,有三个邻居的模型与有四个邻居的模型具有相同的交叉验证损失(参见KNN分类器的质量检验)。

修改模型,使用余弦距离代替默认值,并检查损失。要使用余弦距离,必须使用穷举搜索方法重新创建模型。

cmdl = fitcknn(x,y,“NSMethod”“详尽”“距离”'余弦');CMdl。NumNeighbors = 3;克洛斯= resubLoss (CMdl)
Closs = 0.0200.

分类器现在比以前有更低的重替换错误。

检查新模型的交叉验证版本的质量。

CVCMdl = crossval (CMdl);kcloss = kfoldLoss (CVCMdl)
kcloss = 0.0200

CVCMdl具有更好的交叉验证损失CVMdl.然而,一般而言,改进重新提交误差不一定产生具有更好测试样本预测的模型。

也可以看看

|||