knnsearch 从 Matlab 到 Julia

knnsearch from Matlab to Julia

我正在尝试使用 NearestNeighbors.jl 包在 Julia 中进行 运行 最近邻搜索。对应的Matlab代码为

X = rand(10);
Y = rand(100); 
Z = zeros(size(Y));
Z = knnsearch(X, Y); 

这将生成长度为 100 的向量 Z,其中第 i 个元素是 X 的索引,其元素最接近 Y 中的第 i 个元素,对于所有 i=1:100。

真的需要一些帮助将上面的 Matlab 代码的最后一行转换为 Julia!

使用:

X = rand(1, 10)
Y = rand(1, 100)
nn(KDTree(X), Y)[1]

存储中间 KDTree 对象如果您想在将来重用它会很有用(因为它会提高查询效率)。

现在我的例子的关键点是什么。 NearestNeighbors.jl 接受以下输入数据:

It can either be:

  • a matrix of size nd × np with the points to insert in the tree where nd is the dimensionality of the points and np is the number of points
  • a vector of vectors with fixed dimensionality, nd, which must be part of the type.

我用的是第一种方法。关键是观察必须在列中(而不是在原始代码中的行中)。请记住,在 Julia 中,向量是柱状的,因此 rand(10) 被 NearestNeighbors.jl 视为具有 10 个维度的 1 个观察值,而 rand(1, 10) 被视为具有 1 个维度的 10 个观察值。

但是,对于您的原始数据,因为您只需要最近的邻居,并且它是 single-dimensional 并且很小,所以足以写入(这里我假设 XY 是您存储在向量中的原始数据):

[argmin(abs(v - y) for v in X) for y in Y]

不使用任何额外的包。

NearestNeighbors.jl 对于处理包含很多元素的 high-dimensional 数据非常有效。