我正在研究近似最近邻算法。
我最近发现Annoy Library在以合理的速度找到KNN方面做得非常出色。 要进行更深入的分析,您可以浏览meetup幻灯片。
阅读幻灯片并检查源代码后,我看不出这个算法比KD-Tree更好地处理高维数据的原因。
KD-Tree是一个很好的NN算法,但是在高维度上它实现的运行时间几乎与强力搜索[O(n ^ 2)]相同,因此它需要检查许多相邻的叶子。
原因在于,在高维度中,单位球体的体积变得更小(您可以看一下here)。
我在Annoy库中发现的唯一区别是空间的分区是通过使用超平面而不是一次分区一维来完成的。
有人曾经分析过这个算法,可以解释为什么它比KD-Tree快得多吗?
答案 0 :(得分:1)
阅读Annoy的这一部分:
它是如何运作的:
使用随机投影和构建树。在每一个 在树中的中间节点,选择随机超平面 将空间划分为两个子空间。选择此超平面 从子集中采样两个点并获取超平面 与他们等距离。
我们这样做k次,以便得到一片树林。 k必须调整 根据您的需要,通过查看精确度之间的权衡 和表现。
我想,这里的关键是树林。您正在与KD树进行比较,这是一个相当古老的数据结构,正如您所说,它受到维度诅咒的影响。
我认为使用随机KD树林将是一个很好的匹配。
例如,我的kd-GeRaF就此提供了一个很好的解释(参见论文)。然而,如果尺寸的数量相对较小,即大约100,那么FLANN也应该是有趣的。 FLANN比kd-GeRaF年龄大,但给了我太多启发。
我没有看到如评论中所建议的那样如何在Annoy中使用LSH,但如果是,那么对于RKD森林来说没问题。