Author: srowen
Date: Tue Jun 29 08:09:12 2010
New Revision: 958865
URL: http://svn.apache.org/viewvc?rev=958865&view=rev
Log:
MAHOUT-430
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java?rev=958865&r1=958864&r2=958865&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
Tue Jun 29 08:09:12 2010
@@ -169,7 +169,7 @@ abstract class AbstractSimilarity implem
while (true) {
int compare = xIndex < yIndex ? -1 : xIndex > yIndex ? 1 : 0;
- if (hasInferrer || (compare == 0)) {
+ if (hasInferrer || compare == 0) {
double x;
double y;
if (xIndex == yIndex) {
@@ -186,15 +186,17 @@ abstract class AbstractSimilarity implem
// as if the other user expressed that preference
if (compare < 0) {
// X has a value; infer Y's
- x = hasPrefTransform ?
prefTransform.getTransformedValue(xPrefs.get(xPrefIndex)) : xPrefs
- .getValue(xPrefIndex);
+ x = hasPrefTransform
+ ? prefTransform.getTransformedValue(xPrefs.get(xPrefIndex))
+ : xPrefs.getValue(xPrefIndex);
y = inferrer.inferPreference(userID2, xIndex);
} else {
// compare > 0
// Y has a value; infer X's
x = inferrer.inferPreference(userID1, yIndex);
- y = hasPrefTransform ?
prefTransform.getTransformedValue(yPrefs.get(yPrefIndex)) : yPrefs
- .getValue(yPrefIndex);
+ y = hasPrefTransform
+ ? prefTransform.getTransformedValue(yPrefs.get(yPrefIndex))
+ : yPrefs.getValue(yPrefIndex);
}
}
sumXY += x * y;
@@ -208,15 +210,35 @@ abstract class AbstractSimilarity implem
}
if (compare <= 0) {
if (++xPrefIndex >= xLength) {
- break;
+ if (hasInferrer) {
+ // Must count other Ys; pretend next X is far away
+ if (yIndex == Long.MAX_VALUE) {
+ // ... but stop if both are done!
+ break;
+ }
+ xIndex = Long.MAX_VALUE;
+ } else {
+ break;
+ }
+ } else {
+ xIndex = xPrefs.getItemID(xPrefIndex);
}
- xIndex = xPrefs.getItemID(xPrefIndex);
}
if (compare >= 0) {
if (++yPrefIndex >= yLength) {
- break;
+ if (hasInferrer) {
+ // Must count other Xs; pretend next Y is far away
+ if (xIndex == Long.MAX_VALUE) {
+ // ... but stop if both are done!
+ break;
+ }
+ yIndex = Long.MAX_VALUE;
+ } else {
+ break;
+ }
+ } else {
+ yIndex = yPrefs.getItemID(yPrefIndex);
}
- yIndex = yPrefs.getItemID(yPrefIndex);
}
}
Modified:
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java?rev=958865&r1=958864&r2=958865&view=diff
==============================================================================
---
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
(original)
+++
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
Tue Jun 29 08:09:12 2010
@@ -17,9 +17,14 @@
package org.apache.mahout.cf.taste.impl.similarity;
+import java.util.Collection;
+
+import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.Weighting;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
+import org.apache.mahout.cf.taste.similarity.PreferenceInferrer;
+import org.apache.mahout.cf.taste.similarity.UserSimilarity;
/** <p>Tests {...@link PearsonCorrelationSimilarity}.</p> */
public final class PearsonCorrelationSimilarityTest extends SimilarityTestCase
{
@@ -217,4 +222,25 @@ public final class PearsonCorrelationSim
new PearsonCorrelationSimilarity(getDataModel()).refresh(null);
}
+ public void testInferrer() throws Exception {
+ DataModel dataModel = getDataModel(
+ new long[] {1, 2},
+ new Double[][] {
+ {null, 1.0, 2.0, null, null, 6.0},
+ {1.0, 8.0, null, 3.0, 4.0, null},
+ });
+ UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
+ similarity.setPreferenceInferrer(new PreferenceInferrer() {
+ @Override
+ public float inferPreference(long userID, long itemID) {
+ return 1.0f;
+ }
+ @Override
+ public void refresh(Collection<Refreshable> alreadyRefreshed) {
+ }
+ });
+
+ assertEquals(-0.435285750066007, similarity.userSimilarity(1L, 2L));
+ }
+
}