是否有可能找到* IN * KD树的节点的KNN?

时间:2010-03-26 16:52:29

标签: c++ machine-learning kdtree knn

尝试使用KD树创建KNN搜索。我可以很好地形成KD树(或者至少,我相信我可以!)。我的问题是我正在寻找一个点列表中每个点最近的2个邻居。

那么,有没有一种方法可以使用KD树找到一个点的K个最近邻居,即使该点实际上是在树中,或者我是否需要为每个点构建一个单独的KD树,而忽略了这一点我想搜索一下?

我的实现语言是C ++,但我更喜欢算法或一般帮助,谢谢!

谢谢, 斯蒂芬

3 个答案:

答案 0 :(得分:3)

如果您希望树中的 K 完全最近邻居,只需在树中查询 K + 1 邻居(显然,因为第一个最近邻居将是您的查询。)

答案 1 :(得分:1)

这不是一个真正的答案,但我不能适应我要粘贴到评论中的内容。无论如何,这是来自维基百科的相关文本:

  

该算法可以扩展   通过简单的修改几种方式。   它可以提供k-Nearest Neighbors   保持k电流到一定程度   最好的而不仅仅是一个。分行   只有在他们不能的时候才被淘汰   比任何一个k都更接近点   目前最好的。

     

它也可以转换为   近似算法运行得更快。   例如,近似最接近   邻居搜索可以通过   只需设置上限即可   要在树上检查的数字点,   或者通过中断搜索过程   基于实时时钟(其中   可能更适合硬件   实现)。最近的邻居   对于树中的点   已经可以实现   更新节点的细化   结果给出零距离,这个   有丢弃点的缺点   这不是唯一的,但是   与原始搜索位于同一地点   点。

     

近似最近邻有用   在实时应用程序,如   机器人技术由于速度很快   不寻找增加   最好的一点是穷举。之一   它的实现是Best Bin First。

答案 2 :(得分:0)

我建议您查看ANN以了解实施细节http://www.cs.umd.edu/~mount/ANN/

它专为近似最近邻搜索而设计,但也可以进行精确的最近邻搜索。它也是我发现的一些最清晰,编写最好的代码,即使你想要自己的实现,也应该给你一些见解。