【问题标题】:How to find the closest 2 points in a 100 dimensional space with 500,000 points?如何在 500,000 个点的 100 维空间中找到最近的 2 个点?
【发布时间】:2010-10-10 05:06:02
【问题描述】:

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

更新:空间是欧几里得,抱歉。并感谢所有的答案。顺便说一句,这不是家庭作业。

【问题讨论】:

  • 出于兴趣,你从哪里得到一个 100 维空间?
  • 这个问题不够清晰。这是一道数学题吗?
  • @Sarmaad 这个问题可能缺少很多东西,但它确实很清楚:阅读 1 句话后,我完全理解了这个问题。 (虽然没有提到空间的类型,但通常默认采用欧几里得)
  • 相关:stackoverflow.com/q/2486093 请注意,在您的案例中,KDTree 的方法需要大约 5 天的计算时间。
  • @louzer:这是使用 KDTree 和多处理 ideone.com/Z7uSc 的蛮力方法(您可以针对少量点针对您的解决方案进行测试)

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


【解决方案1】:

Introduction to Algorithms 中有一个章节致力于在 O(n*logn) 时间内找到二维空间中的两个最近点。您可以在google books 上查看。事实上,我向大家推荐它,因为他们将分而治之的技术应用于这个问题的方式非常简单、优雅和令人印象深刻。

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

编辑
这一切都假设你有欧几里得空间。即,向量v 的长度为sqrt(v0^2 + v1^2 + v2^2 + ...)。但是,如果您可以选择指标,则可能还有其他选项来优化算法。

【讨论】:

    【解决方案2】:

    使用 kd 树。您正在研究最近邻问题,并且有高度优化的数据结构可用于处理此类问题。

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

    附:有趣的问题!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢。 ANN 正是我想要的。希望它可以将所有内容都保存在 RAM 中。
      • ANN 使用方便,但需要注意的是,它是一个近似的最近邻实现,因此不能保证正确。
      【解决方案4】:

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

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

      【讨论】:

      • 谢谢。我正在根据您的建议缩小尺寸。
      • 如果您确实运行 PCA 100 -> 20 维,请务必检查方差分数,sum( 20 eigenvalues ) / sum(all)。
      【解决方案5】:

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

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

      我的朋友几年前在写博士论文时遇到了类似的问题。他的工作在 10 个维度上大约有 100 万个点。我们构建了一个 kd-tree 库来解决它。如果您想离线联系我们,我们也许可以挖掘代码。

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

      【讨论】:

      • kdtrees 可以很容易地在 O(log n) 时间内找到给定点的最近邻居,我记得。是否有优化以在小于 O(n log n) 的时间内找到最近的点对?
      • -1,同样根据维基百科,如果 N >> 2^k(其中 k 是维度和 N 点数;在这种情况下 2^100 >> 5e5 和答案),kD-tree 是有效的完全是误导)
      • 10d 不是 100d。即使数据点大致位于 100d 的 10-d 平面上,kd-tree 也无法工作(恕我直言):想想 100 s 深的 kd-tree。
      猜你喜欢
      • 2016-08-09
      • 2019-11-04
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 2012-09-30
      相关资源
      最近更新 更多