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;
}