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;