假设我在R^(n * d)
个数据点的n
中有一个数据集,每个数据点的维度为d
。我想计算它们之间每个k
点的n
个最近邻居,从而得出每个N^(n*k)
个最近邻居的索引k
个矩阵n
分。 注意 这对于普通的最近邻居搜索是不同的,因为我们无需计算任意任意点的最近邻居,而只需在原始{ {1}}训练数据。
我可以想到几个简单的实现。
首先,在每个点执行linear search要求每个点n
,这在整个数据集中变成~ O(n)
,这非常慢。显然,这差不多等于简单地构造成对距离矩阵也是~ O(n^2)
。
第二,我们可以构建一个ball tree,它需要~ O(n^2)
来构建,并且每个点~ O(n log n)
来计算最近的邻居。执行~ O(log n)
这样的计算本身需要n
,因此整个过程为~ O(n log n)
。但是,球树的目的是对任意输入执行最近的邻居搜索,因此当我们只希望原始训练点的最近邻居时,它似乎“太强大”。
是否有可能同时对所有点执行上面的线性搜索,为整个问题制定一个~ O(n log n)
算法?还是O(n)
是我们在这里能做的最好的事情。