You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by sr...@apache.org on 2010/01/21 22:50:48 UTC

svn commit: r901872 - in /lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn: ConjugateGradientOptimizer.java NonNegativeQuadraticOptimizer.java

Author: srowen
Date: Thu Jan 21 21:50:47 2010
New Revision: 901872

URL: http://svn.apache.org/viewvc?rev=901872&view=rev
Log:
A little optimization and limit CGO iterations

Modified:
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/ConjugateGradientOptimizer.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/NonNegativeQuadraticOptimizer.java

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/ConjugateGradientOptimizer.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/ConjugateGradientOptimizer.java?rev=901872&r1=901871&r2=901872&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/ConjugateGradientOptimizer.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/ConjugateGradientOptimizer.java Thu Jan 21 21:50:47 2010
@@ -21,6 +21,9 @@
 
 public final class ConjugateGradientOptimizer implements Optimizer {
 
+  private static final double CONVERGENCE_LIMIT = 0.1;
+  private static final int MAX_ITERATIONS = 1000;
+
   /**
    * <p>Conjugate gradient optimization. Matlab code:</p>
    *
@@ -68,11 +71,12 @@
       for (int j = 0; j < k; j++) {
         v += Ai[j] * x[j];
       }
-      r[i] = b[i] - v;
-      w[i] = -r[i];
+      double ri = b[i] - v;
+      r[i] = ri;
+      w[i] = -ri;
     }
 
-    while (true) {
+    for (int iteration = MAX_ITERATIONS; iteration > 0; iteration--) {
 
       // z = A*w;
       for (int i = 0; i < k; i++) {
@@ -103,9 +107,10 @@
       // stop when residual is close to 0
       double rdot = 0.0;
       for (int i = 0; i < k; i++) {
-        rdot += r[i] * r[i];
+        double value = r[i];
+        rdot += value * value;
       }
-      if (rdot < 0.1) {
+      if (rdot <= CONVERGENCE_LIMIT) {
         break;
       }
 
@@ -113,8 +118,9 @@
       double Bnum = 0.0;
       double Bden = 0.0;
       for (int i = 0; i < k; i++) {
-        Bnum += r[i] * z[i];
-        Bden += w[i] * z[i];
+        double zi = z[i];
+        Bnum += r[i] * zi;
+        Bden += w[i] * zi;
       }
       double B = Bnum / Bden;
 

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/NonNegativeQuadraticOptimizer.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/NonNegativeQuadraticOptimizer.java?rev=901872&r1=901871&r2=901872&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/NonNegativeQuadraticOptimizer.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/NonNegativeQuadraticOptimizer.java Thu Jan 21 21:50:47 2010
@@ -25,6 +25,9 @@
  */
 public final class NonNegativeQuadraticOptimizer implements Optimizer {
 
+  private static final double EPSILON = 1.0e-10;
+  private static final double CONVERGENCE_LIMIT = 0.1;
+
   /**
    * Non-negative Quadratic Optimization.
    *
@@ -50,16 +53,17 @@
           sumAw += An[i] * x[i];
         }
         // r = b - Ax; // the residual, or 'steepest gradient'
-        r[n] = b[n] - sumAw;
+        double rn = b[n] - sumAw;
 
         // find active variables - those that are pinned due to
         // nonnegativity constraints; set respective ri's to zero
-        if ((x[n] < 1.0e-10) && (r[n] < 0.0)) {
-          r[n] = 0.0;
+        if ((x[n] < EPSILON) && (rn < 0.0)) {
+          rn = 0.0;
+        } else {
+          // max step size numerator
+          rdot += rn * rn;
         }
-
-        // max step size numerator
-        rdot += r[n] * r[n];
+        r[n] = rn;
       }
 
       // max step size denominator
@@ -90,7 +94,7 @@
       // update x values
       for (int n = 0; n < k; n++) {
         x[n] += stepSize * r[n];
-        if (x[n] < 1.0e-10) {
+        if (x[n] < EPSILON) {
           x[n] = 0.0;
         }
       }
@@ -100,7 +104,7 @@
         //TODO: do something in case of divergence
       }
        */
-    } while (rdot > 0.1);
+    } while (rdot > CONVERGENCE_LIMIT);
 
     return x;
   }