Author: srowen
Date: Wed Mar  9 14:41:01 2011
New Revision: 1079817

URL: http://svn.apache.org/viewvc?rev=1079817&view=rev
Log:
MAHOUT-541 part 2, more refinement from Tamas

Modified:
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/ExpectationMaximizationSVDFactorizer.java

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/ExpectationMaximizationSVDFactorizer.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/ExpectationMaximizationSVDFactorizer.java?rev=1079817&r1=1079816&r2=1079817&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/ExpectationMaximizationSVDFactorizer.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/ExpectationMaximizationSVDFactorizer.java
 Wed Mar  9 14:41:01 2011
@@ -52,6 +52,7 @@ public final class ExpectationMaximizati
   private final DataModel dataModel;
   private final List<SVDPreference> cachedPreferences;
   private final double defaultValue;
+  private final double interval;
 
   public ExpectationMaximizationSVDFactorizer(DataModel dataModel,
                                               int numFeatures,
@@ -79,14 +80,17 @@ public final class ExpectationMaximizati
     rightVectors = new double[dataModel.getNumItems()][numFeatures];
 
     double average = getAveragePreference();
-    defaultValue = Math.sqrt((average - 1.0) / numFeatures);
+
+    double prefInterval = dataModel.getMaxPreference() - 
dataModel.getMinPreference();
+    defaultValue = Math.sqrt((average - (prefInterval * 0.1)) / numFeatures);
+    interval = (prefInterval * 0.1) / numFeatures;
 
     for (int feature = 0; feature < numFeatures; feature++) {
       for (int userIndex = 0; userIndex < dataModel.getNumUsers(); 
userIndex++) {
-        leftVectors[userIndex][feature] = defaultValue + (random.nextDouble() 
- 0.5) * randomNoise;
+          leftVectors[userIndex][feature] = defaultValue + 
(random.nextDouble() - 0.5) * interval * randomNoise;
       }
       for (int itemIndex = 0; itemIndex < dataModel.getNumItems(); 
itemIndex++) {
-        rightVectors[itemIndex][feature] = defaultValue + (random.nextDouble() 
- 0.5) * randomNoise;
+          rightVectors[itemIndex][feature] = defaultValue + 
(random.nextDouble() - 0.5) * interval * randomNoise;
       }
     }
     cachedPreferences = new ArrayList<SVDPreference>(dataModel.getNumUsers());
@@ -96,8 +100,8 @@ public final class ExpectationMaximizati
   public Factorization factorize() throws TasteException {
     cachePreferences();
     double rmse = (dataModel.getMaxPreference() - 
dataModel.getMinPreference());
-    Collections.shuffle(cachedPreferences, random);
     for (int ii = 0; ii < numFeatures; ii++) {
+      Collections.shuffle(cachedPreferences, random);
       for (int i = 0; (i < numIterations); i++) {
         double err = 0.0;
         for (SVDPreference pref : cachedPreferences) {
@@ -150,8 +154,8 @@ public final class ExpectationMaximizati
     double sum = pref.getCache();
     sum += leftVectors[i][f] * rightVectors[j][f];
     if (trailing) {
-      sum += (numFeatures - f - 1) * (defaultValue * defaultValue);
-      if (sum > dataModel.getMaxPreference()) {
+      sum += (numFeatures - f - 1) * ((defaultValue + interval) * 
(defaultValue + interval));
+      if (sum > maxPreference) {
         sum = maxPreference;
       } else if (sum < minPreference) {
         sum = minPreference;


Reply via email to