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 23:54:45 UTC

svn commit: r901909 - 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 22:54:45 2010
New Revision: 901909

URL: http://svn.apache.org/viewvc?rev=901909&view=rev
Log:
More small tweaks

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=901909&r1=901908&r2=901909&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 22:54:45 2010
@@ -76,7 +76,7 @@
       w[i] = -ri;
     }
 
-    for (int iteration = MAX_ITERATIONS; iteration > 0; iteration--) {
+    for (int iteration = 0; iteration < MAX_ITERATIONS; iteration++) {
 
       // z = A*w;
       for (int i = 0; i < k; i++) {

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=901909&r1=901908&r2=901909&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 22:54:45 2010
@@ -27,6 +27,8 @@
 
   private static final double EPSILON = 1.0e-10;
   private static final double CONVERGENCE_LIMIT = 0.1;
+  private static final int MAX_ITERATIONS = 1000;
+  private static final double DEFAULT_STEP = 0.001;
 
   /**
    * Non-negative Quadratic Optimization.
@@ -42,10 +44,9 @@
     double[] x = new double[k];
     Arrays.fill(x, 3.0 / (double) k);
 
-    double rdot;
-    do {
+    for (int iteration = 0; iteration < MAX_ITERATIONS; iteration++) {
 
-      rdot = 0.0;
+      double rdot = 0.0;
       for (int n = 0; n < k; n++) {
         double sumAw = 0.0;
         double[] An = A[n];
@@ -66,6 +67,10 @@
         r[n] = rn;
       }
 
+      if (rdot <= CONVERGENCE_LIMIT) {
+        break;
+      }
+
       // max step size denominator
       double rArdotSum = 0.0;
       for (int n = 0; n < k; n++) {
@@ -81,13 +86,14 @@
       double stepSize = rdot / rArdotSum;
 
       if (Double.isNaN(stepSize)) {
-        stepSize = 0.001;
+        stepSize = DEFAULT_STEP;
       }
 
       // adjust step size to prevent negative values
       for (int n = 0; n < k; n++) {
         if (r[n] < 0.0) {
-          stepSize = Math.min(Math.abs(stepSize), Math.abs(x[n] / r[n])) * stepSize / Math.abs(stepSize);
+          double absStepSize = stepSize < 0.0 ? -stepSize : stepSize;
+          stepSize = Math.min(absStepSize, Math.abs(x[n] / r[n])) * stepSize / absStepSize;
         }
       }
 
@@ -99,12 +105,8 @@
         }
       }
 
-      /*
-      if (rdot > (20 * k) || Double.isNaN(rdot) || (iteration > 5000)) {
-        //TODO: do something in case of divergence
-      }
-       */
-    } while (rdot > CONVERGENCE_LIMIT);
+      //TODO: do something in case of divergence
+    }
 
     return x;
   }