主要内容

knnsearch

k使用Searcher对象的最佳邻居

描述

例子

idx.= knnsearch(MDL.Y在中搜索最近的邻居(即最近的点、行或观察值)mdl.x.查询数据中的每个点(即行或观察)Y使用详尽的搜索或一个KD树。knnsearch返回idx.,这是指数的列向量mdl.x.代表最近的邻居。

例子

idx.= knnsearch(MDL.Y名称,价值返回最接近点的指数mdl.x.Y具有一个或多个指定的其他选项名称,价值对参数。例如,指定要搜索的最近邻居的数量,距离度量与存储的距离不同mdl.distance..如果最接近的距离绑定,您还可以指定要采取的操作。

例子

idx.D) = knnsearch (___另外返回矩阵D使用前面语法中的任何输入参数。D包含每个观测值之间的距离Y这对应于最近的观察mdl.x..默认情况下,该函数安排列D按升序通过接近,相对于距离度量。

例子

全部收缩

knnsearch接受令人疲惫的或者kdtreesearcher.模型对象,用于搜索最近邻居的训练数据到查询数据。一个令人疲惫的模型调用详尽的搜索者算法,以及一个kdtreesearcher.模型定义A.KD树,哪个knnsearch用于搜索最近的邻居。

载入费雪的虹膜数据集。从数据中随机保留5个观察值作为查询数据。

负载渔民rng (1);重复性的%1) n =大小(量;idx = randsample (n, 5);X =量(~ ismember (1: n, idx):);%培训数据y = meas(idx,:);%查询数据

变量包含4个预测因子。

生长默认的四维KD树。

MdlKDT = KDTreeSearcher (X)
MdlKDT = KDTreeSearcher with properties: BucketSize: 50 Distance: 'euclidean' DistParameter: [] X: [145x4 double]

mdlkdt.是A.kdtreesearcher.模型对象。您可以使用点表示法更改其可写属性。

准备一个详尽的最近邻搜索。

mdles = utifiventsearcher(x)
mdles =具有属性的令人疲劳性研究员:距离:'euclidean'distparameter:[] x:[145x4双]

mdlkdt.是一个令人疲惫的模型对象。它包含选项,例如距离度量,用于查找最近的邻居。

或者,你可以成长一个KD-Tree或准备详尽的最近邻搜索者创造

搜索对应于每个查询观察的最近邻居索引的培训数据。使用默认设置进行两种类型的搜索。默认情况下,每个查询观察搜索的邻居数量是1

Idxkdt = knnsearch(mdlkdt,y);Idxes = knnsearch(mdles,y);[IDXKDT IDXES]
ans =.5×217 17 6 6 1 1 89 89 124 124

在这种情况下,搜索结果是相同的。

种植KD-Tree最近的邻居搜索器对象通过使用创造函数。将对象和查询数据传递给knnsearch找到的功能k最近的邻居。

载入费雪的虹膜数据集。

负载渔民

从预测器数据随机删除五个虹膜以用作查询集。

rng (1);重复性的%1) n =大小(量;%样本大小qidx = randsample(n,5);%查询数据索引tidx =〜ismember(1:n,qidx);%训练数据指标Q =量(qIdx:);X =量(tIdx:);

长四维KD-Tree使用培训数据。指定Minkowski距离查找最近的邻居。

mdl = createns(x,'距离''minkowski'
Mdl = KDTreeSearcher with properties: BucketSize: 50 Distance: 'minkowski' DistParameter: 2 X: [145x4 double]

因为X有四列,距离度量是minkowski,创造创造一个kdtreesearcher.默认情况下模型对象。Minkowski距离指数是2默认情况下。

找到培训数据的指标(mdl.x.)是查询数据中每个点的两个最近邻居()。

idxnn = knnsearch(mdl,q,'K'2)
idxnn =.5×217 4 6 2 1 12 89 66 124 100

每一排idxnn.对应于查询数据观察,并且列顺序对应于相对于升高距离的最近邻居的顺序。例如,基于Minkowski距离,第二个最近的邻居q(3,:): X(12日)

载入费雪的虹膜数据集。

负载渔民

从预测器数据随机删除五个虹膜以用作查询集。

rng (4);重复性的%1) n =大小(量;%样本大小qidx = randsample(n,5);%查询数据索引X =量(~ ismember (1: n, qIdx):);: Y =量(qIdx);

长四维KD-Tree使用培训数据。指定Minkowski距离查找最近的邻居。

mdl = kdtreesearcher(x);

MDL.是A.kdtreesearcher.模型对象。默认情况下,查找最近邻居的距离度量是欧几里德度量标准。

找到培训数据的指标(X),即查询数据中每个点最近的7个邻居(Y)。

[Idx D] = knnsearch (Mdl Y'K'7“IncludeTies”,真的);

idx.D是载体的五元素电池阵列,每个载体具有至少七个元素。

显示矢量的长度idx.

cellfun ('长度',IDX)
ans =.5×18 7 7 7 7

因为细胞1包含长度大于的向量k= 7,查询观察1(Y (1:))同样接近至少两个观察X

显示最近邻居的索引Y (1:)他们的距离。

nn5 = idx {1}
nn5 =1×8.91 98 67 69 71 93 88 95
nn5d = d {1}
nn5d =1×8.0.1414 0.2646 0.2828 0.340 0.3464 0.3742 0.3873 0.3873

培训观察88.95.距查询观察0.3873厘米1

火车二kdtreesearcher.模型使用不同的距离度量,并进行比较k用于两种型号的查询数据的最佳邻居。

载入费雪的虹膜数据集。将花瓣测量视为预测因子。

负载渔民X = MEAS(:,3:4);%预测因子y =物种;% 回复

训练kdtreesearcher.使用预测器模型对象。用指数5指定Minkowski距离。

KDTreeMdl = KDTreeSearcher (X,'距离''minkowski'“P”5)
KDTReeMDL = KDTreeSearcher具有属性:Bucketsize:50距离:'Minkowski'DistParameter:5 x:[150x2双]

找出10个最近的邻居X查询点(纽波特),首先使用Minkowski然后使用Chybochev距离指标。查询点必须具有与用于培训模型的数据相同的列维度。

newpoint = [5 1.45];[idxmk,dmk] = knnsearch(kdtreemdl,newpoint,'K',10);[idxcb,dcb] = knnsearch(kdtreemdl,newpoint,'K'10,'距离'“chebychev”);

IDXMK.IdxCb1 × 10矩阵是否包含行索引X对应于最近的邻居纽波特使用Minkowski和Chebychev距离。元素(1,1)是最近的,元素(1,2)是下一个最近的,等等。

绘制训练数据、查询点和最近的邻居。

图;gscatter (X (: 1) X (:, 2), Y);标题('fisher'的虹膜数据 - 最近的邻居');包含('花瓣长度(cm)');ylabel('花瓣宽度(cm)');抓住plot(newpoint(1),newpoint(2),'kx''Markersize'10,'行宽',2);%查询点绘图(x(idxmk,1),x(idxmk,2),“o”'颜色',[。5 .5 .5],'Markersize',10);%Minkowski最近的邻居绘图(x(idxcb,1),x(idxcb,2),“p”'颜色',[。5 .5 .5],'Markersize',10);%chebychev最近的邻居传奇('setosa''versicolor''virginica''query point'......'minkowski'“chebychev”'地点'“最佳”);

图包含轴。具有标题Fisher的虹膜数据的轴 - 最近的邻居包含6个类型的线路。这些对象代表setosa,versicolor,virginica,查询点,minkowski,chebychev。

放大兴趣点。

H = GCA;%获取当前轴手柄。H.XLIM = [4.5 5.5];H.YLIM = [1 2];轴广场

图包含轴。具有标题Fisher的虹膜数据的轴 - 最近的邻居包含6个类型的线路。这些对象代表setosa,versicolor,virginica,查询点,minkowski,chebychev。

几个观察是相等的,这就是为什么在图中只识别了八个最近邻居的原因。

输入参数

全部收缩

最近的邻居搜索者,指定为一个令人疲惫的或者kdtreesearcher.模型对象分别。

如果MDL.是一个令人疲惫的模型,然后knnsearch使用详尽的搜索搜索最近的邻居。除此以外,knnsearch使用成长KD树搜索最近的邻居。

查询数据,指定为数字矩阵。

Y是一个-经过-K矩阵。行Y对应观察(例如,例子),列对应预测(例如,变量或特征)。Y必须具有与存储的培训数据相同数量的列mdl.x.

数据类型:单身的|双倍的

名称值对参数

指定可选的逗号分隔的对名称,价值论点。姓名参数名和价值是相应的价值。姓名必须出现在引号内。您可以以任何顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:'k',2,'距离','minkowski'指定找到两个最近的邻居mdl.x.每个点Y并使用Minkowski距离度量。
对于最近的邻居搜索者

全部收缩

距离度量用来寻找训练数据到查询观测值的邻居,指定为逗号分隔对组成'距离'以及字符向量、字符串标量或函数句柄。

对于这两种最近邻搜索器,knnsearch万博1manbetx支持这些距离指标。

价值 描述
“chebychev” 切比切夫距离(最大坐标差)。
'城市街区' 城市街区距离。
'euclidean' 欧几里德距离。
'minkowski' 闵可夫斯基距离。默认指数是2。要指定不同的指数,请使用“P”名称-值对的论点。

如果MDL.是一个令人疲惫的模型对象,然后knnsearch还支持这些万博1manbetx距离指标。

价值 描述
'相关性' 一个减去观察之间的样本线性相关性(作为值序列处理)。
的余弦 1减去观测值之间夹角的余弦值(作为行向量)。
“汉明” 汉明距离,这是坐标的百分比。
'jaccard' 一个减去Jaccard系数,这是非零坐标的百分比。
'mahalanobis' Mahalanobis距离,使用正定的协方差矩阵计算。要更改协方差矩阵的值,请使用'COV'名称-值对的论点。
'seuclidean' 标准化的欧几里德距离。行之间的每个坐标差异mdl.x.并且通过将标准偏差的相应元素除以从计算机的相应元素划分来缩放查询矩阵mdl.x..要指定另一个缩放,请使用'规模'名称-值对的论点。
“矛曼” 1减去观察值之间的样本斯皮尔曼等级相关性(作为值的序列处理)。

如果MDL.是一个令人疲惫的模型对象,则还可以使用(例如,@Distfun.)。自定义距离功能必须:

  • 有形式功能d2 = distfun(zi,zj)

  • 作为论点:

    • 一个1-by-K向量Zi.包含单行mdl.x.或者Y, 在哪里K是列的数量mdl.x.

    • 一个-经过-K矩阵ZJ.包含多行mdl.x.或者Y, 在哪里为正整数。

  • 返回一个-1-1距离矢量D2, 在哪里D2(j是观察之间的距离Zi.ZJ(j:)

有关更多详细信息,请参阅距离指标

例子:'距离','minkowski'

标志包括与查询观测具有相同距离的最近邻居,指定为包括的逗号分隔对“IncludeTies”错误的0) 或者真的1)。

如果IncludeTies.真的,那么:

  • knnsearch包括所有最近的邻居,其距离等于k输出参数中最小的距离k是由搜索的最近邻居的数量'K'名称-值对的论点。

  • idx.D-经过-1单元格数组,每个单元格至少包含一个向量k分别是指数和距离。每一个向量D包含按升序排列的距离。在每一行idx.包含与距离相对应的最近邻居的索引D

如果IncludeTies.错误的,然后knnsearch选择具有与查询点相同距离的观察结果中最小指数的观察。

例子:'IncludeTies',真实

用于搜索每个查询观察的训练数据的最近邻居的数量,指定为包括的逗号分隔对'K'和一个正整数。

例子:'k',2

数据类型:单身的|双倍的

用于Minkowski距离度量的指数,指定为逗号分隔对组成“P”和正标量。此参数仅在此处有效'距离''minkowski'

例子:“P”3

数据类型:单身的|双倍的

Kd-Tree最近邻搜索器

全部收缩

标志根据距离对返回的指数进行排序,指定为逗号分隔对“SortIndices”和任何一种真的1) 或者错误的0)。

为了更快的性能,您可以设置sortindices.错误的以下情况下是真的:

  • Y包含了许多有许多近邻的观测结果X

  • MDL.是A.kdtreesearcher.模型对象。

  • IncludeTies.错误的

在这种情况下,knnsearch在没有特定的顺序中返回最近邻居的索引。什么时候sortindices.真的,函数按距离升序排列最近邻指标。

sortindices.真的默认情况下。什么时候MDL.是一个令人疲惫的模型对象或IncludeTies.真的,该函数始终对索引进行排序。

例子:'sortindices',false

数据类型:逻辑

对于详尽的最近邻搜索者

全部收缩

用于Mahalanobis距离度量的协方差矩阵,指定为逗号分隔对组成'COV'和一个积极的矩阵。COV.是A.K-经过-K矩阵,K是列的数量mdl.x..如果您指定COV.并且没有指定距离”、“mahalanobis”,然后knnsearch返回错误消息。

例子:“浸”,眼睛(3)

数据类型:单身的|双倍的

标准化欧几里德距离度量的比例参数值,指定为逗号分隔对组成'规模'和一个非负数字矢量。规模长度K, 在哪里K是列的数量mdl.x.

软件使用相应的元素缩放训练和查询数据之间的每个区别规模.如果您指定规模并且没有指定距离','seuclidean',然后knnsearch返回错误消息。

例子:'Scale',Smianile(MDL.x,0.75) - Smianile(MDL.x,0.25)

数据类型:单身的|双倍的

请注意

如果您指定距离COV.P, 或者规模,然后mdl.distance.mdl.distparameter.不要改变价值。

输出参数

全部收缩

培训最近邻居的数据指数,作为数字矩阵或数字向量的单元数组返回。

  • 如果没有指定IncludeTies.错误的默认情况下),那么idx.是一个-经过-k数字矩阵,其中是行的数量Yk是由搜索的最近邻居的数量'K'名称-值对的论点。Idx(j,i)表示mdl.x(idx(j,i),:)是其中之一k最近的观察mdl.x.到查询观察y(j,:)

  • 如果您指定'IncludeTies',真实,然后idx.是一个-经过-1单元格数组这样的单元格jIDX {J})包含一个至少为的向量k最近观察的指标mdl.x.到查询观察y(j,:)

