主要内容

分类使用最近的邻居

两两距离度量

分类查询点根据距离点的训练数据集可以是一个简单但有效的方法分类的新观点。您可以使用各种指标来确定距离,描述下。使用pdist2找到一组数据和查询点之间的距离。

距离度量

给定一个mx——- - - - - -n数据矩阵X,这被视为mx(1 -n)行向量x1,x2、……xmx和一个我的——- - - - - -n数据矩阵Y,这被视为我的(1 -n)行向量y1,y2、……y我的,各种向量之间的距离x年代yt定义如下:

  • 欧氏距离

    d 年代 t 2 = ( x 年代 y t ) ( x 年代 y t )

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

  • 标准化的欧几里得距离

    d 年代 t 2 = ( x 年代 y t ) V 1 ( x 年代 y t ) ,

    在哪里Vn——- - - - - -n对角矩阵的jth对角线元素是(年代(j))2,在那里年代是一个向量的每个维度的比例因素。

  • Mahalanobis距离

    d 年代 t 2 = ( x 年代 y t ) C 1 ( x 年代 y t ) ,

    在哪里C协方差矩阵。

  • 城市街区的距离

    d 年代 t = j = 1 n | x 年代 j y t j |

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

  • 闵可夫斯基距离

    d 年代 t = j = 1 n | x 年代 j y t j | p p

    的特殊情况p= 1闵可夫斯基距离给出了城市街区距离。的特殊情况p= 2闵可夫斯基距离给出了欧氏距离。的特殊情况p=∞闵可夫斯基距离给Chebychev距离。

  • Chebychev距离

    d 年代 t = 马克斯 j { | x 年代 j y t j | }

    距离Chebychev闵可夫斯基距离是一个特例,在哪里p=∞

  • 余弦距离

    d 年代 t = ( 1 x 年代 y t ( x 年代 x 年代 ) ( y t y t ) )

  • 相关距离

    d 年代 t = 1 ( x 年代 x ¯ 年代 ) ( y t y ¯ t ) ( x 年代 x ¯ 年代 ) ( x 年代 x ¯ 年代 ) ( y t y ¯ t ) ( y t y ¯ t ) ,

    在哪里

    x ¯ 年代 = 1 n j x 年代 j

    y ¯ t = 1 n j y t j

  • 汉明距离

    d 年代 t = ( # ( x 年代 j y t j ) / n )

  • Jaccard距离

    d 年代 t = # ( ( x 年代 j y t j ) ( ( x 年代 j 0 ) ( y t j 0 ) ) ] # ( ( x 年代 j 0 ) ( y t j 0 ) ]

  • 斯皮尔曼的距离

    d 年代 t = 1 ( r 年代 r ¯ 年代 ) ( r t r ¯ t ) ( r 年代 r ¯ 年代 ) ( r 年代 r ¯ 年代 ) ( r t r ¯ t ) ( r t r ¯ t ) ,

    在哪里

    • rsj的排名是xsj接管x1j,x2j,……xmx j所计算的tiedrank

    • rtj的排名是ytj接管y1j,y2j,……y我,我所计算的tiedrank

    • r年代rt的坐标态等级向量x年代yt,也就是说,r年代= (r年代1,r年代2,……rsn),rt= (rt1,rt2,……rtn)。

    • r ¯ 年代 = 1 n j r 年代 j = ( n + 1 ) 2

    • r ¯ t = 1 n j r t j = ( n + 1 ) 2

k最近的邻居搜索和搜索半径

给定一组Xn分和一个距离函数,k最近的邻居(kNN)搜索可以找到k最近的点X查询点或点集Y。的k神经网络搜索技术和kNN-based算法被广泛用作基准学习规则。是相对简单的k神经网络搜索技术使它容易从其他分类技术比较结果k神经网络的结果。这项技术已经用于各个领域,如:

  • 生物信息学

  • 图像处理和数据压缩

  • 文档检索

  • 计算机视觉

  • 多媒体数据库

  • 营销数据分析

您可以使用k神经网络搜索其他机器学习算法,如:

  • k神经网络分类

  • 局部加权回归

  • 缺失的数据归责和插值

  • 密度估计

您还可以使用k神经网络搜索与许多基于距离的学习功能,如k - means聚类。

相反,积极的真正价值r,rangesearch找到所有点X在一个距离r每一个点的Y。这个fixed-radius搜索是密切相关的k神经网络搜索,因为它支持相同的距离万博1manbetx度量和搜索类,并使用相同的搜索算法。

k最近的邻居搜索使用的搜索

当你输入数据符合下列标准,knnsearch默认使用穷举搜索方法找到的k最近的邻居:

  • 列的数量X超过了10个。

  • X是稀疏的。

  • 距离度量是:

    • “seuclidean”

    • “mahalanobis”

    • 的余弦

    • “相关”

    • “枪兵”

    • “汉明”

    • “jaccard”

    • 一个自定义距离函数

knnsearch还使用穷举搜索方法如果你搜索对象是一个ExhaustiveSearcher模型对象。穷举搜索方法找到每个查询点每个点的距离X,排名以升序排序,并返回k点的最小距离。例如,这张图显示了k= 3最近的邻居。

3-nearest邻居图。knnsearch计算显示的距离使用穷举搜索方法。

k最近的邻居搜索使用Kd-Tree

当你输入数据符合以下标准,knnsearch创建一个Kd-tree默认情况下找到k最近的邻居:

  • 列的数量X小于10。

  • X不是稀疏。

  • 距离度量是:

    • “欧几里得”(默认)

    • “cityblock”

    • 闵可夫斯基的

    • “chebychev”

knnsearch还使用了一个Kd-tree如果你搜索对象是一个KDTreeSearcher模型对象。

Kd树节点将数据划分为最多BucketSize(默认值是50)分节点,基于坐标(相对于类别)。下面的图表说明了这个概念补丁物体颜色代码不同的“桶”。

图的数据分为kd tree节点

当你想要找到的k给定查询点最近的邻居,knnsearch以下:

  1. 决定了节点查询点所属。在接下来的例子中,查询点(90)属于节点4。

  2. 找到最接近的k点在这个节点及其距离查询点。在接下来的例子中,红圈是等距的点查询点,并在节点查询点最近的点4。

  3. 选择所有其他节点在任何领域都是在相同的距离,在任何方向,从查询点的k最近的点。在本例中,只有节点3重叠固体黑色圆在查询点为中心半径等于节点4内距离最近的点。

  4. 搜索节点范围内任何点接近查询点。在下面的例子中,在红场稍微接近点查询点比内节点4。

图的节点和最近的邻居

使用一个Kd-tree少于10维的大型数据集(列)可以比使用穷举搜索方法,更有效knnsearch只需要计算距离的一个子集。最大化的效率Kd树,使用KDTreeSearcher模型。

搜索模型对象是什么?

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

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

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

  • 你的数据有许多列,说超过10 ?的ExhaustiveSearcher模型可以表现的更好。

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

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

    • “seuclidean”

    • “mahalanobis”

    • 的余弦

    • “相关”

    • “枪兵”

    • “汉明”

    • “jaccard”

    • 一个自定义距离函数

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

  • 你是寻找大量的查询点最近的邻居吗?使用KDTreeSearcher模型。

分类查询数据

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

  1. 种植Kd-tree

  2. 进行一项k最近邻搜索使用生长的树。

  3. 分配每个查询点最高的类表示在各自最近的邻居。

分类的新观点基于的最后两列费舍尔虹膜数据。只使用最后两列使情节更容易。

负载fisheririsx =量(:,3:4);gscatter (x (: 1) x(:, 2),物种)传说(“位置”,“最佳”)

图包含一个坐标轴对象。坐标轴对象包含3线类型的对象。杂色的,这些对象代表setosa virginica。

情节的新观点。

newpoint = 1.45 [5];线(newpoint (1) newpoint (2),“标记”,“x”,“颜色”,“k”,“markersize”10“线宽”,2)

图包含一个坐标轴对象。坐标轴对象包含4线类型的对象。杂色的,这些对象代表setosa virginica。

准备一个Kd-tree邻居搜索模型。

Mdl = KDTreeSearcher (x)
Mdl = KDTreeSearcher属性:BucketSize: 50距离:“欧几里得”DistParameter: [] X: [150 x2双)

Mdl是一个KDTreeSearcher模型。默认情况下,它使用的距离度量搜索邻居是欧几里得距离。

找到最近的10个采样点的新观点。

[n、d] = knnsearch (Mdl newpoint,“k”10);线(x (n, 1), x (n, 2),“颜色”,(。5。5。5),“标记”,“o”,“线型”,“没有”,“markersize”,10)

图包含一个坐标轴对象。坐标轴对象包含5线类型的对象。杂色的,这些对象代表setosa virginica。

看来,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.7000 1.5000

使轴相等的距离计算对应于图轴上的明显的距离相等,放大看邻居更好。

xlim ([4.5 - 5.5]);ylim ([1 - 2]);轴广场

图包含一个坐标轴对象。坐标轴对象包含5线类型的对象。杂色的,这些对象代表setosa virginica。

找到10邻居的物种。

汇总(物种(n))
值计算百分比virginica 2 20.00%多色的8 80.00%

使用规则基础上的多数投票10最近的邻居,你可以将这个新一点杂色的。

视觉识别周围的邻居们画一个圆,群。定义一个圆的中心,直径,基于新的点的位置。

ctr = newpoint - d(结束);直径= 2 * d(结束);% 10最近的邻居周围画一个圆。h =矩形(“位置”(ctr,直径,直径),“弯曲”[1]);h。线型=“:”;

图包含一个坐标轴对象。坐标轴对象包含6行类型的对象,长方形。杂色的,这些对象代表setosa virginica。

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

图newpoint2 = [5 1.45; 6 2; 2.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,“线型”,“没有”)

图包含一个坐标轴对象。坐标轴对象包含5线类型的对象。杂色的,这些对象代表setosa virginica。

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

汇总(物种(n2 (1,:)))
值计算百分比virginica 2 20.00%多色的8 80.00%
汇总(物种(n2 (2:)))
值数百分比virginica 10 100.00%
汇总(物种(n2 (3,:)))
值计算百分比杂色的7 70.00% setosa 3 30.00%

更多的例子使用knnsearch方法和功能,查看个人参考页。

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

这个例子展示了如何找到三个最近的观察的指标X每个观测Y对卡方距离。这个距离度量对应分析中使用,特别是在生态应用程序。

随机产生两个矩阵正态分布数据。的行数可以不同,但列数必须相等。这个示例使用二维绘图的数据。

rng (1)%的再现性X = randn (50, 2);Y = randn (4,2);h = 0 (3,1);图h(1) =阴谋(X (: 1), (:, 2),“软”);持有h(2) =情节(Y (: 1), Y (:, 2),“rs”,“MarkerSize”10);标题(异构数据的)

图包含一个坐标轴对象。轴与标题异构数据对象包含2线类型的对象。

的行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);

