主要内容

使用最近邻进行分类

成对距离度量

根据查询点与训练数据集中点的距离对查询点进行分类是一种简单而有效的分类新点的方法。您可以使用各种指标来确定距离,下面将介绍。使用pdist2求一组数据与查询点之间的距离。

距离度量

给定一个mx——- - - - - -n数据矩阵X,则视为mx(1 -n)行向量x1x2、……xmx,以及我的——- - - - - -n数据矩阵Y,则视为我的(1 -n)行向量y1y2、……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对角矩阵j第Th对角线元素为年代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距离

    d 年代 t 马克斯 j | x 年代 j y t j |

    切比雪夫距离是闵可夫斯基距离的一种特殊情况,其中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

    在哪里

    • rsjxsj接管x1jx2j,……xmx j,按tiedrank

    • rtjytj接管y1jy2j,……y我,我,按tiedrank

    • r年代而且rt的坐标秩向量是x年代而且yt,也就是说,r年代= (r年代1r年代2,……rsn),rt= (rt1rt2,……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神经网络搜索技术k基于神经网络的算法被广泛用作基准学习规则。的相对简单性k神经网络搜索技术可以很容易地将其他分类技术的结果进行比较k神经网络的结果。该技术已应用于各个领域,如:

  • 生物信息学

  • 图像处理和数据压缩

  • 文档检索

  • 计算机视觉

  • 多媒体数据库

  • 营销数据分析

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

  • k神经网络分类

  • 局部加权回归

  • 缺失的数据输入和插值

  • 密度估计

你也可以使用k具有许多基于距离的学习功能的神经网络搜索,如K-means聚类。

相反,对于正的实际值rrangesearch找到所有的点X都在一段距离内r的每一点Y.这种固定半径搜索与k神经网络搜索,因为它支持相同的距离金宝app度量和搜索类,并使用相同的搜索算法。

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也使用了K如果你的搜索对象是KDTreeSearcher模型对象。

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

当你想找到k-与给定查询点最近的邻居,knnsearch做以下事情:

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

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

  3. 选择从查询点到节点在任何方向上具有相同距离的任何区域的所有其他节点k最近的点。在本例中,只有节点3与以查询点为中心的黑色实心圆重叠,其半径等于到节点4中最近点的距离。

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

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

什么是搜索模型对象?

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

你可以有效地执行k-最近邻搜索你的搜索模型使用knnsearch.或者,您可以使用搜索模型和搜索指定半径内的所有邻居rangesearch.此外,还有一种通用knnsearch而且rangesearch无需创建或使用模型进行搜索的函数。

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

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

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

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

    • “seuclidean”

    • “mahalanobis”

    • 的余弦

    • “相关”

    • “枪兵”

    • “汉明”

    • “jaccard”

    • 自定义距离函数

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

  • 您正在为大量的查询点搜索最近的邻居吗?使用KDTreeSearcher模型。

分类查询数据

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

  1. 种植Kd-tree

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

  3. 为每个查询点分配在它们各自最近的邻居中具有最高表示的类。

根据Fisher虹膜数据的最后两列对一个新点进行分类。只使用最后两列可以使绘图更容易。

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

图中包含一个轴对象。axis对象包含3个line类型的对象。这些物品代表了setosa, versicolica, virgica。

画出新的点。

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

图中包含一个轴对象。axis对象包含4个line类型的对象。这些物品代表了setosa, versicolica, virgica。

准备一个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)

图中包含一个轴对象。axis对象包含5个line类型的对象。这些物品代表了setosa, versicolica, virgica。

看来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 4.4000 4.7000 1.7000 1.5000

使坐标轴相等,以便计算的距离对应于绘图轴上相等的表观距离,并放大以更好地看到邻居。

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

图中包含一个轴对象。axis对象包含5个line类型的对象。这些物品代表了setosa, versicolica, virgica。

找出10个相邻的物种。

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

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

在邻居周围画一个圈,从视觉上识别他们。根据新点的位置,定义圆的中心和直径。

CTR = newpoint - d(end);直径= 2*d(端);在最近的10个邻居周围画一个圈。H =矩形(“位置”(ctr,直径,直径),...“弯曲”[1]);h.LineStyle =“:”

图中包含一个轴对象。axis对象包含6个类型为直线、矩形的对象。这些物品代表了setosa, versicolica, virgica。

使用相同的数据集,找到三个新点的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,“线型”“没有”

图中包含一个轴对象。axis对象包含5个line类型的对象。这些物品代表了setosa, versicolica, virgica。

找出每个新点的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关于卡方距离。这种距离度量用于对应分析,特别是在生态应用中。

随机生成正态分布数据到两个矩阵中。行数可以变化,但列数必须相等。本例使用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) = plot(Y(:,1),Y(:,2),,“rs”“MarkerSize”10);标题(异构数据的

图中包含一个轴对象。标题为Heterogeneous Data的axes对象包含2个类型为line的对象。

一排排的X而且Y对应于观察结果,列通常是维度(例如,预测器)。

之间的卡方距离j维点x而且z

χ 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, c, c, c)“距离”chiSqrDist,“k”、k);

idx而且D都是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(Idx(:,j),1),X(Idx(:,j),2),“柯”“MarkerSize”10);结束传奇(h, {“\ texttt {X}’“\ texttt {Y}’“最近邻”},“翻译”“乳胶”)标题(“异构数据和最近邻居”)举行

图中包含一个轴对象。标题为异构数据和最近邻的axis对象包含5个类型为line的对象。这些对象表示\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分类模型让你:

准备你的数据分类根据程序监督学习的步骤.然后,使用构造分类器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 Distance: 'euclidean' NumNeighbors: 1 Properties, Methods

一个默认的k-最近邻分类器只使用单个最近邻。通常,当一个分类器拥有更多的邻居时,它会更加健壮。

的邻域大小Mdl4,这意味着Mdl使用四个最近的邻居进行分类。

Mdl。NumNeighbors = 4;

KNN分类器的质量检验

的质量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(cvdl)
Kloss = 0.0333

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

使用KNN分类器预测分类

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

对Fisher虹膜数据构造KNN分类器,如构造KNN分类器

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

预测一朵普通花的分类。

flwr = mean(X);一朵普通的花flwrClass = predict(Mdl,flwr)
flwrClass =1x1单元阵列{“癣”}

修改KNN分类器

此示例显示如何修改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(cvdl)
Kloss = 0.0333

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

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

CMdl = fitcknn(X,Y,“NSMethod”“详尽”“距离”的余弦);CMdl。NumNeighbors = 3;closs = resubLoss(CMdl)
克洛斯= 0.0200

分类器的重替换误差比以前更低。

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

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

CVCMdl有更好的交叉验证损失吗CVMdl.然而,一般来说,改善再替代误差并不一定会产生具有更好的测试样本预测的模型。

另请参阅

|||