我正在尝试使用NearestNeighbors.jl包在Julia中运行最近邻居搜索。相应的Matlab代码为
X = rand(10);
Y = rand(100);
Z = zeros(size(Y));
Z = knnsearch(X, Y);
这生成了长度为100的向量Z,其中第i个元素是X的索引,对于所有i=1:100,X的元素最接近Y中的第i个单元。
真的需要一些帮助将上面最后一行的Matlab代码转换为Julia!
使用:
X = rand(1, 10)
Y = rand(1, 100)
nn(KDTree(X), Y)[1]
如果您想在将来重用中间KDTree
对象,那么存储它将非常有用(因为它将提高查询的效率(。
现在我的例子的关键点是什么。最近邻居.jl接受以下输入数据:
它可以是:
- 大小为nd×np的矩阵,具有要插入树中的点,其中nd是点的维数,np是点的数目
- 具有固定维度的向量的向量,nd,它必须是类型的一部分
我使用了第一种方法。重点是观察结果必须在列中(而不是像原始代码中那样在行中(。请记住,在Julia中,向量是柱状的,因此最近邻居.jl将rand(10)
视为具有10个维度的1个观测值,而rand(1, 10)
视为每个具有1个维度的10个观测值。
然而,对于您的原始数据,因为您只想要一个最近的邻居,而且它是一维的,而且很小,所以足以写入(这里我假设X
和Y
是您存储在矢量中的原始数据(:
[argmin(abs(v - y) for v in X) for y in Y]
而不使用任何额外的封装。
NearestNeighbors.jl对于处理具有许多元素的高维数据非常有效。