【问题标题】:Nearest neighbor search for points with directional vectors caveat最近邻搜索具有方向向量的点
【发布时间】:2014-02-11 04:00:58
【问题描述】:

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

非常感谢。

【问题讨论】:

  • 您能否还包括您正在处理的大致点数的详细信息?您当前的算法有多快/多慢?你想优化什么?速度?记忆?代码清晰?我的第一直觉是尝试将其表述为凸优化问题,因为将最近点返回到一组点的函数是凸函数,而您的约束似乎是线性的。
  • 大致处理 8k 到 15K 点。希望优化速度 - 内存绝对不是问题。谢谢!

标签: nearest-neighbor kdtree


【解决方案1】:

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

【讨论】:

  • 3D 方向应该被分解成 3D 向量(cos(phi)*cos(theta), cos(phi)*sin(theta), sin(phi)) 对吧?即单位球面上的一个点。
  • @wcochran 您的建议与维基百科en.wikipedia.org/wiki/Spherical_coordinate_system 上引用的极坐标->笛卡尔公式略有不同,但它可能仍然有效。我的三角/代数太生疏了,无法快速判断它们是否相等。
  • 来自维基百科 - 笛卡尔坐标可以从球坐标(半径 r,倾角 θ,方位角 φ)中检索,其中 r = 1,θ ∈ [0,π],φ ∈ [0, 2π ), 由 x = r cos φ sin θ, y = r sin φ sin θ, z = r cos θ
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    您的 KD-tree 是一个很好的起点。论文中针对 R 树的算法也适用于 KD 树的情况。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2014-03-04
      • 2011-10-21
      • 2019-06-15
      • 2018-03-04
      • 2019-02-17
      • 2012-04-15
      相关资源
      最近更新 更多