idxD4-by-3矩阵。

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

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

  • 等等。

确定最近的观察的阴谋。

j = 1: k h(3) =情节(X (Idx (:, j), 1), X (Idx (:, j), 2),“柯”,“MarkerSize”10);结束传奇(h, {“\ texttt {X}’,“\ texttt {Y}’,“最近邻”},“翻译”,“乳胶”)标题(的异构数据和最近的邻居的)举行

图包含一个坐标轴对象。坐标轴对象与标题异构数据和最近的邻居包含5线类型的对象。这些对象代表\ texttt {X} \ texttt {Y},最近的邻居。

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

验证卡方距离度量相当于欧氏距离度量,但有一个可选的尺度参数。

[IdxE, DE] = knnsearch (X, Y,“距离”,“seuclidean”,“k”、钾、“规模”1. / (sqrt (w)));AreDiffIdx =总和(sum (Idx ~ = IdxE))
AreDiffIdx = 0
AreDiffDist =总和(总和(abs (D - DE) > eps))
AreDiffDist = 0

指标和三个最近的邻居的两个实现之间的距离几乎是等价的。

K最近的邻居为监督学习分类

ClassificationKNN分类模型可以让您:

准备你的数据分类的过程在监督学习步骤。然后,构造分类器使用fitcknn

