Matlab 如何在一组点中找到点的第k个最近邻

Matlab 如何在一组点中找到点的第k个最近邻,matlab,nearest-neighbor,Matlab,Nearest Neighbor,我在二维平面上有一组点(x,y)。给定一个点(x0,y0)和数字k,如何在点集中找到(x0,x0)的第k个最近邻。具体而言,点集由两个数组表示:x和y。点(x0,y0)由指数i0给出。它意味着x0=x(i0)和y0=y(i0) Matlab中是否有函数或其他东西可以帮助我解决这个问题。如果Matlab没有这样的功能,你能推荐其他有效的方法吗 编辑:我必须为集合中的每个点(x0,y0)计算这种距离。这台电视机的尺寸约为1000。k的值应约为sqrt(1500)。最糟糕的是我做了很多次。在每次迭代中

我在二维平面上有一组点(x,y)。给定一个点(x0,y0)和数字k,如何在点集中找到(x0,x0)的第k个最近邻。具体而言,点集由两个数组表示:x和y。点(x0,y0)由指数i0给出。它意味着x0=x(i0)和y0=y(i0)

Matlab中是否有函数或其他东西可以帮助我解决这个问题。如果Matlab没有这样的功能,你能推荐其他有效的方法吗


编辑:我必须为集合中的每个点(x0,y0)计算这种距离。这台电视机的尺寸约为1000。k的值应约为sqrt(1500)。最糟糕的是我做了很多次。在每次迭代中,集合都会发生变化,我会再次计算距离。因此,运行时间是一个关键问题。

如果您有统计工具箱,您可以使用该函数。

蛮力算法如下所示:

array x[n] = ()
array y[n] = () 
array d[n] = ()

... populate x and y arrays with your n points ...

/* step over each point and calculate its distance from (x0, y0) */
for i = 1 to n
do
  d[i] = distance((x0, y0), (x[i], y[i])
end 

/* sort the distances in increasing order */
sort(d)

/* the k'th element of d, is the k'th nearest point to (x0, y0) */
return d[k]
%Create some points
n = 10;
x = randn(n,1);
y = randn(n,1);

%Choose x0
ix0 = randi(n);

%Get distances
d = sqrt(...
    (x - x(ix0) ).^2 + ...
    (y - y(ix0) ).^2 );

%Sort distances
[sorted_Dstances, ixSort] = sort(d);

%Get kth point
k = 3;
kth = [x(ixSort(k+1)); y(ixSort(k+1))]; %+1 since the first element will always be the x0 element.

蛮力方法看起来像这样:

array x[n] = ()
array y[n] = () 
array d[n] = ()

... populate x and y arrays with your n points ...

/* step over each point and calculate its distance from (x0, y0) */
for i = 1 to n
do
  d[i] = distance((x0, y0), (x[i], y[i])
end 

/* sort the distances in increasing order */
sort(d)

/* the k'th element of d, is the k'th nearest point to (x0, y0) */
return d[k]
%Create some points
n = 10;
x = randn(n,1);
y = randn(n,1);

%Choose x0
ix0 = randi(n);

%Get distances
d = sqrt(...
    (x - x(ix0) ).^2 + ...
    (y - y(ix0) ).^2 );

%Sort distances
[sorted_Dstances, ixSort] = sort(d);

%Get kth point
k = 3;
kth = [x(ixSort(k+1)); y(ixSort(k+1))]; %+1 since the first element will always be the x0 element.

免费的开源工具箱包含kd树实现,以及其他有用的东西

如果要对多个点执行此检查,您可能需要首先构建点间距离表

squareform(pdist([x y]))

您不应该删除元素本身吗?考虑一下k=1的情况。我通常不喜欢像这样更改匹配向量的大小。可能在最终索引中添加“+1”。编辑:但如果存在与初始点相同的点,则会留下间隙。如果你想保证答案是一个不同的点,即使有些点是相等的,那么还需要做更多的工作。@删除相等的点是没有意义的。如果您搜索的点有5个相等的点,则第三个最远距离应为0非常感谢!但是我必须用集合中的每一点来计算这种距离。因此,这种方法似乎比我预期的要简单一些。很抱歉,我之前没有澄清。knnsearch似乎是一个解决方案,但我不确定如何将knnsearch应用于我的问题。我会找到的。不管怎样,你能告诉我更多关于使用knnsearch的细节吗。非常感谢。你看过Matlab帮助了吗(在上面我的答案中添加了链接)?我阅读了关于knnsearch的在线文档,但它对我来说有点复杂,我真的没有太多时间去理解和使用它。我尝试了更简单的方法。跑步需要更多的时间,但我会先尝试这种方法。谢谢你的帮助。我会为每一个积分做这件事。因此,某种距离表将有助于节省跑步时间。我将在我的问题中找出平方函数是如何工作的。非常感谢。函数是pdist实际上,squareform只是将pdist的向量输出变成一个平方矩阵,但前提是你有统计工具箱。它对我有用。也许这不是最好的方法,但它很容易实现和使用。老实说,我没有太多时间来完成代码。非常感谢。这是O(N^2),其中N是点数,每个查询都是O(N lg N)。下面提到的kd树,在某些情况下也被
knnsearch
使用,通常要快得多,需要O(nlg^2n)来构造,O(lgn)表示1个最近邻,我猜,当k很小并且有一个有利的数据集时,k(lgk)(lgn))表示k个最近邻(考虑:通过二进制搜索)。(这意味着,例如,如果你有10000个点,它应该快100到1000倍左右。)因此knnsearch更受欢迎。