You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by ss...@apache.org on 2014/05/06 07:01:52 UTC
svn commit: r1592656 - in /mahout/trunk: ./
examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/
examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track1/
examples/src/main/java/org/apache/mahout/cf/taste/example/kddcu...
Author: ssc
Date: Tue May 6 05:01:51 2014
New Revision: 1592656
URL: http://svn.apache.org/r1592656
Log:
MAHOUT-1428 Recommending already consumed items
Modified:
mahout/trunk/CHANGELOG
mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingBooleanRecommender.java
mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java
mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track1/Track1Recommender.java
mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/Track2Recommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractCandidateItemsStrategy.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllSimilarItemsCandidateItemsStrategy.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategy.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategy.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/RandomRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategy.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommender.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/CandidateItemsStrategy.java
mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java
mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategyTest.java
mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommenderTest.java
mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommenderTest.java
mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/MockRecommender.java
mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategyTest.java
mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategyTest.java
mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommenderTest.java
Modified: mahout/trunk/CHANGELOG
URL: http://svn.apache.org/viewvc/mahout/trunk/CHANGELOG?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/CHANGELOG (original)
+++ mahout/trunk/CHANGELOG Tue May 6 05:01:51 2014
@@ -2,6 +2,8 @@ Mahout Change Log
Release 1.0 - unreleased
+ MAHOUT-1428: Recommending already consumed items (Dodi Hakim via ssc)
+
MAHOUT-1533: Remove Frequent Pattern Mining (ssc)
MAHOUT-1526: Ant file in examples (ssc)
Modified: mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingBooleanRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingBooleanRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingBooleanRecommender.java (original)
+++ mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingBooleanRecommender.java Tue May 6 05:01:51 2014
@@ -54,11 +54,22 @@ public final class BookCrossingBooleanRe
}
@Override
- public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
- return recommender.recommend(userID, howMany, rescorer);
+ public List<RecommendedItem> recommend(long userID, int howMany, boolean includeKnownItems) throws TasteException {
+ return recommend(userID, howMany, null, includeKnownItems);
}
@Override
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
+ return recommender.recommend(userID, howMany, rescorer, false);
+ }
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
+ return recommender.recommend(userID, howMany, rescorer, includeKnownItems);
+ }
+
+ @Override
public float estimatePreference(long userID, long itemID) throws TasteException {
return recommender.estimatePreference(userID, itemID);
}
Modified: mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java (original)
+++ mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java Tue May 6 05:01:51 2014
@@ -51,10 +51,21 @@ public final class BookCrossingRecommend
public List<RecommendedItem> recommend(long userID, int howMany) throws TasteException {
return recommender.recommend(userID, howMany);
}
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, boolean includeKnownItems) throws TasteException {
+ return recommend(userID, howMany, null, includeKnownItems);
+ }
@Override
public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
- return recommender.recommend(userID, howMany, rescorer);
+ return recommender.recommend(userID, howMany, rescorer, false);
+ }
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
+ return recommender.recommend(userID, howMany, rescorer, false);
}
@Override
Modified: mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track1/Track1Recommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track1/Track1Recommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track1/Track1Recommender.java (original)
+++ mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track1/Track1Recommender.java Tue May 6 05:01:51 2014
@@ -44,10 +44,21 @@ public final class Track1Recommender imp
public List<RecommendedItem> recommend(long userID, int howMany) throws TasteException {
return recommender.recommend(userID, howMany);
}
-
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, boolean includeKnownItems) throws TasteException {
+ return recommend(userID, howMany, null, includeKnownItems);
+ }
+
@Override
public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
- return recommender.recommend(userID, howMany, rescorer);
+ return recommender.recommend(userID, howMany, rescorer, false);
+ }
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
+ return recommender.recommend(userID, howMany, rescorer, includeKnownItems);
}
@Override
Modified: mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/Track2Recommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/Track2Recommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/Track2Recommender.java (original)
+++ mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track2/Track2Recommender.java Tue May 6 05:01:51 2014
@@ -50,10 +50,21 @@ public final class Track2Recommender imp
public List<RecommendedItem> recommend(long userID, int howMany) throws TasteException {
return recommender.recommend(userID, howMany);
}
-
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, boolean includeKnownItems) throws TasteException {
+ return recommend(userID, howMany, null, includeKnownItems);
+ }
+
@Override
public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
- return recommender.recommend(userID, howMany, rescorer);
+ return recommender.recommend(userID, howMany, rescorer, false);
+ }
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
+ return recommender.recommend(userID, howMany, rescorer, includeKnownItems);
}
@Override
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractCandidateItemsStrategy.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractCandidateItemsStrategy.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractCandidateItemsStrategy.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractCandidateItemsStrategy.java Tue May 6 05:01:51 2014
@@ -33,20 +33,25 @@ import java.util.Collection;
public abstract class AbstractCandidateItemsStrategy implements CandidateItemsStrategy,
MostSimilarItemsCandidateItemsStrategy {
- @Override
- public FastIDSet getCandidateItems(long userID, PreferenceArray preferencesFromUser, DataModel dataModel)
- throws TasteException {
- return doGetCandidateItems(preferencesFromUser.getIDs(), dataModel);
+ protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel) throws TasteException{
+ return doGetCandidateItems(preferredItemIDs, dataModel, false);
}
-
+
@Override
- public FastIDSet getCandidateItems(long[] itemIDs, DataModel dataModel) throws TasteException {
- return doGetCandidateItems(itemIDs, dataModel);
+ public FastIDSet getCandidateItems(long userID, PreferenceArray preferencesFromUser, DataModel dataModel,
+ boolean includeKnownItems) throws TasteException {
+ return doGetCandidateItems(preferencesFromUser.getIDs(), dataModel, includeKnownItems);
}
-
- protected abstract FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel) throws TasteException;
-
+
@Override
- public void refresh(Collection<Refreshable> alreadyRefreshed) {
+ public FastIDSet getCandidateItems(long[] itemIDs, DataModel dataModel)
+ throws TasteException {
+ return doGetCandidateItems(itemIDs, dataModel, false);
}
+
+ protected abstract FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel,
+ boolean includeKnownItems) throws TasteException;
+
+ @Override
+ public void refresh(Collection<Refreshable> alreadyRefreshed) {}
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java Tue May 6 05:01:51 2014
@@ -19,11 +19,13 @@ package org.apache.mahout.cf.taste.impl.
import org.apache.mahout.cf.taste.model.PreferenceArray;
import org.apache.mahout.cf.taste.recommender.CandidateItemsStrategy;
+
import java.util.List;
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.recommender.IDRescorer;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.slf4j.Logger;
@@ -51,6 +53,7 @@ public abstract class AbstractRecommende
return new PreferredItemsNeighborhoodCandidateItemsStrategy();
}
+
/**
* <p>
* Default implementation which just calls
@@ -60,7 +63,27 @@ public abstract class AbstractRecommende
*/
@Override
public List<RecommendedItem> recommend(long userID, int howMany) throws TasteException {
- return recommend(userID, howMany, null);
+ return recommend(userID, howMany, null, false);
+ }
+
+ /**
+ * <p>
+ * Default implementation which just calls
+ * {@link Recommender#recommend(long, int, org.apache.mahout.cf.taste.recommender.IDRescorer)}, with a
+ * {@link org.apache.mahout.cf.taste.recommender.Rescorer} that does nothing.
+ * </p>
+ */
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, boolean includeKnownItems) throws TasteException {
+ return recommend(userID, howMany, null, includeKnownItems);
+ }
+
+ /**
+ * <p> Delegates to {@link Recommender#recommend(long, int, IDRescorer, boolean)}
+ */
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException{
+ return recommend(userID, howMany,rescorer, false);
}
/**
@@ -96,19 +119,22 @@ public abstract class AbstractRecommende
public DataModel getDataModel() {
return dataModel;
}
-
+
/**
* @param userID
* ID of user being evaluated
* @param preferencesFromUser
* the preferences from the user
+ * @param includeKnownItems
+ * whether to include items already known by the user in recommendations
* @return all items in the {@link DataModel} for which the user has not expressed a preference and could
* possibly be recommended to the user
* @throws TasteException
* if an error occurs while listing items
*/
- protected FastIDSet getAllOtherItems(long userID, PreferenceArray preferencesFromUser) throws TasteException {
- return candidateItemsStrategy.getCandidateItems(userID, preferencesFromUser, dataModel);
+ protected FastIDSet getAllOtherItems(long userID, PreferenceArray preferencesFromUser, boolean includeKnownItems)
+ throws TasteException {
+ return candidateItemsStrategy.getCandidateItems(userID, preferencesFromUser, dataModel, includeKnownItems);
}
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllSimilarItemsCandidateItemsStrategy.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllSimilarItemsCandidateItemsStrategy.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllSimilarItemsCandidateItemsStrategy.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllSimilarItemsCandidateItemsStrategy.java Tue May 6 05:01:51 2014
@@ -36,12 +36,15 @@ public class AllSimilarItemsCandidateIte
}
@Override
- protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel) throws TasteException {
+ protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel, boolean includeKnownItems)
+ throws TasteException {
FastIDSet candidateItemIDs = new FastIDSet();
for (long itemID : preferredItemIDs) {
candidateItemIDs.addAll(similarity.allSimilarItemIDs(itemID));
}
- candidateItemIDs.removeAll(preferredItemIDs);
+ if (!includeKnownItems) {
+ candidateItemIDs.removeAll(preferredItemIDs);
+ }
return candidateItemIDs;
}
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategy.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategy.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategy.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategy.java Tue May 6 05:01:51 2014
@@ -24,17 +24,18 @@ import org.apache.mahout.cf.taste.model.
public final class AllUnknownItemsCandidateItemsStrategy extends AbstractCandidateItemsStrategy {
- /**
- * return all items the user has not yet seen
- */
+ /** return all items the user has not yet seen */
@Override
- protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel) throws TasteException {
+ protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel, boolean includeKnownItems)
+ throws TasteException {
FastIDSet possibleItemIDs = new FastIDSet(dataModel.getNumItems());
LongPrimitiveIterator allItemIDs = dataModel.getItemIDs();
while (allItemIDs.hasNext()) {
possibleItemIDs.add(allItemIDs.nextLong());
}
- possibleItemIDs.removeAll(preferredItemIDs);
+ if (!includeKnownItems) {
+ possibleItemIDs.removeAll(preferredItemIDs);
+ }
return possibleItemIDs;
}
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java Tue May 6 05:01:51 2014
@@ -41,6 +41,8 @@ import com.google.common.base.Preconditi
/**
* <p>
* A {@link Recommender} which caches the results from another {@link Recommender} in memory.
+ *
+ * TODO: Should be checked for thread safety
* </p>
*/
public final class CachingRecommender implements Recommender {
@@ -54,6 +56,7 @@ public final class CachingRecommender im
private final Cache<LongPair,Float> estimatedPrefCache;
private final RefreshHelper refreshHelper;
private IDRescorer currentRescorer;
+ private boolean currentlyIncludeKnownItems;
public CachingRecommender(Recommender recommender) throws TasteException {
Preconditions.checkArgument(recommender != null, "recommender is null");
@@ -87,14 +90,29 @@ public final class CachingRecommender im
}
}
}
-
+
+ public void setCurrentlyIncludeKnownItems(boolean currentlyIncludeKnownItems) {
+ this.currentlyIncludeKnownItems = currentlyIncludeKnownItems;
+ }
+
@Override
public List<RecommendedItem> recommend(long userID, int howMany) throws TasteException {
- return recommend(userID, howMany, null);
+ return recommend(userID, howMany, null, false);
}
-
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, boolean includeKnownItems) throws TasteException {
+ return recommend(userID, howMany, null, includeKnownItems);
+ }
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany,IDRescorer rescorer) throws TasteException {
+ return recommend(userID, howMany, rescorer, false);
+ }
+
@Override
- public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
+ public List<RecommendedItem> recommend(long userID, int howMany,IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
synchronized (maxHowMany) {
if (howMany > maxHowMany[0]) {
@@ -108,6 +126,7 @@ public final class CachingRecommender im
}
setCurrentRescorer(rescorer);
+ setCurrentlyIncludeKnownItems(includeKnownItems);
Recommendations recommendations = recommendationCache.get(userID);
if (recommendations.getItems().size() < howMany && !recommendations.isNoMoreRecommendableItems()) {
@@ -191,7 +210,8 @@ public final class CachingRecommender im
int howMany = maxHowMany[0];
IDRescorer rescorer = currentRescorer;
List<RecommendedItem> recommendations =
- rescorer == null ? recommender.recommend(key, howMany) : recommender.recommend(key, howMany, rescorer);
+ rescorer == null ? recommender.recommend(key, howMany, null, currentlyIncludeKnownItems) :
+ recommender.recommend(key, howMany, rescorer, currentlyIncludeKnownItems);
return new Recommendations(Collections.unmodifiableList(recommendations));
}
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericBooleanPrefUserBasedRecommender.java Tue May 6 05:01:51 2014
@@ -61,13 +61,16 @@ public final class GenericBooleanPrefUse
}
@Override
- protected FastIDSet getAllOtherItems(long[] theNeighborhood, long theUserID) throws TasteException {
+ protected FastIDSet getAllOtherItems(long[] theNeighborhood, long theUserID, boolean includeKnownItems)
+ throws TasteException {
DataModel dataModel = getDataModel();
FastIDSet possibleItemIDs = new FastIDSet();
for (long userID : theNeighborhood) {
possibleItemIDs.addAll(dataModel.getItemIDsFromUser(userID));
}
- possibleItemIDs.removeAll(dataModel.getItemIDsFromUser(theUserID));
+ if (!includeKnownItems) {
+ possibleItemIDs.removeAll(dataModel.getItemIDsFromUser(theUserID));
+ }
return possibleItemIDs;
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java Tue May 6 05:01:51 2014
@@ -117,7 +117,8 @@ public class GenericItemBasedRecommender
}
@Override
- public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
log.debug("Recommending items for user ID '{}'", userID);
@@ -126,7 +127,7 @@ public class GenericItemBasedRecommender
return Collections.emptyList();
}
- FastIDSet possibleItemIDs = getAllOtherItems(userID, preferencesFromUser);
+ FastIDSet possibleItemIDs = getAllOtherItems(userID, preferencesFromUser, includeKnownItems);
TopItems.Estimator<Long> estimator = new Estimator(userID, preferencesFromUser);
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java Tue May 6 05:01:51 2014
@@ -79,7 +79,8 @@ public class GenericUserBasedRecommender
}
@Override
- public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
log.debug("Recommending items for user ID '{}'", userID);
@@ -90,7 +91,7 @@ public class GenericUserBasedRecommender
return Collections.emptyList();
}
- FastIDSet allItemIDs = getAllOtherItems(theNeighborhood, userID);
+ FastIDSet allItemIDs = getAllOtherItems(theNeighborhood, userID, includeKnownItems);
TopItems.Estimator<Long> estimator = new Estimator(userID, theNeighborhood);
@@ -165,13 +166,16 @@ public class GenericUserBasedRecommender
return estimate;
}
- protected FastIDSet getAllOtherItems(long[] theNeighborhood, long theUserID) throws TasteException {
+ protected FastIDSet getAllOtherItems(long[] theNeighborhood, long theUserID, boolean includeKnownItems)
+ throws TasteException {
DataModel dataModel = getDataModel();
FastIDSet possibleItemIDs = new FastIDSet();
for (long userID : theNeighborhood) {
possibleItemIDs.addAll(dataModel.getItemIDsFromUser(userID));
}
- possibleItemIDs.removeAll(dataModel.getItemIDsFromUser(theUserID));
+ if (!includeKnownItems) {
+ possibleItemIDs.removeAll(dataModel.getItemIDsFromUser(theUserID));
+ }
return possibleItemIDs;
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java Tue May 6 05:01:51 2014
@@ -72,12 +72,13 @@ public final class ItemAverageRecommende
}
@Override
- public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
log.debug("Recommending items for user ID '{}'", userID);
PreferenceArray preferencesFromUser = getDataModel().getPreferencesFromUser(userID);
- FastIDSet possibleItemIDs = getAllOtherItems(userID, preferencesFromUser);
+ FastIDSet possibleItemIDs = getAllOtherItems(userID, preferencesFromUser, includeKnownItems);
TopItems.Estimator<Long> estimator = new Estimator();
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java Tue May 6 05:01:51 2014
@@ -77,12 +77,13 @@ public final class ItemUserAverageRecomm
}
@Override
- public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
log.debug("Recommending items for user ID '{}'", userID);
PreferenceArray preferencesFromUser = getDataModel().getPreferencesFromUser(userID);
- FastIDSet possibleItemIDs = getAllOtherItems(userID, preferencesFromUser);
+ FastIDSet possibleItemIDs = getAllOtherItems(userID, preferencesFromUser, includeKnownItems);
TopItems.Estimator<Long> estimator = new Estimator(userID);
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategy.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategy.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategy.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategy.java Tue May 6 05:01:51 2014
@@ -29,7 +29,8 @@ public final class PreferredItemsNeighbo
* that has preferred at least one item that the current user has preferred too
*/
@Override
- protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel) throws TasteException {
+ protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel, boolean includeKnownItems)
+ throws TasteException {
FastIDSet possibleItemsIDs = new FastIDSet();
for (long itemID : preferredItemIDs) {
PreferenceArray itemPreferences = dataModel.getPreferencesForItem(itemID);
@@ -38,7 +39,9 @@ public final class PreferredItemsNeighbo
possibleItemsIDs.addAll(dataModel.getItemIDsFromUser(itemPreferences.getUserID(index)));
}
}
- possibleItemsIDs.removeAll(preferredItemIDs);
+ if (!includeKnownItems) {
+ possibleItemsIDs.removeAll(preferredItemIDs);
+ }
return possibleItemsIDs;
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/RandomRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/RandomRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/RandomRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/RandomRecommender.java Tue May 6 05:01:51 2014
@@ -62,9 +62,10 @@ public final class RandomRecommender ext
this.minPref = minPref;
this.maxPref = maxPref;
}
-
+
@Override
- public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
DataModel dataModel = getDataModel();
int numItems = dataModel.getNumItems();
List<RecommendedItem> result = Lists.newArrayListWithCapacity(howMany);
@@ -72,7 +73,7 @@ public final class RandomRecommender ext
LongPrimitiveIterator it = dataModel.getItemIDs();
it.skip(random.nextInt(numItems));
long itemID = it.next();
- if (dataModel.getPreferenceValue(userID, itemID) == null) {
+ if (includeKnownItems || dataModel.getPreferenceValue(userID, itemID) == null) {
result.add(new GenericRecommendedItem(itemID, randomPref()));
}
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategy.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategy.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategy.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategy.java Tue May 6 05:01:51 2014
@@ -118,7 +118,8 @@ public class SamplingCandidateItemsStrat
}
@Override
- protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel) throws TasteException {
+ protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel, boolean includeKnownItems)
+ throws TasteException {
LongPrimitiveIterator preferredItemIDsIterator = new LongPrimitiveArrayIterator(preferredItemIDs);
if (preferredItemIDs.length > maxItems) {
double samplingRate = (double) maxItems / preferredItemIDs.length;
@@ -143,7 +144,9 @@ public class SamplingCandidateItemsStrat
}
}
}
- possibleItemsIDs.removeAll(preferredItemIDs);
+ if (!includeKnownItems) {
+ possibleItemsIDs.removeAll(preferredItemIDs);
+ }
return possibleItemsIDs;
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommender.java Tue May 6 05:01:51 2014
@@ -131,12 +131,13 @@ public final class SVDRecommender extend
}
@Override
- public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException {
Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
log.debug("Recommending items for user ID '{}'", userID);
PreferenceArray preferencesFromUser = getDataModel().getPreferencesFromUser(userID);
- FastIDSet possibleItemIDs = getAllOtherItems(userID, preferencesFromUser);
+ FastIDSet possibleItemIDs = getAllOtherItems(userID, preferencesFromUser, includeKnownItems);
List<RecommendedItem> topItems = TopItems.getTopItems(howMany, possibleItemIDs.iterator(), rescorer,
new Estimator(userID));
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/CandidateItemsStrategy.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/CandidateItemsStrategy.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/CandidateItemsStrategy.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/CandidateItemsStrategy.java Tue May 6 05:01:51 2014
@@ -31,7 +31,7 @@ public interface CandidateItemsStrategy
/**
* @return IDs of all items that could be recommended to the user
*/
- FastIDSet getCandidateItems(long userID, PreferenceArray preferencesFromUser, DataModel dataModel)
- throws TasteException;
+ FastIDSet getCandidateItems(long userID, PreferenceArray preferencesFromUser, DataModel dataModel,
+ boolean includeKnownItems) throws TasteException;
}
Modified: mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java (original)
+++ mahout/trunk/mrlegacy/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java Tue May 6 05:01:51 2014
@@ -42,7 +42,21 @@ public interface Recommender extends Ref
* if an error occurs while accessing the {@link DataModel}
*/
List<RecommendedItem> recommend(long userID, int howMany) throws TasteException;
-
+
+ /**
+ * @param userID
+ * user for which recommendations are to be computed
+ * @param howMany
+ * desired number of recommendations
+ * @return {@link List} of recommended {@link RecommendedItem}s, ordered from most strongly recommend to
+ * least
+ * @param includeKnownItems
+ * whether to include items already known by the user in recommendations
+ * @throws TasteException
+ * if an error occurs while accessing the {@link DataModel}
+ */
+ List<RecommendedItem> recommend(long userID, int howMany, boolean includeKnownItems) throws TasteException;
+
/**
* @param userID
* user for which recommendations are to be computed
@@ -59,6 +73,24 @@ public interface Recommender extends Ref
/**
* @param userID
+ * user for which recommendations are to be computed
+ * @param howMany
+ * desired number of recommendations
+ * @param rescorer
+ * rescoring function to apply before final list of recommendations is determined
+ * @param includeKnownItems
+ * whether to include items already known by the user in recommendations
+ * @return {@link List} of recommended {@link RecommendedItem}s, ordered from most strongly recommend to
+ * least
+ * @throws TasteException
+ * if an error occurs while accessing the {@link DataModel}
+ */
+
+ List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems)
+ throws TasteException;
+
+ /**
+ * @param userID
* user ID whose preference is to be estimated
* @param itemID
* item ID to estimate preference for
Modified: mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategyTest.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategyTest.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategyTest.java (original)
+++ mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/AllUnknownItemsCandidateItemsStrategyTest.java Tue May 6 05:01:51 2014
@@ -54,7 +54,7 @@ public final class AllUnknownItemsCandid
EasyMock.replay(dataModel);
- FastIDSet candidateItems = strategy.getCandidateItems(123L, prefArrayOfUser123, dataModel);
+ FastIDSet candidateItems = strategy.getCandidateItems(123L, prefArrayOfUser123, dataModel, false);
assertEquals(2, candidateItems.size());
assertTrue(candidateItems.contains(1L));
assertTrue(candidateItems.contains(3L));
Modified: mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommenderTest.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommenderTest.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommenderTest.java (original)
+++ mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommenderTest.java Tue May 6 05:01:51 2014
@@ -122,6 +122,36 @@ public final class GenericItemBasedRecom
}
@Test
+ public void testIncludeKnownItems() throws Exception {
+
+ DataModel dataModel = getDataModel(
+ new long[] {1, 2, 3},
+ new Double[][] {
+ {0.1, 0.2},
+ {0.2, 0.3, 0.3, 0.6},
+ {0.4, 0.4, 0.5, 0.9},
+ });
+
+ Collection<GenericItemSimilarity.ItemItemSimilarity> similarities = Lists.newArrayList();
+ similarities.add(new GenericItemSimilarity.ItemItemSimilarity(0, 1, 0.8));
+ similarities.add(new GenericItemSimilarity.ItemItemSimilarity(0, 2, 0.5));
+ similarities.add(new GenericItemSimilarity.ItemItemSimilarity(0, 3, 0.2));
+ similarities.add(new GenericItemSimilarity.ItemItemSimilarity(1, 2, 0.7));
+ similarities.add(new GenericItemSimilarity.ItemItemSimilarity(1, 3, 0.5));
+ similarities.add(new GenericItemSimilarity.ItemItemSimilarity(2, 3, 0.9));
+ ItemSimilarity similarity = new GenericItemSimilarity(similarities);
+ Recommender recommender = new GenericItemBasedRecommender(dataModel, similarity);
+ List<RecommendedItem> originalRecommended = recommender.recommend(1, 4, null, true);
+ List<RecommendedItem> rescoredRecommended = recommender.recommend(1, 4, new ReversingRescorer<Long>(), true);
+ assertNotNull(originalRecommended);
+ assertNotNull(rescoredRecommended);
+ assertEquals(4, originalRecommended.size());
+ assertEquals(4, rescoredRecommended.size());
+ assertEquals(originalRecommended.get(0).getItemID(), rescoredRecommended.get(3).getItemID());
+ assertEquals(originalRecommended.get(3).getItemID(), rescoredRecommended.get(0).getItemID());
+ }
+
+ @Test
public void testEstimatePref() throws Exception {
Recommender recommender = buildRecommender();
assertEquals(0.1f, recommender.estimatePreference(1, 2), EPSILON);
@@ -274,7 +304,7 @@ public final class GenericItemBasedRecom
EasyMock.expect(dataModel.getMaxPreference()).andReturn(Float.NaN);
EasyMock.expect(dataModel.getPreferencesFromUser(1L)).andReturn(preferencesFromUser);
- EasyMock.expect(candidateItemsStrategy.getCandidateItems(1L, preferencesFromUser, dataModel))
+ EasyMock.expect(candidateItemsStrategy.getCandidateItems(1L, preferencesFromUser, dataModel, false))
.andReturn(new FastIDSet(new long[] { 3L, 4L }));
EasyMock.expect(itemSimilarity.itemSimilarities(3L, preferencesFromUser.getIDs()))
Modified: mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommenderTest.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommenderTest.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommenderTest.java (original)
+++ mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommenderTest.java Tue May 6 05:01:51 2014
@@ -97,6 +97,28 @@ public final class GenericUserBasedRecom
}
@Test
+ public void testIncludeKnownItems() throws Exception {
+ DataModel dataModel = getDataModel(
+ new long[] {1, 2, 3},
+ new Double[][] {
+ {0.1, 0.2},
+ {0.2, 0.3, 0.3, 0.6},
+ {0.4, 0.5, 0.5, 0.9},
+ });
+ UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
+ UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, dataModel);
+ Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
+ List<RecommendedItem> originalRecommended = recommender.recommend(1, 4, null, true);
+ List<RecommendedItem> rescoredRecommended = recommender.recommend(1, 4, new ReversingRescorer<Long>(), true);
+ assertNotNull(originalRecommended);
+ assertNotNull(rescoredRecommended);
+ assertEquals(4, originalRecommended.size());
+ assertEquals(4, rescoredRecommended.size());
+ assertEquals(originalRecommended.get(0).getItemID(), rescoredRecommended.get(3).getItemID());
+ assertEquals(originalRecommended.get(3).getItemID(), rescoredRecommended.get(0).getItemID());
+ }
+
+ @Test
public void testEstimatePref() throws Exception {
Recommender recommender = buildRecommender();
assertEquals(0.1f, recommender.estimatePreference(1, 2), EPSILON);
Modified: mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/MockRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/MockRecommender.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/MockRecommender.java (original)
+++ mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/MockRecommender.java Tue May 6 05:01:51 2014
@@ -46,9 +46,19 @@ final class MockRecommender implements R
}
@Override
+ public List<RecommendedItem> recommend(long userID, int howMany, boolean includeKnownItems) {
+ return recommend(userID, howMany);
+ }
+
+ @Override
public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) {
return recommend(userID, howMany);
}
+
+ @Override
+ public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems) {
+ return recommend(userID, howMany);
+ }
@Override
public float estimatePreference(long userID, long itemID) {
@@ -74,8 +84,6 @@ final class MockRecommender implements R
}
@Override
- public void refresh(Collection<Refreshable> alreadyRefreshed) {
- // do nothing
- }
+ public void refresh(Collection<Refreshable> alreadyRefreshed) {}
}
Modified: mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategyTest.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategyTest.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategyTest.java (original)
+++ mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/PreferredItemsNeighborhoodCandidateItemsStrategyTest.java Tue May 6 05:01:51 2014
@@ -65,7 +65,7 @@ public final class PreferredItemsNeighbo
EasyMock.replay(dataModel);
- FastIDSet candidateItems = strategy.getCandidateItems(123L, prefArrayOfUser123, dataModel);
+ FastIDSet candidateItems = strategy.getCandidateItems(123L, prefArrayOfUser123, dataModel, false);
assertEquals(1, candidateItems.size());
assertTrue(candidateItems.contains(2L));
Modified: mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategyTest.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategyTest.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategyTest.java (original)
+++ mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/SamplingCandidateItemsStrategyTest.java Tue May 6 05:01:51 2014
@@ -63,7 +63,7 @@ public final class SamplingCandidateItem
CandidateItemsStrategy strategy =
new SamplingCandidateItemsStrategy(1, 1, 1, dataModel.getNumUsers(), dataModel.getNumItems());
- FastIDSet candidateItems = strategy.getCandidateItems(123L, prefArrayOfUser123, dataModel);
+ FastIDSet candidateItems = strategy.getCandidateItems(123L, prefArrayOfUser123, dataModel, false);
/* result can be either item2 or item3 or empty */
assertTrue(candidateItems.size() <= 1);
assertFalse(candidateItems.contains(1L));
Modified: mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommenderTest.java
URL: http://svn.apache.org/viewvc/mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommenderTest.java?rev=1592656&r1=1592655&r2=1592656&view=diff
==============================================================================
--- mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommenderTest.java (original)
+++ mahout/trunk/mrlegacy/src/test/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommenderTest.java Tue May 6 05:01:51 2014
@@ -63,7 +63,7 @@ public class SVDRecommenderTest extends
EasyMock.expect(factorizer.factorize()).andReturn(factorization);
EasyMock.expect(dataModel.getPreferencesFromUser(1L)).andReturn(preferencesFromUser);
- EasyMock.expect(candidateItemsStrategy.getCandidateItems(1L, preferencesFromUser, dataModel))
+ EasyMock.expect(candidateItemsStrategy.getCandidateItems(1L, preferencesFromUser, dataModel, false))
.andReturn(candidateItems);
EasyMock.expect(factorization.getUserFeatures(1L)).andReturn(new double[] { 0.4, 2 });
EasyMock.expect(factorization.getItemFeatures(5L)).andReturn(new double[] { 1, 0.3 });