【问题标题】:K-d tree: nearest neighbor search algorithm with tractable pseudo codeK-d 树:具有易处理伪代码的最近邻搜索算法
【发布时间】:2019-12-20 17:09:10
【问题描述】:

Wikipedia 中最近邻 (NN) 搜索的伪代码对我来说不够好处理。几乎没有更多可用于实现的帖子,但它们似乎是特定于语言的。所以我发现很难理解 NN 搜索是如何工作的。此图取自https://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/kdtrees.pdf。我试图用一个特定的案例来理解它,比如查询点 Q = (52,52)。 假设两个 dim 是 (x,y) 并且根级别由 x-dim 分割。

搜索神经网络:

首先,我从根向下到叶子,就好像我在尝试插入 Q;这样做,叶子是(55,1)。将(全局)var current_best 从 INFINITY 更新为 (55-52)2 + (1-52)2 = 2610。

接下来,我上升到 (70,70) 并将 current_best 从 2610 更新为 182+182=648。由于这提供了更好的距离,我们必须探查它的子树:这是正确的理解吗?

此外,我们看到节点 (60,80) 没有给出更好的结果(即 current_best 没有更新)。

在进一步上升的过程中,我们发现 root (51,75) 给出了更好的结果(current_best 设置为 530)。所以,应用我的理解,我们必须检查它的其他子树。

(25,40) 没有产生更好的结果。我的理解是我们仍然需要验证(25,40)的子树。但是,在这种情况下,由于该节点使用 y-dim,并且由于 Qy > 40,我们只需要检查右子树(以 (35,90) 为根):这样理解正确吗?

简而言之,我看到的是,如果一个节点为 current_distance 提供了更好的结果,我们必须探测两个子节点;如果一个节点没有提供更好的结果,我们所能做的就是忽略其中一个子树,但必须根据条件探测另一个子树(按特定维度分割超平面)。 这是正确的理解吗?

最后,我非常感谢任何为 NN 搜索 Kd-tree 提供易于处理的伪代码的人

【问题讨论】:

    标签: algorithm data-structures nearest-neighbor kdtree


    【解决方案1】:

    想象一下目标点和它周围的圆盘,半径等于目前找到的最短距离(最初是无穷大)。

    您位于一棵将平面分成两个半平面的树的根部。使半径等于当前半径和目标到根的距离的最小值。然后递归到与磁盘相交的半平面,只要根有儿子。

    确保跟踪哪个根达到了最小值。

    Visit(root):
        d= distance(target, root)
        if d < r:
            r= d
            closest= root
    
        if root.left and root.x - target.x < r:
            Visit(root.left)
        if root.right and target.x - root.x < r:
            Visit(root.right)
    

    注意:半平面测试在xy 上进行,具体取决于您使用的轴选择策略。

    【讨论】:

    • @ Yves Daoust - 通过这个算法,我们将探测以 (10,30) 为根的子树 - 这似乎不需要。这是我对目标 (52,52) 的跟踪:访问 (51,75) 将设置 r=24。测试 (root.x - target.x
    • @KGhatak:你怎么知道不需要?
    • @ Yves Daoust - 我的错,确实需要。如果拐角处有一个点(51,40),那么否则就会错过。感谢您指出。
    • @KGhatak:实际上,您可以将每个根关联到它“监督”的矩形。拆分后,您有两个新的根来监督每个子矩形。您需要访问与当前磁盘相交的每个矩形。作为一种优化,您可以使用最近优先启发式。
    • @ Matt Timmermans - 我无法弄清楚优先级队列如何用于我们的优势。当距离大于当前最大值时,我们是否忽略插入孩子。添加清晰度可能会很有用(或者我遗漏了什么)
    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 2014-05-12
    • 2011-10-23
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2010-12-10
    相关资源
    最近更新 更多