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

时间:2012-02-22 21:43:58

标签: matlab nearest-neighbor

我在2d平面上有一组点(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)。最糟糕的是我多次这样做。在每次迭代时,集合发生变化,我再次计算距离。因此,运行时间是一个关键问题。

5 个答案:

答案 0 :(得分:6)

如果您要检查许多点,您可能需要先构建一个点间距离表

squareform(pdist([x y]))

答案 1 :(得分:4)

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

答案 2 :(得分:2)

蛮力算法就是这样的:

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]

答案 3 :(得分:2)

蛮力方法看起来像这样:

%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.

答案 4 :(得分:2)

free和opensource VLFeat工具箱包含一个kd-tree实现,以及其他有用的东西。