高效的KNN实现,允许插入

时间:2017-08-25 18:41:00

标签: python algorithm vector knn

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

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

1 个答案:

答案 0 :(得分:2)

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

  • KD-Trees:据我所知,KD-Trees应该随时支持插入,但是它们有可能变得不平衡。我没有使用python,所以我不知道为什么你的KD树不支持动态插入/删除。
  • 四叉树:根据维度,您也可以使用四叉树/八叉树,但标准实现不适合超过10个维度。在上面的参考文献中,我测试了一个四叉树和一个特殊的' hypecube'导航方法。这需要大量内存,但在性能方面具有更高的维度。
  • R-Tree / R *树:原始R-Trees在动态插入时不是很好。但是,如果你看一下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除外。可以找到允许动态插入的KD-Tree实现herehere