【发布时间】: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