如果sortindices.真的,然后knnsearch按距离按升序排列索引。

最近邻居到查询数据的距离,返回为数字矩阵或数字向量的单元数组。

  • 如果没有指定IncludeTies.错误的默认情况下),那么D是一个-经过-k数字矩阵,其中是行的数量Yk是由搜索的最近邻居的数量'K'名称-值对的论点。D(j,i)是之间的距离mdl.x(idx(j,i),:)和查询观察y(j,:)关于距离度量。

  • 如果您指定'IncludeTies',真实,然后D是一个-经过-1单元格数组这样的单元格jD {j})包含一个至少为的向量k最近观察的距离mdl.x.到查询观察y(j,:)

如果sortindices.真的,然后knnsearch按升序排列距离。

提示

knnsearch找到了k(正整数)点mdl.x.这是k- 每个人都是最初的Y点。相比之下,rangesearch.找到所有要点mdl.x.在距离内r(正标量)Y点。

替代功能

  • knnsearch是一个需要一个对象函数令人疲惫的或者kdtreesearcher.模型对象和查询数据。在等同条件下,knnsearch对象函数返回与此相同的结果knnsearch函数,在指定名称-值对参数时'nsmethod','穷举'或者'nsmethod','kdtree',分别。

  • k- 最终邻居分类,见Fitcknn.ClassificationKnn.

参考文献

[1] Friedman, J. H., Bentely, J.和Finkel, R. A.(1977)。"在对数预期时间内找到最佳匹配的算法"数学软件学报卷。3,第3期,977年9月,第209-226页。

扩展能力

在R2010A介绍