【问题标题】:Efficient KNN implementation which allows inserts允许插入的高效 KNN 实现
【发布时间】:2017-08-28 00:58:14
【问题描述】:

假设我有多维数据集,其中有许多向量作为数据。我正在编写一个算法,它需要对所有这些向量进行 k 最近邻搜索 - 经典 KNN。但是,在我的算法中,我向整个数据集添加了新向量,并且需要将这些新向量包含到我的 KNN 搜索中。我想有效地做到这一点。我查看了 scikit-learn 的 KD 树和球树,但它们不允许插入(根据概念的性质)。我不确定 SR 树或 R 树是否会提供插入,但无论如何,我无法为超过 3D 的数据找到 Python 实现。

关于搜索,我可以使用查询“给我最近的向量”(所以 1-NN)或“给我所有比半径更近的向量”。

【问题讨论】:

  • Cross Validated 可能比这里更好。
  • @Antimony:用于机器学习的 stackexchange 网站太多了...
  • 不完全。这是唯一的一个。
  • @Antimony:我在那里发帖。关于 SE 站点,我计算出至少 9 个:数据科学、人工智能、交叉验证、StackOverflow(因为很多 ML 是关于内部编程的)、mathSE、Mathoverflow(在某些情况下)、计算机科学(最后三个,例如用于运行时问题 - 可能涉及一些繁重的数学,但也可能涉及一些其他数学),软件工程,计算科学。对于每一个问题,我都能够提出非常适合这些 SE 网站的 ML 相关问题。
  • 您可能会重写您的问题以使其适用于任何这些网站,但最好在 Cross Validated 上询问当前形式。如果您要询问调试或特定编程方面(在算法/模型设计阶段之后),那么 SO 确实是一个不错的选择。

标签: python algorithm vector knn


【解决方案1】:

一般评论:我不太明白为什么 KD-Trees 在高维 kNN 查询中如此受欢迎。在我的experience 中,其他树在高维或大型数据集(我测试了多达 2500 万个点和(仅)多达 40 个维度)时可以更好地扩展。更多细节:

  • KD-Trees:据我所知,KD-Trees 应该随时支持插入,但它们有可能会变得不平衡。我不使用 python,所以我不知道为什么您的 KD-tree 不支持动态插入/删除。
  • 四叉树:根据维度,您也可以使用四叉树/八叉树,但标准实现不适用于超过 10 个维度左右。在上面的参考资料中,我使用特殊的“hypecube”导航方法测试了四叉树。这需要大量内存,但在性能方面可以更好地扩展维度。
  • R-Tree/R*Tree:原始 R-Tree 在动态插入方面不是很好。但是,如果您查看 R+Trees (R-Plus-Tree),它们在重新插入和 kNN 查询方面非常快。
  • PH-Trees 具有与 R+Trees 基本相同的 kNN 性能,但插入时间要短得多,因为 PH-Trees 不需要重新平衡,同时具有固有的有限深度和节点大小。不幸的是,对于 >=64 维度,实现变得更加复杂(树为每​​个维度使用一位长整数)。我不知道支持超过 63 个维度的实现。

Python:

  • R+Plus 树应该可用于 Python。如果没有,你可以改用普通的 R-Tree(只是插入算法不同)
  • 我曾经听说有人开始在 Python 中实现 PH-Tree,但我还没有看到任何开源变体。
  • 如果您有时间/兴趣进行自己的实现,可以查看 Java 实现 here 并将它们转换为 Python。该库包含各种多维索引,KD-Trees 除外。可以在 herehere 找到允许动态插入的 KD-Tree 实现。

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2018-12-04
    • 1970-01-01
    • 2015-03-18
    • 2020-05-18
    相关资源
    最近更新 更多