Author: otis
Date: Thu Jan 29 19:38:03 2009
New Revision: 738980
URL: http://svn.apache.org/viewvc?rev=738980&view=rev
Log:
MAHOUT-95 - added the notion of minimal user-user similarity
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNUserNeighborhood.java
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNUserNeighborhood.java
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNUserNeighborhood.java?rev=738980&r1=738979&r2=738980&view=diff
==============================================================================
---
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNUserNeighborhood.java
(original)
+++
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNUserNeighborhood.java
Thu Jan 29 19:38:03 2009
@@ -38,6 +38,7 @@
private static final Logger log =
LoggerFactory.getLogger(NearestNUserNeighborhood.class);
private final int n;
+ private final double minSimilarity;
/**
* @param n neighborhood size
@@ -48,11 +49,25 @@
public NearestNUserNeighborhood(int n,
UserSimilarity userSimilarity,
DataModel dataModel) {
- this(n, userSimilarity, dataModel, 1.0);
+ this(n, 0.0, userSimilarity, dataModel, 1.0);
}
/**
* @param n neighborhood size
+ * @param minSimilarity minimal similarity required for neighbors
+ * @param userSimilarity nearness metric
+ * @param dataModel data model
+ * @throws IllegalArgumentException if n < 1, or userSimilarity or
dataModel are <code>null</code>
+ */
+ public NearestNUserNeighborhood(int n, double minSimilarity,
+ UserSimilarity userSimilarity,
+ DataModel dataModel) {
+ this(n, minSimilarity, userSimilarity, dataModel, 1.0);
+ }
+
+ /**
+ * @param n neighborhood size
+ * @param minSimilarity minimal similarity required for neighbors
* @param userSimilarity nearness metric
* @param dataModel data model
* @param samplingRate percentage of users to consider when building
neighborhood -- decrease to
@@ -60,7 +75,7 @@
* @throws IllegalArgumentException if n < 1 or samplingRate is NaN or
not in (0,1],
* or userSimilarity or dataModel are <code>null</code>
*/
- public NearestNUserNeighborhood(int n,
+ public NearestNUserNeighborhood(int n, double minSimilarity,
UserSimilarity userSimilarity,
DataModel dataModel,
double samplingRate) {
@@ -69,6 +84,7 @@
throw new IllegalArgumentException("n must be at least 1");
}
this.n = n;
+ this.minSimilarity = minSimilarity;
}
@Override
@@ -79,7 +95,7 @@
User theUser = dataModel.getUser(userID);
UserSimilarity userSimilarityImpl = getUserSimilarity();
- TopItems.Estimator<User> estimator = new Estimator(userSimilarityImpl,
theUser);
+ TopItems.Estimator<User> estimator = new Estimator(userSimilarityImpl,
theUser, minSimilarity);
List<User> neighborhood = TopItems.getTopUsers(n, dataModel.getUsers(),
null, estimator);
@@ -96,10 +112,18 @@
private static class Estimator implements TopItems.Estimator<User> {
private final UserSimilarity userSimilarityImpl;
private final User theUser;
+ private final double minSim;
private Estimator(UserSimilarity userSimilarityImpl, User theUser) {
this.userSimilarityImpl = userSimilarityImpl;
this.theUser = theUser;
+ this.minSim = Double.NEGATIVE_INFINITY;
+ }
+
+ private Estimator(UserSimilarity userSimilarityImpl, User theUser, double
minSim) {
+ this.userSimilarityImpl = userSimilarityImpl;
+ this.theUser = theUser;
+ this.minSim = minSim;
}
@Override
@@ -107,7 +131,8 @@
if (user.equals(theUser)) {
return Double.NaN;
}
- return userSimilarityImpl.userSimilarity(theUser, user);
+ double sim = userSimilarityImpl.userSimilarity(theUser, user);
+ return (sim >= minSim) ? sim : Double.NaN;
}
}
}