Author: srowen
Date: Sun May 10 19:13:37 2009
New Revision: 773386
URL: http://svn.apache.org/viewvc?rev=773386&view=rev
Log:
Removed unneeded check for NaN and further rationalized behavior of 'estimated
preference' in BooleanUserGenericUserBasedRecommender
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/BooleanUserGenericUserBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/BooleanUserGenericUserBasedRecommender.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/BooleanUserGenericUserBasedRecommender.java?rev=773386&r1=773385&r2=773386&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/BooleanUserGenericUserBasedRecommender.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/BooleanUserGenericUserBasedRecommender.java
Sun May 10 19:13:37 2009
@@ -171,25 +171,30 @@
return TopItems.getTopUsers(howMany, allUsers, null, estimator);
}
+ /**
+ * 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 similarties to any other user in the
neighborhood who has also
+ * rated the item.
+ */
private double doEstimatePreference(User theUser, Collection<User>
theNeighborhood, Object itemID)
throws TasteException {
if (theNeighborhood.isEmpty()) {
return Double.NaN;
}
double totalSimilarity = 0.0;
+ boolean foundAPref = false;
for (User user : theNeighborhood) {
if (!user.equals(theUser)) {
// See GenericItemBasedRecommender.doEstimatePreference() too
- Preference pref = user.getPreferenceFor(itemID);
- if (pref != null) {
- double theSimilarity = similarity.userSimilarity(theUser, user) +
1.0;
- if (!Double.isNaN(theSimilarity)) {
- totalSimilarity += theSimilarity;
- }
+ if (user.getPreferenceFor(itemID) != null) {
+ foundAPref = true;
+ totalSimilarity += similarity.userSimilarity(theUser, user);
}
}
}
- return totalSimilarity == 0.0 ? Double.NaN : totalSimilarity;
+ return foundAPref ? totalSimilarity : 0.0;
}
private static Set<Object> getAllOtherItems(Iterable<User> theNeighborhood,
User theUser) {
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java?rev=773386&r1=773385&r2=773386&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
Sun May 10 19:13:37 2009
@@ -144,10 +144,11 @@
Preference pref = user.getPreferenceFor(item.getID());
if (pref != null) {
double theSimilarity = similarity.userSimilarity(theUser, user) +
1.0;
- if (!Double.isNaN(theSimilarity)) {
- preference += theSimilarity * pref.getValue();
- totalSimilarity += theSimilarity;
- }
+ // Similarity should not be NaN or else the user should never have
showed up
+ // in the neighborhood. Adding 1.0 puts this in the range [0,2]
which is
+ // more appropriate for weights
+ preference += theSimilarity * pref.getValue();
+ totalSimilarity += theSimilarity;
}
}
}