分类使用最近的邻居
两两距离度量
分类查询点根据距离点的训练数据集可以是一个简单但有效的方法分类的新观点。您可以使用各种指标来确定距离,描述下。使用pdist2
找到一组数据和查询点之间的距离。
距离度量
给定一个mx——- - - - - -n数据矩阵X,这被视为mx(1 -n)行向量x1,x2、……xmx和一个我的——- - - - - -n数据矩阵Y,这被视为我的(1 -n)行向量y1,y2、……y我的,各种向量之间的距离x年代和yt定义如下:
欧氏距离
的欧几里得距离是一个特例闵可夫斯基距离,p= 2。
标准化的欧几里得距离
在哪里V是n——- - - - - -n对角矩阵的jth对角线元素是(年代(j))2,在那里年代是一个向量的每个维度的比例因素。
Mahalanobis距离
在哪里C协方差矩阵。
城市街区的距离
城市街区的距离是一个特例的闵可夫斯基距离,p= 1。
闵可夫斯基距离
的特殊情况p= 1闵可夫斯基距离给出了城市街区距离。的特殊情况p= 2闵可夫斯基距离给出了欧氏距离。的特殊情况p=∞闵可夫斯基距离给Chebychev距离。
Chebychev距离
距离Chebychev闵可夫斯基距离是一个特例,在哪里p=∞。
余弦距离
相关距离
在哪里
和
汉明距离
Jaccard距离
斯皮尔曼的距离
在哪里
k最近的邻居搜索和搜索半径
给定一组X的n分和一个距离函数,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最近的邻居。
k最近的邻居搜索使用Kd-Tree
当你输入数据符合以下标准,knnsearch
创建一个Kd-tree默认情况下找到k最近的邻居:
列的数量
X
小于10。X
不是稀疏。距离度量是:
“欧几里得”
(默认)“cityblock”
闵可夫斯基的
“chebychev”
knnsearch
还使用了一个Kd-tree如果你搜索对象是一个KDTreeSearcher
模型对象。
Kd树节点将数据划分为最多BucketSize
(默认值是50)分节点,基于坐标(相对于类别)。下面的图表说明了这个概念补丁
物体颜色代码不同的“桶”。
当你想要找到的k给定查询点最近的邻居,knnsearch
以下:
决定了节点查询点所属。在接下来的例子中,查询点(90)属于节点4。
找到最接近的k点在这个节点及其距离查询点。在接下来的例子中,红圈是等距的点查询点,并在节点查询点最近的点4。
选择所有其他节点在任何领域都是在相同的距离,在任何方向,从查询点的k最近的点。在本例中,只有节点3重叠固体黑色圆在查询点为中心半径等于节点4内距离最近的点。
搜索节点范围内任何点接近查询点。在下面的例子中,在红场稍微接近点查询点比内节点4。
使用一个Kd-tree少于10维的大型数据集(列)可以比使用穷举搜索方法,更有效knnsearch
只需要计算距离的一个子集。最大化的效率Kd树,使用KDTreeSearcher
模型。
搜索模型对象是什么?
基本上,模型对象存储信息的一种方便的方法。相关的模型有相同的属性和值和类型与指定的搜索方法。除了存储信息模型,可以对模型执行某些操作。
你可以有效地执行k最近的邻居搜索搜索模型使用knnsearch
。或者,您可以搜索所有邻居使用搜索模型和一个指定半径内rangesearch
。此外,还有通用的knnsearch
和rangesearch
函数,搜索不创建或使用一个模型。
确定哪些类型的模型和搜索方法是最适合您的数据,考虑以下:
你的数据有许多列,说超过10 ?的
ExhaustiveSearcher
模型可以表现的更好。你的数据稀疏的吗?使用
ExhaustiveSearcher
模型。你想使用一个距离度量来找到最近的邻居?使用
ExhaustiveSearcher
模型。“seuclidean”
“mahalanobis”
的余弦
“相关”
“枪兵”
“汉明”
“jaccard”
一个自定义距离函数
是你的巨大的数据集(但少于10列)?使用
KDTreeSearcher
模型。你是寻找大量的查询点最近的邻居吗?使用
KDTreeSearcher
模型。
分类查询数据
这个例子展示了如何分类查询数据:
种植Kd-tree
进行一项k最近邻搜索使用生长的树。
分配每个查询点最高的类表示在各自最近的邻居。
分类的新观点基于的最后两列费舍尔虹膜数据。只使用最后两列使情节更容易。
负载fisheririsx =量(:,3:4);gscatter (x (: 1) x(:, 2),物种)传说(“位置”,“最佳”)
情节的新观点。
newpoint = 1.45 [5];线(newpoint (1) newpoint (2),“标记”,“x”,“颜色”,“k”,…“markersize”10“线宽”,2)
准备一个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)
看来,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]);轴广场
找到10邻居的物种。
汇总(物种(n))
值计算百分比virginica 2 20.00%多色的8 80.00%
使用规则基础上的多数投票10最近的邻居,你可以将这个新一点杂色的。
视觉识别周围的邻居们画一个圆,群。定义一个圆的中心,直径,基于新的点的位置。
ctr = newpoint - d(结束);直径= 2 * d(结束);% 10最近的邻居周围画一个圆。h =矩形(“位置”(ctr,直径,直径),…“弯曲”[1]);h。线型=“:”;
使用相同的数据集,发现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,“线型”,“没有”)
找到最近的邻居为每个新物种的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);标题(异构数据的)
的行X
和Y
对应于观测,列是,一般来说,尺寸(例如,预测)。
卡方距离之间j维点x和z是
在哪里 重量与尺寸有关吗j。
为每个维度选择权重,并指定卡方距离函数。距离函数必须:
取一行作为输入参数
X
,例如,x
,矩阵Z
。比较
x
每一行的Z
。返回一个向量
D
的长度 ,在那里 的行数Z
。的每个元素D
相对应的观测之间的距离吗x
和每一行对应的观测Z
。
w = (0.4;0.6);chiSqrDist = @ x, Z)√(((x Z) ^ 2) * w);
这个示例使用任意的权重插图。
找到三个最近的观察的指标X
每个观测Y
。
k = 3;[Idx D] = knnsearch (X, Y,“距离”chiSqrDist,“k”、k);
idx
和D
4-by-3矩阵。
idx (j, 1)
最近的观察的行索引吗X
来观察j的Y
,D (j, 1)
是他们的距离。idx (j, 2)
是下一个最近的观察的行索引X
来观察j的Y
,D (j, 2)
是他们的距离。等等。
确定最近的观察的阴谋。
为j = 1: k h(3) =情节(X (Idx (:, j), 1), X (Idx (:, j), 2),“柯”,“MarkerSize”10);结束传奇(h, {“\ 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
分类模型可以让您:
构建资讯分类器
这个例子展示了如何构建一个k最近的邻居费舍尔虹膜数据的分类器。
加载费舍尔虹膜数据。
负载fisheririsX =量;%利用所有数据拟合Y =物种;%响应数据
构造分类器使用fitcknn
。
Mdl = fitcknn (X, Y)
Mdl = ClassificationKNN ResponseName:‘Y’CategoricalPredictors:[]类名:{“setosa”“杂色的”“virginica”} ScoreTransform:“没有一个”NumObservations: 150距离:“欧几里得”NumNeighbors: 1属性,方法
一个默认的k最近的邻居分类器只使用一个单一的最近邻。通常,一个标识符是比这更健壮的更多的邻居。
改变社区的大小Mdl
来4
,这意味着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错误并不一定产生一个更好的测试样本的预测模型。