【问题标题】:How do I traverse a KDTree to find k nearest neighbors?如何遍历 KDTree 找到 k 个最近的邻居?
【发布时间】:2016-01-09 02:11:58
【问题描述】:

这个问题涉及到 KDTrees 的 KNN 搜索的实现。遍历 KDTree 以找到单个最佳匹配(最近邻)非常简单,类似于修改后的二分搜索。

如何修改遍历以彻底有效地找到 k 最佳匹配 (KNN)?

编辑澄清: 在找到与输入查询 I 最接近的节点 M 后,遍历算法如何继续找到与查询最接近的剩余 K-1 个匹配项?是否有一种遍历模式可以保证按照查询的最佳匹配到最差的顺序访问节点?

【问题讨论】:

  • 这不是link的重复;我明确表示我理解遍历以找到一个最近的邻居。该问题询问如何修改遍历以详尽地找到单个查询的 k 个最近邻居。我怀疑有一条从最初的最佳匹配返回树的有效路径,它可能会依次找到更远的邻居。

标签: nearest-neighbor knn kdtree


【解决方案1】:

您可以维护一个大小为 k 的最大堆(k 是我们想要找到的最近邻居的数量)。

从根节点开始,在最大堆节点中插入距离值。 继续使用维度拆分、标准在 k-d 树中搜索,并不断更新 Max Heap 树。

https://gopalcdas.wordpress.com/2017/05/24/construction-of-k-d-tree-and-using-it-for-nearest-neighbour-search/

~阿什

【讨论】:

    【解决方案2】:

    添加到@Ashish 的答案,您可以通过以下方式使用最大堆:

    1) Build a max-heap of the first k elements (arr[0] to arr[k-1]) of the given array. 
    

    这一步是O(k)。那么

    2) For each element, after the kth element (arr[k] to arr[n-1]), compare it with 
       root of the max-heap.
        a) If the element is smaller than the root then make it root 
           and call heapify for max-heap.
        b) Else ignore it.
    

    第2步是O((n-k)*log(k))

    3) Finally, the max-heap has k smallest elements and root of the heap 
       is the kth smallest element.
    

    时间复杂度:O(k + (n-k)*log(k)) 没有排序输出。如果需要排序输出,则 O(k + (n-k)*log(k) + k*log(k)).

    【讨论】:

      【解决方案3】:

      目前,我已经确定了执行一系列逐渐扩大的范围搜索直到找到 K 个节点的次优解决方案。

      【讨论】:

        猜你喜欢
        • 2013-03-16
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 2014-06-20
        • 2018-06-16
        相关资源
        最近更新 更多