构建资讯分类器

这个例子展示了如何构建一个k最近的邻居费舍尔虹膜数据的分类器。

加载费舍尔虹膜数据。

负载fisheririsX =量;%利用所有数据拟合Y =物种;%响应数据

构造分类器使用fitcknn

Mdl = fitcknn (X, Y)
Mdl = ClassificationKNN ResponseName:‘Y’CategoricalPredictors:[]类名:{“setosa”“杂色的”“virginica”} ScoreTransform:“没有一个”NumObservations: 150距离:“欧几里得”NumNeighbors: 1属性,方法

一个默认的k最近的邻居分类器只使用一个单一的最近邻。通常,一个标识符是比这更健壮的更多的邻居。

改变社区的大小Mdl4,这意味着Mdl分类使用四个最近的邻居。

Mdl。NumNeighbors = 4;

检查质量资讯分类器

这个例子展示了如何检查的质量k最近的邻居分类器使用resubstitution和交叉验证。

构造一个资讯的费舍尔虹膜数据作为分类器构建资讯分类器

负载fisheririsX =量;Y =物种;rng (10);%的再现性Mdl = fitcknn (X, Y,“NumNeighbors”4);

检查resubstitution损失,默认情况下,是预测的错误分类的一部分Mdl。(默认的成本、重量、或先知先觉,明白了损失)。

rloss = resubLoss (Mdl)
rloss = 0.0400

分类器预测为4%的训练数据不正确。

建立一个旨在分类器的模型。

CVMdl = crossval (Mdl);

检查交叉验证的损失,这是每个交叉验证模型在预测的平均损失数据,不用于培训。

克劳斯= kfoldLoss (CVMdl)
克劳斯= 0.0333

旨在分类精度与resubstitution精度。因此,你可以预期Mdl分类大约有4%的新数据,假设新的数据作为训练数据有相同的分布。

使用资讯分类器预测分类

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

构造一个资讯的费舍尔虹膜数据作为分类器构建资讯分类器

负载fisheririsX =量;Y =物种;Mdl = fitcknn (X, Y,“NumNeighbors”4);

预测的分类平均花。

flwr =意味着(X);%的平均花flwr flwrClass =预测(Mdl)
flwrClass =1 x1单元阵列{“癣”}

修改资讯分类器

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

构造一个资讯的费舍尔虹膜数据作为分类器构建资讯分类器

负载fisheririsX =量;Y =物种;Mdl = fitcknn (X, Y,“NumNeighbors”4);

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

Mdl。NumNeighbors = 3;

比较resubstitution预测和交叉验证损失与新邻居的数量。

损失= resubLoss (Mdl)
损失= 0.0400
rng (10);%的再现性CVMdl = crossval (Mdl,“KFold”5);克劳斯= kfoldLoss (CVMdl)
克劳斯= 0.0333

在这种情况下,模型有三个邻居有相同的旨在损失模型有四个邻居(见检查质量资讯分类器)。

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

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错误并不一定产生一个更好的测试样本的预测模型。

另请参阅

|||