如何在500维点找到100维空间中最接近的2个点?

时间:2010-10-10 05:06:03

标签: algorithm performance nearest-neighbor pca approximate-nn-searching

我有一个在100维空间中有500,000个点的数据库,我想找到最接近的2个点。我该怎么做?

更新:太空是欧几里得,对不起。并感谢所有的答案。顺便说一句,这不是作业。

5 个答案:

答案 0 :(得分:16)

Introduction to Algorithms中有一章致力于在O(n * logn)时间内在二维空间中找到两个最接近的点。您可以在google books上查看。事实上,我建议每个人都使用分治技术来解决这个问题非常简单,优雅和令人印象深刻。

虽然它不能直接扩展到您的问题(因为常量7将替换为2^101 - 1),但对大多数数据集来说应该没问题。因此,如果您有合理的随机输入,它会给您O(n*logn*m)复杂性,其中n是点数,m是维数。

修改
这就是假设你有Euclidian空间。即,向量v的长度为sqrt(v0^2 + v1^2 + v2^2 + ...)。但是,如果您可以选择指标,则可以使用其他选项来优化算法。

答案 1 :(得分:7)

使用kd树。您正在查看最近邻居问题,并且有高度优化的数据结构来处理这类确切的问题。

http://en.wikipedia.org/wiki/Kd-tree

P.S。有趣的问题!

答案 2 :(得分:6)

您可以尝试使用ANN library,但这样可以提供最多20个维度的可靠结果。

答案 3 :(得分:6)

在您的数据上运行PCA,将向量从100维转换为20维。然后创建一个K-Nearest Neighbor树(KD-Tree)并根据欧几里德距离得到最近的2个邻居。

一般情况下如果没有。尺寸非常大,那么你必须要么采用蛮力方法(并行+分布式/地图缩减)或基于聚类的方法。

答案 4 :(得分:4)

使用称为KD-TREE的数据结构。您需要分配大量内存,但根据您的数据,您可能会发现一两个优化。

http://en.wikipedia.org/wiki/Kd-tree

几年前,我的朋友正在研究他的博士论文,当时他遇到了类似的问题。他的工作在10个维度上达到了1M点。我们构建了一个kd-tree库来解决它。如果您想离线联系我们,我们可能会挖掘代码。

这是他发表的论文: http://www.elec.qmul.ac.uk/people/josh/documents/ReissSelbieSandler-WIAMIS2003.pdf