Author: srowen
Date: Fri Nov 7 03:01:09 2008
New Revision: 712108
URL: http://svn.apache.org/viewvc?rev=712108&view=rev
Log:
Favor null rescorers over NullRescorer for modest performance gains
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
Fri Nov 7 03:01:09 2008
@@ -129,12 +129,7 @@
}
int intersectionSize = 0;
- List<RecommendedItem> recommendedItems;
- if (rescorer == null) {
- recommendedItems = recommender.recommend(id, at);
- } else {
- recommendedItems = recommender.recommend(id, at, rescorer);
- }
+ List<RecommendedItem> recommendedItems = recommender.recommend(id,
at, rescorer);
for (RecommendedItem recommendedItem : recommendedItems) {
if (relevantItems.contains(recommendedItem.getItem())) {
intersectionSize++;
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
Fri Nov 7 03:01:09 2008
@@ -49,7 +49,7 @@
* with a [EMAIL PROTECTED] org.apache.mahout.cf.taste.recommender.Rescorer}
that does nothing.</p>
*/
public List<RecommendedItem> recommend(Object userID, int howMany) throws
TasteException {
- return recommend(userID, howMany, NullRescorer.getItemInstance());
+ return recommend(userID, howMany, null);
}
/**
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
Fri Nov 7 03:01:09 2008
@@ -32,15 +32,19 @@
private final Rescorer<Item> rescorer;
ByRescoreComparator(Rescorer<Item> rescorer) {
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
this.rescorer = rescorer;
}
public int compare(RecommendedItem o1, RecommendedItem o2) {
- double rescored1 = rescorer.rescore(o1.getItem(), o1.getValue());
- double rescored2 = rescorer.rescore(o2.getItem(), o2.getValue());
+ double rescored1;
+ double rescored2;
+ if (rescorer == null) {
+ rescored1 = o1.getValue();
+ rescored2 = o2.getValue();
+ } else {
+ rescored1 = rescorer.rescore(o1.getItem(), o1.getValue());
+ rescored2 = rescorer.rescore(o2.getItem(), o2.getValue());
+ }
if (rescored1 < rescored2) {
return 1;
} else if (rescored1 > rescored2) {
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
Fri Nov 7 03:01:09 2008
@@ -83,9 +83,6 @@
if (howMany < 1) {
throw new IllegalArgumentException("howMany must be at least 1");
}
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
log.debug("Recommending items for user ID '{}'", userID);
@@ -116,30 +113,24 @@
}
public List<RecommendedItem> mostSimilarItems(Object itemID, int howMany)
throws TasteException {
- return mostSimilarItems(itemID, howMany,
NullRescorer.getItemItemPairInstance());
+ return mostSimilarItems(itemID, howMany, null);
}
public List<RecommendedItem> mostSimilarItems(Object itemID,
int howMany,
Rescorer<Pair<Item, Item>>
rescorer) throws TasteException {
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
Item toItem = getDataModel().getItem(itemID);
TopItems.Estimator<Item> estimator = new MostSimilarEstimator(toItem,
similarity, rescorer);
return doMostSimilarItems(itemID, howMany, estimator);
}
public List<RecommendedItem> mostSimilarItems(List<Object> itemIDs, int
howMany) throws TasteException {
- return mostSimilarItems(itemIDs, howMany,
NullRescorer.getItemItemPairInstance());
+ return mostSimilarItems(itemIDs, howMany, null);
}
public List<RecommendedItem> mostSimilarItems(List<Object> itemIDs,
int howMany,
Rescorer<Pair<Item, Item>>
rescorer) throws TasteException {
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
DataModel model = getDataModel();
List<Item> toItems = new ArrayList<Item>(itemIDs.size());
for (Object itemID : itemIDs) {
@@ -153,7 +144,7 @@
for (Item item : toItems) {
allItems.remove(item);
}
- return TopItems.getTopItems(howMany, allItems,
NullRescorer.getItemInstance(), estimator);
+ return TopItems.getTopItems(howMany, allItems, null, estimator);
}
public List<RecommendedItem> recommendedBecause(Object userID,
@@ -181,7 +172,7 @@
}
allUserItems.remove(recommendedItem);
- return TopItems.getTopItems(howMany, allUserItems,
NullRescorer.getItemInstance(), estimator);
+ return TopItems.getTopItems(howMany, allUserItems, null, estimator);
}
private List<RecommendedItem> doMostSimilarItems(Object itemID,
@@ -194,7 +185,7 @@
allItems.add(item);
}
allItems.remove(toItem);
- return TopItems.getTopItems(howMany, allItems,
NullRescorer.getItemInstance(), estimator);
+ return TopItems.getTopItems(howMany, allItems, null, estimator);
}
private double doEstimatePreference(User theUser, Item item) throws
TasteException {
@@ -245,11 +236,11 @@
public double estimate(Item item) throws TasteException {
Pair<Item, Item> pair = new Pair<Item, Item>(toItem, item);
- if (rescorer.isFiltered(pair)) {
+ if (rescorer != null && rescorer.isFiltered(pair)) {
return Double.NaN;
}
double originalEstimate = similarity.itemSimilarity(toItem, item);
- return rescorer.rescore(pair, originalEstimate);
+ return rescorer == null ? originalEstimate : rescorer.rescore(pair,
originalEstimate);
}
}
@@ -284,11 +275,13 @@
RunningAverage average = new FullRunningAverage();
for (Item toItem : toItems) {
Pair<Item, Item> pair = new Pair<Item, Item>(toItem, item);
- if (rescorer.isFiltered(pair)) {
+ if (rescorer != null && rescorer.isFiltered(pair)) {
continue;
}
double estimate = similarity.itemSimilarity(toItem, item);
- estimate = rescorer.rescore(pair, estimate);
+ if (rescorer != null) {
+ estimate = rescorer.rescore(pair, estimate);
+ }
average.addDatum(estimate);
}
return average.getAverage();
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=712108&r1=712107&r2=712108&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
Fri Nov 7 03:01:09 2008
@@ -75,9 +75,6 @@
if (howMany < 1) {
throw new IllegalArgumentException("howMany must be at least 1");
}
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
log.debug("Recommending items for user ID '{}'", userID);
@@ -113,15 +110,12 @@
}
public List<User> mostSimilarUsers(Object userID, int howMany) throws
TasteException {
- return mostSimilarUsers(userID, howMany,
NullRescorer.getUserUserPairInstance());
+ return mostSimilarUsers(userID, howMany, null);
}
public List<User> mostSimilarUsers(Object userID,
int howMany,
Rescorer<Pair<User, User>> rescorer)
throws TasteException {
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
User toUser = getDataModel().getUser(userID);
TopItems.Estimator<User> estimator = new MostSimilarEstimator(toUser,
similarity, rescorer);
return doMostSimilarUsers(userID, howMany, estimator);
@@ -137,7 +131,7 @@
allUsers.add(user);
}
allUsers.remove(toUser);
- return TopItems.getTopUsers(howMany, allUsers,
NullRescorer.getUserInstance(), estimator);
+ return TopItems.getTopUsers(howMany, allUsers, null, estimator);
}
private double doEstimatePreference(User theUser, Collection<User>
theNeighborhood, Item item)
@@ -203,11 +197,11 @@
public double estimate(User user) throws TasteException {
Pair<User, User> pair = new Pair<User, User>(toUser, user);
- if (rescorer.isFiltered(pair)) {
+ if (rescorer != null && rescorer.isFiltered(pair)) {
return Double.NaN;
}
double originalEstimate = similarity.userSimilarity(toUser, user);
- return rescorer.rescore(pair, originalEstimate);
+ return rescorer == null ? originalEstimate : rescorer.rescore(pair,
originalEstimate);
}
}
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
Fri Nov 7 03:01:09 2008
@@ -77,9 +77,6 @@
if (howMany < 1) {
throw new IllegalArgumentException("howMany must be at least 1");
}
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
log.debug("Recommending items for user ID '{}'", userID);
checkAverageDiffsBuilt();
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
Fri Nov 7 03:01:09 2008
@@ -82,9 +82,6 @@
if (howMany < 1) {
throw new IllegalArgumentException("howMany must be at least 1");
}
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
log.debug("Recommending items for user ID '{}'", userID);
checkAverageDiffsBuilt();
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
Fri Nov 7 03:01:09 2008
@@ -44,15 +44,15 @@
Iterable<Item> allItems,
Rescorer<Item> rescorer,
Estimator<Item> estimator)
throws TasteException {
- if (allItems == null || rescorer == null || estimator == null) {
+ if (allItems == null || estimator == null) {
throw new IllegalArgumentException("argument is null");
}
LinkedList<RecommendedItem> topItems = new LinkedList<RecommendedItem>();
boolean full = false;
for (Item item : allItems) {
- if (item.isRecommendable() && !rescorer.isFiltered(item)) {
+ if (item.isRecommendable() && (rescorer == null ||
!rescorer.isFiltered(item))) {
double preference = estimator.estimate(item);
- double rescoredPref = rescorer.rescore(item, preference);
+ double rescoredPref = rescorer == null ? preference :
rescorer.rescore(item, preference);
if (!Double.isNaN(rescoredPref) && (!full || rescoredPref >
topItems.getLast().getValue())) {
// I think this is faster than Collections.binarySearch() over a
LinkedList since our
// comparisons are cheap, which binarySearch() economizes at the
expense of more traversals.
@@ -84,11 +84,11 @@
LinkedList<SimilarUser> topUsers = new LinkedList<SimilarUser>();
boolean full = false;
for (User user : allUsers) {
- if (rescorer.isFiltered(user)) {
+ if (rescorer != null && rescorer.isFiltered(user)) {
continue;
}
double similarity = estimator.estimate(user);
- double rescoredSimilarity = rescorer.rescore(user, similarity);
+ double rescoredSimilarity = rescorer == null ? similarity :
rescorer.rescore(user, similarity);
if (!Double.isNaN(rescoredSimilarity) &&
(!full || rescoredSimilarity > topUsers.getLast().getSimilarity())) {
ListIterator<SimilarUser> iterator =
topUsers.listIterator(topUsers.size());
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
Fri Nov 7 03:01:09 2008
@@ -184,8 +184,8 @@
public List<RecommendedItem> recommend(Object userID, int howMany,
Rescorer<Item> rescorer)
throws TasteException {
- if (userID == null || rescorer == null) {
- throw new IllegalArgumentException("userID or rescorer is null");
+ if (userID == null) {
+ throw new IllegalArgumentException("userID is null");
}
if (howMany < 1) {
throw new IllegalArgumentException("howMany must be at least 1");
@@ -205,11 +205,11 @@
// And that the rescorer doesn't "reject".
for (RecommendedItem recommendedItem : recommended) {
Item item = recommendedItem.getItem();
- if (rescorer.isFiltered(item)) {
+ if (rescorer != null && rescorer.isFiltered(item)) {
continue;
}
if (theUser.getPreferenceFor(item.getID()) == null &&
- !Double.isNaN(rescorer.rescore(item, recommendedItem.getValue()))) {
+ (rescorer == null || !Double.isNaN(rescorer.rescore(item,
recommendedItem.getValue())))) {
rescored.add(recommendedItem);
}
}
@@ -386,7 +386,7 @@
TopItems.Estimator<Item> estimator = new Estimator(cluster);
List<RecommendedItem> topItems =
- TopItems.getTopItems(Integer.MAX_VALUE, allItems,
NullRescorer.getItemInstance(), estimator);
+ TopItems.getTopItems(Integer.MAX_VALUE, allItems, null, estimator);
log.debug("Recommendations are: {}", topItems);
return Collections.unmodifiableList(topItems);
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
Fri Nov 7 03:01:09 2008
@@ -150,8 +150,8 @@
public List<RecommendedItem> recommend(Object userID, int howMany,
Rescorer<Item> rescorer)
throws TasteException {
- if (userID == null || rescorer == null) {
- throw new IllegalArgumentException("userID or rescorer is null");
+ if (userID == null) {
+ throw new IllegalArgumentException("userID is null");
}
if (howMany < 1) {
throw new IllegalArgumentException("howMany must be at least 1");
@@ -171,11 +171,11 @@
// And that the rescorer doesn't "reject".
for (RecommendedItem recommendedItem : recommended) {
Item item = recommendedItem.getItem();
- if (rescorer.isFiltered(item)) {
+ if (rescorer != null && rescorer.isFiltered(item)) {
continue;
}
if (theUser.getPreferenceFor(item.getID()) == null &&
- !Double.isNaN(rescorer.rescore(item, recommendedItem.getValue()))) {
+ (rescorer == null || !Double.isNaN(rescorer.rescore(item,
recommendedItem.getValue())))) {
rescored.add(recommendedItem);
}
}
@@ -469,7 +469,7 @@
TopItems.Estimator<Item> estimator = new Estimator(cluster);
List<RecommendedItem> topItems =
- TopItems.getTopItems(Integer.MAX_VALUE, allItems,
NullRescorer.getItemInstance(), estimator);
+ TopItems.getTopItems(Integer.MAX_VALUE, allItems, null, estimator);
log.debug("Recommendations are: {}", topItems);
return Collections.unmodifiableList(topItems);
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
Fri Nov 7 03:01:09 2008
@@ -105,9 +105,7 @@
if (howMany < 1) {
throw new IllegalArgumentException("howMany must be at least 1");
}
- if (rescorer == null) {
- throw new IllegalArgumentException("rescorer is null");
- }
+
log.debug("Recommending items for user ID '{}'", userID);
User theUser = getDataModel().getUser(userID);