最近邻搜索具有方向向量的点

时间:2014-02-11 04:00:59

标签: nearest-neighbor kdtree

我有一组3D点,每个点都与一个方向相关联(例如单位矢量)。给定另一个点+方向我想要计算出集合中的最近点(使用标准2-范数),其也满足方向向量上的特定条件(例如,两个方向向量之间的角度在特定角度量内)。到目前为止,我在3D点上有一个基于KD树的范围搜索,然后检查这些点是否符合角度约束,但是意识到这是一个高度未经优化的黑客攻击。想知道是否有一个明显更好的方法来做到这一点。

非常感谢提前。

3 个答案:

答案 0 :(得分:2)

对我来说,当前公式中的主要问题是角度比较是核化的(即需要在矢量之间进行比较)。如果你将每个角度的方向扩展为一个单独的2D向量(cos theta,sin theta),那么你应该只能在这个空间中做一个半径有限的另一个最近邻搜索(KDTree应该没问题)并采取相交两个结果集。

答案 1 :(得分:1)

考虑使用R * -trees。这种基于矩形的数据结构非常适合复杂的查询。

即。如果您可以检查矩形是否包含满足约束的点,则可以使用R * -tree来加速此查询。 ELKI中的索引是可扩展的,因此这可能是一个很好的起点。根据我的理解,您应该能够将其表示为ELKI中的距离函数,如this tutorial in their wiki中所示:如果矩形不能满足约束,则返回无限距离。

答案 2 :(得分:1)

你很久以前发布了,但我正在研究类似的问题,并找到了一些答案,所以我会发帖并希望它仍然有用。

这在文献中被称为约束最近邻搜索This paper有一个关于它如何在R树上工作的很好的部分,尽管该论文是关于其他的。

你的KD树是一个很好的起点。 R树中的算法算法也适用于KD树案例。

本文描述了正常最近邻搜索的专用版本,如下所示。

首先构建深度优先搜索,该搜索将遍历包含至少一个满足警告点的所有单元格。搜索应该按照从查询点增加 mindist 的顺序访问单元格。 mindist 是从查询点到单元格中最近点的距离。

现在修改遍历以跳过下降到 mindist 大于目前为止找到的最佳点(最接近查询并且满足警告)的单元格。