【问题标题】:k nearest neighbors graph implementation in JavaJava中的k个最近邻图实现
【发布时间】:2012-08-03 12:54:18
【问题描述】:

我正在实施一个火焰聚类算法,作为一种学习更多关于图和图遍历的方法,第一步是构建一个 K-最近邻图,我想知道最快的方法是什么运行一个节点列表并连接每个节点只是说它是最近的五个邻居。我的想法是,我将从一个节点开始,遍历其他节点的列表,并将最接近的节点保留在数组中,确保丢弃前 n 之后的所有内容。现在,我可以通过对列表进行排序并保留前 n 个条目来做到这一点,但我宁愿在内存中保留更少的东西,所以我想知道是否有办法只拥有最终数组并将该数组更新为我遍历,或者是否有更有效的方法来生成 ak 最近邻图。

另外,请注意,这不是 K-Nearest Neighbour Implementation in Java 的副本。 KNNG 不同于 KNN。

【问题讨论】:

    标签: java graph nearest-neighbor


    【解决方案1】:

    我认为最有效的方法是使用绑定优先级队列,例如 https://github.com/tdebatty/java-graphs#bounded-priority-queue

    【讨论】:

      【解决方案2】:

      将前 n 个节点按列表排序。然后遍历其余节点,如果它适合当前列表(即是前 n 个节点),则将其放在列表中的相应位置并丢弃最后一个前 n 个节点。如果它不适合前 n 个列表,则丢弃它。

      for each neighborNode
       for(int i = 0; i < topNList.size(); i++){
             if((dist = distanceMetric(neighborNode,currentNode)) > topNList.get(i).distance){
                   topNList.remove(topNList.size()-1)
                   neighborNode.setDistance(dist);
                   topNList.add(i, neighborNode);
             }
      

      【讨论】:

      • 我喜欢这个答案,但我想知道在每次迭代中遍历邻居的成本有多糟糕。如果没有别的,我会接受这一点,但我相信这会将效率降低 n 倍(邻居数),使其更像 O(nm^2),这是不理想的。我更喜欢低于 O(m^2) 的东西,但我不能说这不能解决问题。
      • 现在我明白了。您想计算图中每个节点的 knn。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2014-04-12
      • 2011-10-23
      • 2012-07-19
      相关资源
      最近更新 更多