以下代码有什么问题,为什么它没有为匿名用户提供建议?
我无法弄清楚出了什么问题,但我无法使用 PlusAnonymousUserDataModel 获得匿名用户的建议。这是示例代码,它不显示对匿名用户的推荐,但为模型中具有完全相同偏好的用户提供推荐:
public static void main(String[] args) throws Exception {
DataModel model = new GenericBooleanPrefDataModel(
GenericBooleanPrefDataModel.toDataMap(new FileDataModel(
new File(args[0]))));
PlusAnonymousUserDataModel plusAnonymousModel = new PlusAnonymousUserDataModel(model);
UserSimilarity similarity = new LogLikelihoodSimilarity(model);
UserNeighborhood neighborhood =
new NearestNUserNeighborhood(
Integer.parseInt(args[1]), similarity, model);
//new ThresholdUserNeighborhood(Float.parseFloat(args[1]), similarity, model);
System.out.println("Neighborhood=" + args[1]);
System.out.println("");
Recommender recommender = new GenericBooleanPrefUserBasedRecommender(model,
neighborhood, similarity);
PreferenceArray anonymousPrefs =
new BooleanUserPreferenceArray(12);
anonymousPrefs.setUserID(0,
PlusAnonymousUserDataModel.TEMP_USER_ID);
anonymousPrefs.setItemID(0, 1105L);
anonymousPrefs.setItemID(1, 1201L);
anonymousPrefs.setItemID(2, 1301L);
anonymousPrefs.setItemID(3, 1401L);
anonymousPrefs.setItemID(4, 1502L);
anonymousPrefs.setItemID(5, 1602L);
anonymousPrefs.setItemID(6, 1713L);
anonymousPrefs.setItemID(7, 1801L);
anonymousPrefs.setItemID(8, 1901L);
anonymousPrefs.setItemID(9, 2002L);
anonymousPrefs.setItemID(10, 9101L);
anonymousPrefs.setItemID(11, 9301L);
synchronized(anonymousPrefs){
plusAnonymousModel.setTempPrefs(anonymousPrefs);
List<RecommendedItem> recommendations1 = recommender.recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, 20);
plusAnonymousModel.clearTempPrefs();
System.out.println("Recm for anonymous:");
for (RecommendedItem recommendation : recommendations1) {
System.out.println(recommendation);
}
System.out.println("");
}
List<RecommendedItem> recommendations = recommender.recommend(
Integer.parseInt(args[2]), 20);
System.out.println("Recomedation for user_id="
+ Integer.parseInt(args[2]) + ":");
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
System.out.println("");
此代码产生的输出如下: Neighborhood=100
匿名推荐:
user_id=1680604 的推荐:RecommendedItem[item:1701, value:24.363672] ... 等等。所以没有对匿名用户的推荐!:(
事实证明,要获得推荐,您必须使用不是“真实的”(在我的情况下是基于文件的)持久性 DataModel 模型,而是使用 PlusAnonymousUserDataModel plusAnonymousModel 来构建相似性、邻域和推荐器!
因此,关于 Mahout 的基本文档(https://builds.apache.org/job/Mahout-Quality/javadoc/org/apache/mahout/cf/taste/impl/model/PlusAnonymousUserDataModel.html)是错误的ItemSimilarity similarity = new LogLikelihoodSimilarity(realModel); // not plusModel
早些时候,SO 上的其他人也遇到了同样的问题,在这里没有得到任何答案:Model creation for User User collaborative filtering 所以我想我应该去那里回答他。Sean Owen,感谢您的关注,您能确认我找到的解决方案是正确的吗?