[mlpack-git] master: Update FirstBound correctly. Trivial speedup. (dea4b29)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Thu Mar 12 16:02:14 EDT 2015


Repository : https://github.com/mlpack/mlpack

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/eddd7167d69b6c88b271ef2e51d1c20e13f1acd8...70342dd8e5c17e0c164cfb8189748671e9c0dd44

>---------------------------------------------------------------

commit dea4b29b7185423243ee958d6ffb76c8ff9eaac7
Author: Ryan Curtin <ryan at ratml.org>
Date:   Wed Jan 14 10:58:27 2015 -0500

    Update FirstBound correctly. Trivial speedup.


>---------------------------------------------------------------

dea4b29b7185423243ee958d6ffb76c8ff9eaac7
 src/mlpack/methods/kmeans/dual_tree_kmeans.hpp      |  3 ++-
 src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp | 12 +++++++++---
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/mlpack/methods/kmeans/dual_tree_kmeans.hpp b/src/mlpack/methods/kmeans/dual_tree_kmeans.hpp
index ebeb0ed..27bcf25 100644
--- a/src/mlpack/methods/kmeans/dual_tree_kmeans.hpp
+++ b/src/mlpack/methods/kmeans/dual_tree_kmeans.hpp
@@ -58,7 +58,8 @@ class DualTreeKMeans
   //! Track distance calculations.
   size_t distanceCalculations;
 
-  void ClusterTreeUpdate(TreeType* node);
+  void ClusterTreeUpdate(TreeType* node,
+                         const arma::mat& distances);
 
   void TreeUpdate(TreeType* node,
                   const size_t clusters,
diff --git a/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp b/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp
index 88c4e96..ed51137 100644
--- a/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp
+++ b/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp
@@ -81,7 +81,7 @@ double DualTreeKMeans<MetricType, MatType, TreeType>::Iterate(
   distanceCalculations += nns.Scores();
 
   // Update FirstBound().
-  ClusterTreeUpdate(centroidTree);
+  ClusterTreeUpdate(centroidTree, interclusterDistances);
 
   // Now run the dual-tree algorithm.
   typedef DualTreeKMeansRules<MetricType, TreeType> RulesType;
@@ -133,16 +133,22 @@ double DualTreeKMeans<MetricType, MatType, TreeType>::Iterate(
 
 template<typename MetricType, typename MatType, typename TreeType>
 void DualTreeKMeans<MetricType, MatType, TreeType>::ClusterTreeUpdate(
-    TreeType* node)
+    TreeType* node,
+    const arma::mat& distances)
 {
   // Just update the first bound, after recursing to the bottom.
   double firstBound = 0.0;
   for (size_t i = 0; i < node->NumChildren(); ++i)
   {
-    ClusterTreeUpdate(&node->Child(i));
+    ClusterTreeUpdate(&node->Child(i), distances);
     if (node->Child(i).Stat().FirstBound() >= firstBound)
       firstBound = node->Child(i).Stat().FirstBound();
   }
+  for (size_t i = 0; i < node->NumPoints(); ++i)
+  {
+    if (distances(1, node->Point(i)) > firstBound)
+      firstBound = distances(1, node->Point(i));
+  }
 
   node->Stat().FirstBound() = firstBound;
 }



More information about the mlpack-git mailing list