【问题标题】:3D Nearest neighbour for query points located far away from set of points远离点集的查询点的 3D 最近邻
【发布时间】:2017-02-16 22:59:53
【问题描述】:

我需要回答很多关于在点集中找到最近邻居的问题,它离查询点很远。到目前为止,我发现的所有方法在这种情况下都不好用(例如,kd 树每个查询可能有 O(N))或需要使用 Voronoi 图(我有大约 10m 点,所以 Voronoi 图太贵了)。
有没有为此类任务设计的已知算法?

【问题讨论】:

  • 等等,你的意思是你试图解决k-NN问题并且你设置k太大了?或者查询离点集很远?
  • 我的意思是我有一堆点,它们彼此相对接近。但是我的查询点远离这个云(可以说,所有点云都在立方体中,中心在 (0;0;0) 和边缘大小为 1,查询点在 (2;0;0), (4; 1;3) 等等)。在这种情况下,K-d 树和其他典型树效果不佳,需要花费太多时间来回答查询。
  • 如何仅在具有 k
  • geoalgo,似乎仅在位于最佳 Voronoi 单元的 kd-tree 中进行搜索是不够的。真正的最近点很容易在其他 Voronoi 单元中(并且误差可能很大)。但这个想法很有趣。

标签: algorithm search data-structures computational-geometry nearest-neighbor


【解决方案1】:

一些多维索引具有 kNN 查询,可以轻松适应您的需求,尤其是在 k==1 的情况下。 kNN 算法通常必须首先估计近似最近邻距离,然后他们使用这个距离来执行范围查询。 在 R-Tree 或四叉树中,可以通过找到最接近您的搜索点的节点来有效地完成此估计。然后他们从最近的节点取一个点,计算到搜索点的距离,然后根据这个距离进行范围查询,通常有一些乘数,因为 k>1。 即使搜索点很远,这也应该是合理有效的。

如果您只搜索一个点 (k=1),那么您可以调整此算法以使用完全基于您找到的最近点的范围查询,无需额外扩展即可获得 k>1 个点。

如果您使用 Java,您可以使用我的开源实现 here。还有一个PH-Tree(一种四叉树,但空间效率更高,加载速度更快),它使用相同的 kNN 方法。

【讨论】:

    【解决方案2】:

    这里的问题是距离。你看,当查询离你的数据集很远时,kd-tree 必须检查很多点,从而减慢查询时间。

    您所面临的场景对于最近邻结构来说通常是困难的(这不是通常的情况),但如果我是您,我会尝试使用Balanced Box-Decomposition trees,您可以在其中阅读有关他们算法的更多信息和数据结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2018-02-11
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多