我正在研究近似最近邻算法。
我最近发现了Annoy Library,它在以合理的速度找到 KNN 方面做得非常出色。要进行更深入的分析,您可以浏览聚会幻灯片。
在阅读了幻灯片并检查了源代码之后,我看不出这个算法比 KD-Tree 更好地处理高维数据的原因。
KD-Tree 是一种很棒的 NN 算法,但是在高维中它实现的运行时间几乎与蛮力搜索 [O(n^2)] 相同,因此它需要检查许多相邻的叶子。
原因是在高维中,单位球体的体积变得更小(你可以看看这里)。
我在 Annoy 库中发现的唯一区别是空间的划分是通过使用超平面而不是一次划分一个维度来完成的。
有没有人分析过这个算法并能解释为什么它比 KD-Tree 快得多?