Author: srowen
Date: Wed Jun 2 12:36:10 2010
New Revision: 950536
URL: http://svn.apache.org/viewvc?rev=950536&view=rev
Log:
Add bulk getter for item similarity and take advantage where appropriate
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java
Wed Jun 2 12:36:10 2010
@@ -105,6 +105,14 @@ public final class BooleanItemPreference
public void setItemID(int i, long itemID) {
id = itemID;
}
+
+ /**
+ * @return all user IDs
+ */
+ @Override
+ public long[] getIDs() {
+ return ids;
+ }
@Override
public float getValue(int i) {
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java
Wed Jun 2 12:36:10 2010
@@ -105,6 +105,14 @@ public final class BooleanUserPreference
public void setItemID(int i, long itemID) {
ids[i] = itemID;
}
+
+ /**
+ * @return all item IDs
+ */
+ @Override
+ public long[] getIDs() {
+ return ids;
+ }
@Override
public float getValue(int i) {
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java
Wed Jun 2 12:36:10 2010
@@ -113,6 +113,14 @@ public final class GenericItemPreference
public void setItemID(int i, long itemID) {
id = itemID;
}
+
+ /**
+ * @return all user IDs
+ */
+ @Override
+ public long[] getIDs() {
+ return ids;
+ }
@Override
public float getValue(int i) {
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java
Wed Jun 2 12:36:10 2010
@@ -114,6 +114,14 @@ public final class GenericUserPreference
public void setItemID(int i, long itemID) {
ids[i] = itemID;
}
+
+ /**
+ * @return all item IDs
+ */
+ @Override
+ public long[] getIDs() {
+ return ids;
+ }
@Override
public float getValue(int i) {
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
Wed Jun 2 12:36:10 2010
@@ -184,9 +184,9 @@ public class GenericItemBasedRecommender
double totalSimilarity = 0.0;
int count = 0;
PreferenceArray prefs = getDataModel().getPreferencesFromUser(userID);
- int size = prefs.length();
- for (int i = 0; i < size; i++) {
- double theSimilarity = similarity.itemSimilarity(itemID,
prefs.getItemID(i));
+ double[] similarities = similarity.itemSimilarities(itemID,
prefs.getIDs());
+ for (int i = 0; i < similarities.length; i++) {
+ double theSimilarity = similarities[i];
if (!Double.isNaN(theSimilarity)) {
// Weights can be negative!
preference += theSimilarity * prefs.getValue(i);
@@ -285,12 +285,14 @@ public class GenericItemBasedRecommender
@Override
public double estimate(Long itemID) throws TasteException {
RunningAverage average = new FullRunningAverage();
- for (long toItemID : toItemIDs) {
+ double[] similarities = similarity.itemSimilarities(itemID, toItemIDs);
+ for (int i = 0; i < toItemIDs.length; i++) {
+ long toItemID = toItemIDs[i];
LongPair pair = new LongPair(toItemID, itemID);
if ((rescorer != null) && rescorer.isFiltered(pair)) {
continue;
}
- double estimate = similarity.itemSimilarity(toItemID, itemID);
+ double estimate = similarities[i];
if (rescorer != null) {
estimate = rescorer.rescore(pair, estimate);
}
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -324,6 +324,16 @@ abstract class AbstractSimilarity implem
}
return result;
}
+
+ @Override
+ public double[] itemSimilarities(long itemID1, long[] itemID2s) throws
TasteException {
+ int length = itemID2s.length;
+ double[] result = new double[length];
+ for (int i = 0; i < length; i++) {
+ result[i] = itemSimilarity(itemID1, itemID2s[i]);
+ }
+ return result;
+ }
final double normalizeWeightResult(double result, int count, int num) {
if (weighted) {
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -48,6 +48,16 @@ public final class CachingItemSimilarity
LongPair key = itemID1 < itemID2 ? new LongPair(itemID1, itemID2) : new
LongPair(itemID2, itemID1);
return similarityCache.get(key);
}
+
+ @Override
+ public double[] itemSimilarities(long itemID1, long[] itemID2s) throws
TasteException {
+ int length = itemID2s.length;
+ double[] result = new double[length];
+ for (int i = 0; i < length; i++) {
+ result[i] = itemSimilarity(itemID1, itemID2s[i]);
+ }
+ return result;
+ }
@Override
public void refresh(Collection<Refreshable> alreadyRefreshed) {
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -206,6 +206,16 @@ public final class GenericItemSimilarity
Double similarity = nextMap.get(secondID);
return similarity == null ? Double.NaN : similarity;
}
+
+ @Override
+ public double[] itemSimilarities(long itemID1, long[] itemID2s) {
+ int length = itemID2s.length;
+ double[] result = new double[length];
+ for (int i = 0; i < length; i++) {
+ result[i] = itemSimilarity(itemID1, itemID2s[i]);
+ }
+ return result;
+ }
@Override
public void refresh(Collection<Refreshable> alreadyRefreshed) {
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -68,16 +68,32 @@ public final class LogLikelihoodSimilari
@Override
public double itemSimilarity(long itemID1, long itemID2) throws
TasteException {
+ int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
+ int numUsers = dataModel.getNumUsers();
+ return doItemSimilarity(itemID1, itemID2, preferring1, numUsers);
+ }
+
+ @Override
+ public double[] itemSimilarities(long itemID1, long[] itemID2s) throws
TasteException {
+ int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
+ int numUsers = dataModel.getNumUsers();
+ int length = itemID2s.length;
+ double[] result = new double[length];
+ for (int i = 0; i < length; i++) {
+ result[i] = doItemSimilarity(itemID1, itemID2s[i], preferring1,
numUsers);
+ }
+ return result;
+ }
+
+ private double doItemSimilarity(long itemID1, long itemID2, int preferring1,
int numUsers) throws TasteException {
int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1,
itemID2);
if (preferring1and2 == 0) {
return Double.NaN;
}
- int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
int preferring2 = dataModel.getNumUsersWithPreferenceFor(itemID2);
- int numUsers = dataModel.getNumUsers();
double logLikelihood = twoLogLambda(preferring1and2,
preferring1 - preferring1and2,
- preferring2,
+ preferring2,
numUsers - preferring2);
return 1.0 - 1.0 / (1.0 + logLikelihood);
}
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -86,8 +86,23 @@ public final class TanimotoCoefficientSi
@Override
public double itemSimilarity(long itemID1, long itemID2) throws
TasteException {
- int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1,
itemID2);
int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
+ return doItemSimilarity(itemID1, itemID2, preferring1);
+ }
+
+ @Override
+ public double[] itemSimilarities(long itemID1, long[] itemID2s) throws
TasteException {
+ int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
+ int length = itemID2s.length;
+ double[] result = new double[length];
+ for (int i = 0; i < length; i++) {
+ result[i] = doItemSimilarity(itemID1, itemID2s[i], preferring1);
+ }
+ return result;
+ }
+
+ private double doItemSimilarity(long itemID1, long itemID2, int preferring1)
throws TasteException {
+ int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1,
itemID2);
int preferring2 = dataModel.getNumUsersWithPreferenceFor(itemID2);
return (double) preferring1and2 / (double) (preferring1 + preferring2 -
preferring1and2);
}
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -52,10 +52,15 @@ public abstract class AbstractJDBCItemSi
private final String itemBIDColumn;
private final String similarityColumn;
private final String getItemItemSimilaritySQL;
-
- protected AbstractJDBCItemSimilarity(DataSource dataSource, String
getItemItemSimilaritySQL) {
- this(dataSource, DEFAULT_SIMILARITY_TABLE, DEFAULT_ITEM_A_ID_COLUMN,
DEFAULT_ITEM_B_ID_COLUMN,
- DEFAULT_SIMILARITY_COLUMN, getItemItemSimilaritySQL);
+
+ protected AbstractJDBCItemSimilarity(DataSource dataSource,
+ String getItemItemSimilaritySQL) {
+ this(dataSource,
+ DEFAULT_SIMILARITY_TABLE,
+ DEFAULT_ITEM_A_ID_COLUMN,
+ DEFAULT_ITEM_B_ID_COLUMN,
+ DEFAULT_SIMILARITY_COLUMN,
+ getItemItemSimilaritySQL);
}
protected AbstractJDBCItemSimilarity(DataSource dataSource,
@@ -70,7 +75,7 @@ public abstract class AbstractJDBCItemSi
AbstractJDBCComponent.checkNotNullAndLog("similarityColumn",
similarityColumn);
AbstractJDBCComponent.checkNotNullAndLog("getItemItemSimilaritySQL",
getItemItemSimilaritySQL);
-
+
if (!(dataSource instanceof ConnectionPoolDataSource)) {
log.warn("You are not using ConnectionPoolDataSource. Make sure your
DataSource pools connections "
+ "to the database itself, or database performance will be
severely reduced.");
@@ -102,48 +107,71 @@ public abstract class AbstractJDBCItemSi
@Override
public double itemSimilarity(long itemID1, long itemID2) throws
TasteException {
-
if (itemID1 == itemID2) {
return 1.0;
}
- // Order as smaller - larger
- if (itemID1 > itemID2) {
- long temp = itemID1;
- itemID1 = itemID2;
- itemID2 = temp;
- }
-
Connection conn = null;
PreparedStatement stmt = null;
- ResultSet rs = null;
-
try {
conn = dataSource.getConnection();
- stmt = conn.prepareStatement(getItemItemSimilaritySQL,
ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY);
+ stmt = conn.prepareStatement(getItemItemSimilaritySQL,
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
stmt.setFetchSize(getFetchSize());
- stmt.setLong(1, itemID1);
- stmt.setLong(2, itemID2);
-
- log.debug("Executing SQL query: {}", getItemItemSimilaritySQL);
- rs = stmt.executeQuery();
+ return doItemSimilarity(stmt, itemID1, itemID2);
+ } catch (SQLException sqle) {
+ log.warn("Exception while retrieving user", sqle);
+ throw new TasteException(sqle);
+ } finally {
+ IOUtils.quietClose(null, stmt, conn);
+ }
+ }
- // If not found, perhaps the items exist but have no presence in the
table,
- // so NaN is appropriate
- return rs.next() ? rs.getDouble(1) : Double.NaN;
-
+ @Override
+ public double[] itemSimilarities(long itemID1, long[] itemID2s) throws
TasteException {
+ double[] result = new double[itemID2s.length];
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ try {
+ conn = dataSource.getConnection();
+ stmt = conn.prepareStatement(getItemItemSimilaritySQL,
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+ stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
+ stmt.setFetchSize(getFetchSize());
+ for (int i = 0; i < itemID2s.length; i++) {
+ result[i] = doItemSimilarity(stmt, itemID1, itemID2s[i]);
+ }
} catch (SQLException sqle) {
log.warn("Exception while retrieving user", sqle);
throw new TasteException(sqle);
} finally {
- IOUtils.quietClose(rs, stmt, conn);
+ IOUtils.quietClose(null, stmt, conn);
}
+ return result;
}
@Override
public void refresh(Collection<Refreshable> alreadyRefreshed) {
// do nothing
}
+
+ private double doItemSimilarity(PreparedStatement stmt, long itemID1, long
itemID2) throws SQLException {
+ // Order as smaller - larger
+ if (itemID1 > itemID2) {
+ long temp = itemID1;
+ itemID1 = itemID2;
+ itemID2 = temp;
+ }
+ stmt.setLong(1, itemID1);
+ stmt.setLong(2, itemID2);
+ log.debug("Executing SQL query: {}", getItemItemSimilaritySQL);
+ ResultSet rs = null;
+ try {
+ rs = stmt.executeQuery();
+ // If not found, perhaps the items exist but have no presence in the
table,
+ // so NaN is appropriate
+ return rs.next() ? rs.getDouble(1) : Double.NaN;
+ } finally {
+ IOUtils.quietClose(rs);
+ }
+ }
}
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -68,7 +68,7 @@ import org.apache.mahout.cf.taste.impl.c
* </p>
*
* <p>
- * Note that for each row, item_id_a should be "less than" item_id_b. It is
redundant to store it both ways,
+ * Note that for each row, item_id_a should be less than item_id_b. It is
redundant to store it both ways,
* so the pair is always stored as a pair with the lesser one first.
*
* @see
org.apache.mahout.cf.taste.impl.recommender.slopeone.jdbc.MySQLJDBCDiffStorage
@@ -85,10 +85,11 @@ public final class MySQLJDBCItemSimilari
}
public MySQLJDBCItemSimilarity(DataSource dataSource) {
- this(dataSource, DEFAULT_SIMILARITY_TABLE,
- DEFAULT_ITEM_A_ID_COLUMN,
- DEFAULT_ITEM_B_ID_COLUMN,
- DEFAULT_SIMILARITY_COLUMN);
+ this(dataSource,
+ DEFAULT_SIMILARITY_TABLE,
+ DEFAULT_ITEM_A_ID_COLUMN,
+ DEFAULT_ITEM_B_ID_COLUMN,
+ DEFAULT_SIMILARITY_COLUMN);
}
public MySQLJDBCItemSimilarity(DataSource dataSource,
@@ -96,14 +97,12 @@ public final class MySQLJDBCItemSimilari
String itemAIDColumn,
String itemBIDColumn,
String similarityColumn) {
- super(dataSource, similarityTable, itemAIDColumn, itemBIDColumn,
similarityColumn, "SELECT "
-
+ similarityColumn
-
+ " FROM "
-
+ similarityTable
-
+ " WHERE "
-
+ itemAIDColumn
-
+ "=? AND "
-
+ itemBIDColumn + "=?");
+ super(dataSource,
+ similarityTable,
+ itemAIDColumn,
+ itemBIDColumn, similarityColumn,
+ "SELECT " + similarityColumn + " FROM " + similarityTable + " WHERE "
+ + itemAIDColumn + "=? AND " + itemBIDColumn + "=?");
}
@Override
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
Wed Jun 2 12:36:10 2010
@@ -78,6 +78,11 @@ public interface PreferenceArray extends
* new item ID
*/
void setItemID(int i, long itemID);
+
+ /**
+ * @return all user or item IDs
+ */
+ long[] getIDs();
/**
* @param i
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -44,5 +44,17 @@ public interface ItemSimilarity extends
* @throws TasteException if an error occurs while accessing the data
*/
double itemSimilarity(long itemID1, long itemID2) throws TasteException;
+
+ /**
+ * <p>A bulk-get version of {...@link #itemSimilarity(long, long)}.</p>
+ *
+ * @param itemID1 first item ID
+ * @param itemID2s second item IDs to compute similarity with
+ * @return similarity between itemID1 and other items
+ * @throws org.apache.mahout.cf.taste.common.NoSuchItemException
+ * if any item is known to be non-existent in the data
+ * @throws TasteException if an error occurs while accessing the data
+ */
+ double[] itemSimilarities(long itemID1, long[] itemID2s) throws
TasteException;
}
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
Wed Jun 2 12:36:10 2010
@@ -43,6 +43,8 @@ public interface UserSimilarity extends
* @throws TasteException if an error occurs while accessing the data
*/
double userSimilarity(long userID1, long userID2) throws TasteException;
+
+ // Should we implement userSimilarities() like
ItemSimilarity.itemSimilarities()?
/**
* <p>
Modified:
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
---
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
(original)
+++
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
Wed Jun 2 12:36:10 2010
@@ -45,6 +45,16 @@ final class DummySimilarity implements U
// Make up something wacky
return 1.0 / (1.0 + Math.abs(itemID1 - itemID2));
}
+
+ @Override
+ public double[] itemSimilarities(long itemID1, long[] itemID2s) {
+ int length = itemID2s.length;
+ double[] result = new double[length];
+ for (int i = 0; i < length; i++) {
+ result[i] = itemSimilarity(itemID1, itemID2s[i]);
+ }
+ return result;
+ }
@Override
public void setPreferenceInferrer(PreferenceInferrer inferrer) {