knnsearch
找到k-使用输入数据的最近邻居
描述
例子
找到最近的邻居
找到病人在医院
数据集,最接近的病人Y
,根据年龄和体重。
加载医院
数据集。
负载医院;X =[医院。年龄hospital.Weight);Y = [20 162;30 169;40 168;50 170;60 171];%的新病人
执行一个knnsearch
之间的X
而且Y
找到最近邻居的索引。
Idx = knnsearch (X, Y);
找到医院的病人X
年龄和体重都接近Y
.
X (Idx:)
ans =5×225 171 25 171 39 164 49 170 50 172
找到k-使用不同距离度量的最近邻
找到10个最近的邻居X
的每一点Y
首先使用闵可夫斯基距离度规,然后使用切比切夫距离度规。
载入费雪的虹膜数据集。
负载fisheririsX =量(:,3:4);原花的尺寸Y = [5 1.45;6 2;2.75 .75];%新花数据
执行一个knnsearch
之间的X
以及查询点Y
使用Minkowski和Chebychev距离度量。
(马里兰州mIdx) = knnsearch (X, Y,“K”10“距离”,闵可夫斯基的,“P”5);[cIdx, cD] = knnsearch (X, Y,“K”10“距离”,“chebychev”);
可视化两个最近邻搜索的结果。绘制训练数据。用标记x绘制查询点。用圆圈表示闵可夫斯基最近邻。用五角形表示Chebychev最近的邻居。
gscatter (X (: 1) X(:, 2),物种)线(Y (: 1), Y (:, 2),“标记”,“x”,“颜色”,“k”,...“Markersize”10“线宽”2,“线型”,“没有”)线(X (mIdx, 1), X (mIdx, 2),“颜色”,(。5。5。5),“标记”,“o”,...“线型”,“没有”,“Markersize”10)线(X (cIdx, 1), X (cIdx, 2),“颜色”,(。5。5。5),“标记”,“p”,...“线型”,“没有”,“Markersize”10)传说(“setosa”,“多色的”,“virginica”,“查询点”,...闵可夫斯基的,“chebychev”,“位置”,“最佳”)
输入参数
X
- - - - - -输入数据
数字矩阵
输入数据,指定为数值矩阵。行X
对应观察结果,列对应变量。
数据类型:单
|双
Y
- - - - - -查询点
数字矩阵
查询点,指定为数值矩阵。行Y
对应观察结果,列对应变量。Y
列数必须与X
.
数据类型:单
|双
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名-值参数必须出现在其他参数之后,但对的顺序并不重要。
在R2021a之前,名称和值之间用逗号隔开,并括起来的名字
在报价。
例子:knnsearch (X, Y,“K”10“IncludeTies”,的确,“距离”,“cityblock”)
搜索10个最近的邻居,包括领带和使用城市街区距离。
IncludeTies
- - - - - -标志包含所有最近的邻居
假
(0
)(默认)|真正的
(1
)
标志,以包括所有距离查询点相同的最近邻居,指定为逗号分隔的对,由“IncludeTies”
而且假
(0
)或真正的
(1
).
如果“IncludeTies”
是假
,然后knnsearch
在与查询点距离相同的观测值中选择索引最小的观测值。
如果“IncludeTies”
是真正的
,那么:
例子:“IncludeTies”,真的
距离
- - - - - -距离度量
“欧几里得”
(默认)|“seuclidean”
|“cityblock”
|“chebychev”
|闵可夫斯基的
|“mahalanobis”
|函数处理|……
距离度量knnsearch
使用,指定为逗号分隔的对,由“距离”
和这个表中的一个值或函数句柄。
价值 | 描述 |
---|---|
“欧几里得” |
欧氏距离。 |
“seuclidean” |
标准化的欧氏距离。每一行之间的坐标差X 查询矩阵Y 是通过除以相应元素的标准偏差计算X .要指定另一个缩放,请使用“规模” 名称-值对的论点。 |
“cityblock” |
城市街区的距离。 |
“chebychev” |
切比乔夫距离(最大坐标差)。 |
闵可夫斯基的 |
闵可夫斯基距离。缺省指数为2。要指定不同的指数,请使用“P” 名称-值对的论点。 |
“mahalanobis” |
马氏距离,用正定协方差矩阵计算。要更改协方差矩阵的值,请使用“浸” 名称-值对的论点。 |
的余弦 |
1减去观测值之间夹角的余弦(作为向量处理)。 |
“相关” |
1减去观察值之间的样本线性相关性(作为值序列处理)。 |
“枪兵” |
1减去观察值之间的样本斯皮尔曼秩相关(作为值序列处理)。 |
“汉明” |
汉明距离,也就是不同坐标的百分比。 |
“jaccard” |
1减去雅卡德系数,也就是非零坐标的百分比。 |
还可以使用为自定义距离度量指定函数句柄@
(例如,@distfun
).自定义距离函数必须:
的形式
函数D2 = distfun(ZI,ZJ)
.以作为参数:
1 -n向量
子
包含的单行X
或者从查询点Y
.一个米2——- - - - - -n矩阵
ZJ
包含多个行X
或Y
.
返回一个米2-乘1的距离向量
D2
,他的j
元素是观测值之间的距离子
而且ZJ (j,:)
.
有关更多信息,请参见距离度量.
例子:“距离”、“chebychev”
P
- - - - - -闵可夫斯基距离度量的指数
2
(默认)|积极的标量
闵可夫斯基距离度量的指数,指定为逗号分隔的对,由“P”
一个正的标量。
这个论点只有在“距离”
是闵可夫斯基的
.
例子:“P”3
数据类型:单
|双
浸
- - - - - -马氏距离度量的协方差矩阵
X (X, omitrows)
(默认)|正定矩阵
规模
- - - - - -标准化欧氏距离度量的尺度参数值
性病(X, omitnan)
(默认)|非负数字矢量
标度参数值的标准化欧氏距离度量,指定为逗号分隔的对,由“规模”
和一个非负的数字向量。“规模”
长度是否等于中的列数X
.当knnsearch
计算标准化欧氏距离,的每个坐标X
的对应元素“规模”
,每个查询点也是如此。这个论点只有在“距离”
是“seuclidean”
.
例子:“规模”,分位数(0.75 X)——分位数(0.25 X))
数据类型:单
|双
BucketSize
- - - - - -的叶节点中的最大数据点数Kd-tree
50
(默认)|正整数
SortIndices
- - - - - -标记来根据距离对返回的索引进行排序
真正的
(1
)(默认)|假
(0
)
标记来根据距离对返回的索引进行排序,指定为逗号分隔的对,由“SortIndices”
,要么真正的
(1
)或假
(0
).
为了更快的性能,您可以设置SortIndices
来假
当下列情况为真时:
NSMethod
是“kdtree”
.IncludeTies
是假
.
在这种情况下,knnsearch
返回最近邻居的索引,没有特定的顺序。当SortIndices
是真正的
,函数按距离升序排列最近邻指标。
SortIndices
是真正的
默认情况下。当NSMethod
是“详尽”
或IncludeTies
是真正的
,函数总是对索引排序。
例子:“SortIndices”,假的
数据类型:逻辑
输出参数
Idx
—输入最近邻居的数据索引
数字矩阵|单元数组的数字向量
最近邻居的输入数据索引,作为数值矩阵或数值向量的单元格数组返回。
如果不指定
IncludeTies
(假
默认情况下),那么Idx
是一个米——- - - - - -k数字矩阵,米行数在吗Y
而且k是搜索的最近邻居的数量。Idx (j,我)
表明X (Idx (j,我),:)
是一种k最近的观察X
到查询点Y (j,:)
.如果您指定
“IncludeTies”,真的
,然后Idx
是一个米——- - - - - -1
单元格数组这样表示单元格j
(Idx {j}
)包含至少的向量k最接近的观测指数X
到查询点Y (j,:)
.
如果SortIndices
是真正的
,然后knnsearch
按距离升序排列索引。
D
-最近邻居的距离
数字矩阵|单元数组的数字向量
到查询点的最近邻居的距离,作为数值矩阵或数值向量的单元格数组返回。
如果不指定
IncludeTies
(假
默认情况下),那么D
是一个米——- - - - - -k数字矩阵,米行数在吗Y
而且k是搜索的最近邻居的数量。D (j,我)
是距离X (Idx (j,我),:)
而且Y (j,:)
关于距离度规。如果您指定
“IncludeTies”,真的
,然后D
是一个米——- - - - - -1
单元格数组这样表示单元格j
(D {j}
)包含至少的向量k最近的观测距离X
到查询点Y (j,:)
.
如果SortIndices
是真正的
,然后knnsearch
按升序排列距离。
提示
对于一个固定的正整数k,
knnsearch
找到了k点X
中每个点最近的Y
.找到所有的点X
在每个点的固定距离内Y
,使用rangesearch
.knnsearch
不保存搜索对象。若要创建搜索对象,请使用createns
.
算法
有关特定搜索算法的信息,请参见k最近邻搜索和半径搜索.
选择功能
如果你设置knnsearch
函数的“NSMethod”
名称-值对参数的适当值(“详尽”
对于穷尽搜索算法或者“kdtree”
对于一个KD-tree算法),则搜索结果与使用knnsearch
对象的功能。不像knnsearch
函数,knnsearch
对象函数需要ExhaustiveSearcher
或者一个KDTreeSearcher
模型对象。
参考文献
弗里德曼,J. H.本特利,R. A.芬克尔。在对数期望时间内寻找最佳匹配的算法。ACM数学软件汇刊3,没有。3(1977): 209 - 226。
扩展功能
高大的数组
使用行数超过内存容量的数组进行计算。
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
的默认值用于代码生成
“NSMethod”
名值对参数为“详尽”
当列数在X
大于7。的值
“距离”
名值对参数必须是编译时常量,不能是自定义距离函数。的值
“IncludeTies”
名值对参数必须是编译时常量。的
“SortIndices”
不支持名称-值对参数。输出参数总是排序的。名称-值参数中的名称必须是编译时常量。例如,要允许在生成的代码中使用用户定义的闵可夫斯基距离指数,请使用include
{coder.Constant(的距离),coder.Constant(“闵可夫斯基”),coder.Constant(“P”),0}
在arg游戏
的价值codegen
(MATLAB编码器).当你指定
“IncludeTies”
作为真正的
,生成的代码中绑定距离的排序顺序可以与MATLAB中的顺序不同®由于数值精度。当
knnsearch
使用kd树搜索算法,代码生成构建类型为MEX函数,codegen
(MATLAB编码器)使用Intel生成MEX函数®线程构建块(TBB)用于并行计算。否则,codegen
生成的代码使用parfor
(MATLAB编码器).MEX功能用于kd-树搜索算法-
codegen
使用Intel TBB生成优化的MEX函数,用于多核平台上的并行计算。您可以使用MEX函数来加速MATLAB算法。有关Intel TBB的详细信息,请参见https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.html.如果生成了MEX函数来测试生成的代码
parfor
版本,您可以禁用Intel TBB的使用。设置ExtrinsicCalls
属性的MEX配置对象假
.有关详细信息,请参见编码器。MexCodeConfig
(MATLAB编码器).MEX函数的穷举搜索算法和独立的C/ c++代码的两个算法-的生成代码
knnsearch
使用parfor
(MATLAB编码器)在生成的代码中创建在受支持的共享内存多核平台上并行运行的循环。如果您的编译器不支持Open Multiprocessing (OpenMP)应用程序接口或禁用了OpenMP库,MATLAB编码器™将parfor
循环,为
循环。要查找支持的编译器,请参见支持编译器.若要禁用OpenMP库,请设置EnableOpenMP
属性的配置对象假
.有关详细信息,请参见编码器。CodeConfig
(MATLAB编码器).
从R2020a开始,
knnsearch
返回整数类型(int32
)索引,而不是在生成的独立C/ c++代码中使用双精度索引。因此,当您使用单精度输入时,该函数允许严格的单精度支持。对于MEX代码生成,函数仍然返回双精度指标以匹配MATLAB行为。
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
版本历史
介绍了R2010a
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。