Author: srowen
Date: Tue Nov 16 22:08:46 2010
New Revision: 1035833
URL: http://svn.apache.org/viewvc?rev=1035833&view=rev
Log:
Experimental try at GenericBooleanPrefItemBasedRecommender
Added:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefItemBasedRecommender.java
- copied, changed from r1034019,
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java
Copied:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefItemBasedRecommender.java
(from r1034019,
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java)
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefItemBasedRecommender.java?p2=mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefItemBasedRecommender.java&p1=mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java&r1=1034019&r2=1035833&rev=1035833&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefItemBasedRecommender.java
Tue Nov 16 22:08:46 2010
@@ -18,62 +18,46 @@
package org.apache.mahout.cf.taste.impl.recommender;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
-import org.apache.mahout.cf.taste.similarity.UserSimilarity;
+import org.apache.mahout.cf.taste.model.PreferenceArray;
+import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
/**
- * A variant on {...@link GenericUserBasedRecommender} which is appropriate
for use when no notion of preference
+ * A variant on {...@link GenericItemBasedRecommender} which is appropriate
for use when no notion of preference
* value exists in the data.
+ *
+ * @see
org.apache.mahout.cf.taste.impl.recommender.GenericBooleanPrefUserBasedRecommender
*/
-public final class GenericBooleanPrefUserBasedRecommender extends
GenericUserBasedRecommender {
-
- public GenericBooleanPrefUserBasedRecommender(DataModel dataModel,
- UserNeighborhood neighborhood,
- UserSimilarity similarity) {
- super(dataModel, neighborhood, similarity);
+public final class GenericBooleanPrefItemBasedRecommender extends
GenericItemBasedRecommender {
+
+ public GenericBooleanPrefItemBasedRecommender(DataModel dataModel,
ItemSimilarity similarity) {
+ super(dataModel, similarity);
}
/**
* This computation is in a technical sense, wrong, since in the domain of
"boolean preference users" where
* all preference values are 1, this method should only ever return 1.0 or
NaN. This isn't terribly useful
* however since it means results can't be ranked by preference value (all
are 1). So instead this returns a
- * sum of similarities to any other user in the neighborhood who has also
rated the item.
+ * sum of similarities.
*/
@Override
- protected float doEstimatePreference(long theUserID, long[] theNeighborhood,
long itemID) throws TasteException {
- if (theNeighborhood.length == 0) {
- return Float.NaN;
- }
- DataModel dataModel = getDataModel();
- UserSimilarity similarity = getSimilarity();
- float totalSimilarity = 0.0f;
+ protected float doEstimatePreference(long userID, long itemID) throws
TasteException {
+ PreferenceArray prefs = getDataModel().getPreferencesFromUser(userID);
+ double[] similarities = getSimilarity().itemSimilarities(itemID,
prefs.getIDs());
boolean foundAPref = false;
- for (long userID : theNeighborhood) {
- // See GenericItemBasedRecommender.doEstimatePreference() too
- if ((userID != theUserID) && (dataModel.getPreferenceValue(userID,
itemID) != null)) {
+ double totalSimilarity = 0.0;
+ for (double theSimilarity : similarities) {
+ if (!Double.isNaN(theSimilarity)) {
foundAPref = true;
- totalSimilarity += similarity.userSimilarity(theUserID, userID);
+ totalSimilarity += theSimilarity;
}
}
- return foundAPref ? totalSimilarity : Float.NaN;
- }
-
- @Override
- protected FastIDSet getAllOtherItems(long[] theNeighborhood, long theUserID)
throws TasteException {
- DataModel dataModel = getDataModel();
- FastIDSet possibleItemIDs = new FastIDSet();
- for (long userID : theNeighborhood) {
- possibleItemIDs.addAll(dataModel.getItemIDsFromUser(userID));
- }
- possibleItemIDs.removeAll(dataModel.getItemIDsFromUser(theUserID));
- return possibleItemIDs;
+ return foundAPref ? (float) totalSimilarity : Float.NaN;
}
@Override
public String toString() {
- return "GenericBooleanPrefUserBasedRecommender";
+ return "GenericBooleanPrefItemBasedRecommender";
}
}