使用最近邻分类

成对距离度量

分类基于在训练数据集他们点距离查询点可以是一个简单的分类新点的又有效的方法。您可以使用各种指标来判断距离,接下来描述。用pdist2找到一组数据和查询点之间的距离。

距离度量

给定一个mx-通过-ñ数据矩阵X,这将被视为mx(1逐ñ)行向量X1X2、……Xmx, 和我的-通过-ñ数据矩阵ÿ,这将被视为我的(1逐ñ)行向量ÿ1ÿ2、……ÿ我的向量之间的不同距离X小号ÿŤ定义如下:

  • 欧氏距离

    d 小号 Ť 2 = X 小号 ÿ Ť X 小号 ÿ Ť

    欧几里得距离是闵可夫斯基距离,其中的一个特例p= 2

  • 标准化的欧氏距离

    d 小号 Ť 2 = X 小号 ÿ Ť V 1 X 小号 ÿ Ť

    哪里Vñ-通过-ñ角矩阵,其Ĵ第对角元素为小号Ĵ))2,其中小号是缩放因子对每个维度的向量。

  • 马氏距离

    d 小号 Ť 2 = X 小号 ÿ Ť C 1 X 小号 ÿ Ť

    哪里C为协方差矩阵。

  • 市街区距离

    d 小号 Ť = Ĵ = 1 ñ | X 小号 Ĵ ÿ Ť Ĵ |

    城市街区距离是闵可夫斯基距离,其中的一个特例p= 1

  • 明氏距离

    d 小号 Ť = Ĵ = 1 ñ | X 小号 Ĵ ÿ Ť Ĵ | p p

    对于的特殊情况p= 1,闵可夫斯基距离给城市街区距离。对于的特殊情况p= 2,闵可夫斯基距离给出了欧氏距离。对于的特殊情况p=∞,闵可夫斯基距离就是切比切夫距离。

  • Chebychev距离

    d 小号 Ť = 马克斯 Ĵ { | X 小号 Ĵ ÿ Ť Ĵ | }

    切比雪夫距离是闵可夫斯基距离,其中的一个特例p=∞

  • 余弦距离

    d 小号 Ť = 1 X 小号 ÿ Ť X 小号 X 小号 ÿ Ť ÿ Ť

  • 相关距离

    d 小号 Ť = 1 X 小号 X ¯ 小号 ÿ Ť ÿ ¯ Ť X 小号 X ¯ 小号 X 小号 X ¯ 小号 ÿ Ť ÿ ¯ Ť ÿ Ť ÿ ¯ Ť

    哪里

    X ¯ 小号 = 1 ñ Ĵ X 小号 Ĵ

    ÿ ¯ Ť = 1 ñ Ĵ ÿ Ť Ĵ

  • 汉明距离

    d 小号 Ť = X 小号 Ĵ ÿ Ť Ĵ / ñ

  • 杰卡德距离

    d 小号 Ť = [ X 小号 Ĵ ÿ Ť Ĵ X 小号 Ĵ 0 ÿ Ť Ĵ 0 ] [ X 小号 Ĵ 0 ÿ Ť Ĵ 0 ]

  • 斯皮尔曼距离

    d 小号 Ť = 1 [R 小号 [R ¯ 小号 [R Ť [R ¯ Ť [R 小号 [R ¯ 小号 [R 小号 [R ¯ 小号 [R Ť [R ¯ Ť [R Ť [R ¯ Ť

    哪里

    • [RSJ是的秩XSJ被占领了X1ĴX2Ĵ,……XMX,J如通过计算tiedrank

    • [RTJ是的秩ÿTJ被占领了ÿ1Ĵÿ2Ĵ,……ÿ我,J如通过计算tiedrank

    • [R小号[RŤ是的坐标明智秩矢量X小号ÿŤ[R小号=([R小号1[R小号2,……[RSN)和[RŤ=([RŤ1[RŤ2,……[RTN)。

    • [R ¯ 小号 = 1 ñ Ĵ [R 小号 Ĵ = ñ + 1 2

    • [R ¯ Ť = 1 ñ Ĵ [R Ť Ĵ = ñ + 1 2

ķ-Nearest邻搜索和搜索半径

给定一组Xñ点和距离函数,ķ-最近的邻居 (ķNN)搜索让你找到ķ在最近点X以点的查询点或集ÿ。该ķNN搜索技术和ķ基于nnn的算法被广泛用作基准学习规则。的相对简单性ķ利用神经网络搜索技术可以很容易地比较其他分类技术的结果ķNN结果。该技术已经在各个领域,如使用:

  • 生物信息学

  • 图像处理和数据压缩

  • 文献检索

  • 计算机视觉

  • 多媒体数据库

  • 市场数据分析

您可以使用ķNN搜索其他机器学习算法,如:

  • ķ神经网络分类

  • 局部加权回归

  • 丢失的数据归集和插值

  • 密度估计

您还可以使用ķ具有许多基于距离的学习函数的NN搜索,如K-means聚类。

相比之下,对于正实数值[Rrangesearch发现在所有点X是的距离内[R在每个点的ÿ。这种固定半径搜索密切相关ķNN搜索的,因为它支持相同的距离度万博1manbetx量和搜索类,并使用相同的搜索算法。

ķ-使用穷举搜索的最近邻搜索

当您的输入数据符合下列任一条件时,knnsearch默认情况下使用穷举搜索方法来查找ķ-nearest邻居:

  • 列数X超过10。

  • X稀疏。

  • 距离度规为:

    • “seuclidean”

    • “马氏

    • “余弦”

    • “相关性”

    • “斯皮尔曼

    • “汉明”

    • “捷卡”

    • 自定义距离函数

knnsearch还采用穷举搜索方法,如果你的搜索对象是一个ExhaustiveSearcher模型对象。穷举搜索方法查找到的每一个点,从每个查询点的距离X,他们排名升序排列,并返回ķ具有最小距离的点。例如,该图显示了ķ= 3最近的邻居。

ķ-Nearest邻搜索使用ķd树

当您输入的数据符合以下所有条件,knnsearch创建ķd-树默认情况下查找ķ-nearest邻居:

  • 列数X小于10。

  • X不疏。

  • 距离度规为:

    • “欧几里得”(默认)

    • '城市街区'

    • 闵可夫斯基的

    • “切比雪夫”

knnsearch还采用了ķd-tree,如果你的搜索对象是aKDTreeSearcher模型对象。

ķd树最多将您的数据与节点BucketSize基于坐标(与类别相反),每个节点(默认为50)点。下面的图表说明了这个概念补丁反对色码不同的“桶”。

当你想找到ķ-nearest邻居给定的查询点,knnsearch执行以下操作:

  1. 确定该查询点所属的节点。在下面的例子中,查询点(32,90)属于节点4。

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

  3. 选择具有从查询点到的相同距离内的任何区域的所有其他节点ķ日最近点。在这个例子中,只有节点3重叠在查询点为中心,半径等于内节点4为最接近的点之间的距离的实心黑色圆。

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

用一个ķd树对于大数据集少于10个尺寸(列)可以比使用穷举搜索方法更有效,因为knnsearch需要仅计算距离的一个子集。为了最大限度地提高效率ķd树,使用KDTreeSearcher模型。

什么是搜索模型对象?

基本上,模型对象是存储信息的一种方便的方法。相关车型有相关规定的搜索方法值和类型相同的属性。除了模型中存储的信息,您可以对模型的某些操作。

您可以高效地进行ķ-nearest邻居使用您的搜索模式搜索knnsearch。或者,您可以使用搜索模型搜索指定半径内的所有邻居rangesearch。此外,还有一个通用knnsearchrangesearch不创建或使用模型进行搜索的函数。

为了确定模型的哪些类型和搜索方法是最适合你的数据,考虑以下因素:

  • 请问您的数据有很多栏目,说超过10?该ExhaustiveSearcher模型可以更好地执行。

  • 是您的数据稀疏?使用ExhaustiveSearcher模型。

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

    • “seuclidean”

    • “马氏

    • “余弦”

    • “相关性”

    • “斯皮尔曼

    • “汉明”

    • “捷卡”

    • 自定义距离函数

  • 是您的数据集庞大的(但少于10列)?使用KDTreeSearcher模型。

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

分类查询数据

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

  1. 种植ķd树

  2. 在进行ķ使用成年树最近邻搜索。

  3. 分配各查询点的类与它们各自最近的邻居中的最高代表。

分类基础上,费舍尔虹膜数据的最后两列一个新的起点。只使用最后两列可以更容易地绘制。

加载fisheririsX = MEAS(:,3:4);gscatter(X(:,1)中,x(:,2),种)图例(“位置”'最好'

绘制新的点。

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

准备ķd树邻居搜索模式。

MDL = KDTreeSearcher(x)的
MDL = KDTreeSearcher与属性:BucketSize:50距离: '欧几里得' DistParameter:[] X:[150x2双]

MdlKDTreeSearcher模型。默认情况下,它使用搜索邻居的距离度量是欧氏距离。

找出最接近新点的10个样本点。

[n、d] = knnsearch (Mdl newpoint,数k,10);线(X(N,1),X(N,2),'颜色'[5 0.5 0.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.4000 4.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(端);直径= 2 * d(端);%左右绘制的10个最近的邻居一个圆。h =矩形('位置'[CTR,内径,外径]...“曲率”,[1 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 0.5 0.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% setosa 3 30.00%

对于使用更多的例子knnsearch方法和功能,请参阅各参考页。

查找距离最近的邻居使用自定义距离度量

这个例子说明了如何找到三个最近的观测指标在X每一次观察ÿ关于卡方距离。这种距离度量用于对应分析,特别是在生态应用中。

随机生成正态分布的数据到两个矩阵。行数可以变化,但列数必须相等。本例使用2d数据进行绘图。

RNG(1);%用于重现X = randn(50,2);Y = randn(4,2);H =零(3,1);数字;H(1)=图(X(:,1),X(:,2),'BX');持有;H(2)=图(Y(:,1),Y(:,2),'RS'“MarkerSize”,10);标题(“异构数据”

的行Xÿ对应于观察,和列是,一般来说,尺寸(例如,预测器)。

之间的卡方距离Ĵ维点Xž

χ X ž = Ĵ = 1 Ĵ w ^ Ĵ X Ĵ - ž Ĵ 2

哪里 w ^ Ĵ 与尺寸相关的重量Ĵ

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

  • 以作为输入参数的一行X,例如,X和矩阵ž

  • 比较X每一行的ž

  • 返回一个向量d的长度 ñ ž ,其中 ñ ž 是的行数ž。的每个元素d是对应于观测之间的距离X和对应于每行的观察ž

W = [0.4;0.6];chiSqrDist = @(X,Z)SQRT((bsxfun(@减去,X,Z)^ 2)*瓦特);

这个例子使用了任意的权重来进行说明。

找到三个最近观察的指标X每一次观察ÿ

K = 3;[IDX,d] = knnsearch(X,Y,“距离”,chiSqrDist,数k,K);

IDXd是4×3矩阵。

  • IDX(j,1)是最接近的观察行索引X观测Ĵÿ,d(j,1)是他们的距离。

  • idx (j, 2)下一个最近观察到的行索引在哪里X观测Ĵÿ,d(J,2)是他们的距离。

  • 等等。

确定在小区最近的观察结果。

对于J = 1:K;H(3)=积(X(IDX(:,j)中,1),X(IDX(:,J),2),“柯”“MarkerSize”,10);结束图例(H,{'\ texttt {X}''\ texttt {Y}''最近的邻居'},“解释”'胶乳');标题(“异构数据和最近邻”)举行;

若干意见ÿ分享最近的邻居。

验证卡方距离度量等效于欧几里德距离度量,但具有一个可选的缩放参数。

[IdxE,DE] = knnsearch(X,Y,“距离”“seuclidean”数k中,k,...“规模”1. / (sqrt (w)));(sum(Idx ~= IdxE))
AreDiffIdx = 0
AreDiffDist =总和(总和(ABS(d  -  DE)> EPS))
AreDiffDist = 0

三个最近的邻居的两个实现之间的指数和距离实际上是等价的。

ķ为监督学习-Nearest邻分类

ClassificationKNN分类模型,您可以:

按照程序准备你的数据进行分类监督学习的步骤。然后,使用。构造分类器fitcknn

构建KNN分类

这个例子说明了如何构建一个ķ- Fisher虹膜数据的最近邻分类器。

加载费希尔虹膜数据。

加载fisheririsX = MEAS;%用途的所有数据拟合Y =物种;%响应数据

通过构建分类fitcknn

Mdl = fitcknn (X, Y)
{'setosa' 'versicolor' virginica'} ScoreTransform: 'none' NumObservations: 150 Distance: 'euclidean' NumNeighbors: 1个属性、方法

默认ķ-nearest邻居分类只使用一个单一的近邻。通常情况下,一个分类是比这更邻居更稳健。

变更附近尺寸Mdl4,这意味着Mdl四个最近的邻居进行分类。

Mdl.NumNeighbors = 4;

检查KNN分类的质量

这个例子显示了如何检查质量ķ使用resubstitution和交叉验证-nearest邻分类。

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

加载fisheririsX = MEAS;Y =物种;RNG(10);%用于重现MDL = fitcknn(X,Y,“NumNeighbors”,4);

检查resubstitution损失,其中,默认情况下是错误分类从预测分数Mdl。(非默认的成本,重量或先验见失利)。

rloss = resubLoss(MDL)
rloss = 0.0400

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

从构建模型中的交叉验证分类。

CVMdl = crossval (Mdl);

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

KLOSS = kfoldLoss(CVMdl)
KLOSS = 0.0333

交叉验证分类准确度类似于resubstitution准确性。因此,你可以期待Mdl对大约4%的新数据进行误分类,假设新数据与训练数据的分布大致相同。

使用KNN分类器预测分类

这个例子显示了如何预测分类的ķ-nearest邻分类。

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

加载fisheririsX = MEAS;Y =物种;MDL = fitcknn(X,Y,“NumNeighbors”,4);

预测平均花的分类。

FLWR =平均值(X);平均每朵花%flwrClass =预测(MDL,FLWR)
flwrClass =1x1的单元阵列{ '云芝'}

修改资讯分类器

这个例子展示了如何修改ķ-nearest邻分类。

为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)
KLOSS = 0.0333

在本例中,有三个邻居的模型与有四个邻居的模型具有相同的交叉验证损失(参见检查KNN分类的质量)。

修改使用余弦距离,而不是默认,并检查损失模型。要使用余弦距离,你必须使用穷举搜索方法重建模型。

CMDL = fitcknn(X,Y,'NSMethod'“详尽”“距离”“余弦”);CMdl.NumNeighbors = 3;克劳斯= resubLoss(CMDL)
克劳斯= 0.0200

分类器现在有比以前低resubstitution错误。

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

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

CVCMdl具有比一个更好的交叉验证损失CVMdl。然而,在一般情况下,提高了resubstitution错误不一定产生更好的测试样本外预测模型。

也可以看看

|||