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


Reply via email to