主要内容

使用最近邻进行分类

两两距离度量

根据查询点与训练数据集中点的距离对查询点进行分类是一种简单而有效的新点分类方法。您可以使用各种度量来确定距离,下面将进行描述。使用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最近的邻居(k搜索让你找到k最近的点X到一个查询点或一组点Y.的k神经网络搜索技术k基于神经网络的算法被广泛应用于基准学习规则。相对简单的k神经网络搜索技术使其他分类技术的结果易于比较k神经网络的结果。该技术已被用于各个领域,如:

  • 生物信息学

  • 图像处理和数据压缩

  • 文档检索

  • 计算机视觉

  • 多媒体数据库

  • 营销数据分析

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

  • k神经网络分类

  • 局部加权回归

  • 缺失的数据输入和插值

  • 密度估计

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

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

k使用穷举搜索的最近邻搜索

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

  • 的列数X大于10。

  • X是稀疏的。

  • 距离度量是:

    • “seuclidean”

    • “mahalanobis”

    • 的余弦

    • “相关”

    • “枪兵”

    • “汉明”

    • “jaccard”

    • 自定义距离函数

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

k-最近邻搜索Kd-Tree

当您的输入数据满足以下所有条件时,knnsearch创建一个KD-tree默认查找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树,使用KDTreeSearcher模型。

什么是搜索模型对象?

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

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

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

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

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

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

    • “seuclidean”

    • “mahalanobis”

    • 的余弦

    • “相关”

    • “枪兵”

    • “汉明”

    • “jaccard”

    • 自定义距离函数

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

  • 您是否在大量查询点中搜索最近的邻居?使用KDTreeSearcher模型。

分类查询数据

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

  1. 种植Kd-tree

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

  3. 为每个查询点分配在其最近邻中具有最高表示的类。

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

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

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

画出新的点。

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

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

准备一个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的对象。这些物品代表着维珍卡。

看来,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(end); / /结束直径= 2 * d(结束);在10个最近的邻居周围画一个圈。h =矩形(“位置”(ctr,直径,直径),...“弯曲”[1]);h.LineStyle =“:”

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

使用相同的数据集,找到三个新点的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的对象。这些物品代表着维珍卡。

为每个新点找出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);标题(异构数据的

图中包含一个轴对象。标题为异构数据的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);

idxD4-by-3矩阵。

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

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

  • 等等。

在图中找出最近的观测结果。

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

图中包含一个轴对象。标题为“异构数据和最近邻居”的axis对象包含5个类型为line的对象。这些对象表示\text {X}, \text {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

构建资讯分类器

这个例子展示了如何构造一个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分类器只使用一个最近邻。通常,一个分类器有更多的邻居会更健壮。

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

Mdl。NumNeighbors = 4;

KNN分类器的质量检验

这个例子展示了如何检查一个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%的新数据进行错误分类,假设新数据与训练数据具有相同的分布。

使用KNN分类器预测分类

这个例子展示了如何预测一个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.然而,一般来说,改进再替代错误并不一定会产生一个具有更好的测试样本预测的模型。

另请参阅

|||