我正在使用Mahout框架,以便使用众所周知的movielens数据集(ml-100k)在隐式反馈上下文中获得建议,该数据集已二值化,考虑到所有评分等于4或5,其他评分都为零。
在此数据集中有五个拆分,每个拆分为测试集和训练集
和往常一样。
在推荐过程中,我使用简单的GenericBooleanPrefUserBasedRecommender和TanimotoCoefficientSimilarity训练推荐器,如以下代码行所述:
DataModel trainModel = new FileDataModel(new File(String.valueOf(Main.class.getResource("/binarized/u1.base").getFile())));
DataModel testModel = new FileDataModel(new File(String.valueOf(Main.class.getResource("/binarized/u1.test").getFile())));
UserSimilarity similarity = new TanimotoCoefficientSimilarity(trainModel);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(35, similarity, trainModel);
GenericBooleanPrefUserBasedRecommender userBased = new GenericBooleanPrefUserBasedRecommender(trainModel, neighborhood, similarity);
long firstUser = testModel.getUserIDs().nextLong(); // get the first user
// try to recommender items for the first user
for(LongPrimitiveIterator iterItem = testModel.getItemIDsFromUser(firstUser).iterator(); iterItem.hasNext(); ) {
long currItem = iterItem.nextLong();
// estimates preference for the current item for the first user
System.out.println("Estimated preference for item " + currItem + " is " + userBased.estimatePreference(firstUser, currItem));
}
当我执行此代码时,结果是0.0或1.0的列表,这些列表在隐式反馈上下文中的top-n建议上下文中没有用。仅仅因为我必须为每个项目获得一个估计的比率,该比率保持在[0,1]范围内,以便以降序对列表进行排名并适当地构建前n个推荐。
那么这段代码有什么问题呢?我错过了什么还是什么不正确?
还是Mahout框架没有提供使用二进制反馈的正确方法?
先感谢您,
亚历山德罗·苏利亚(Alessandro Suglia)
最佳答案
如果需要建议,则调用错误的函数。您必须致电推荐
List<RecommendedItem> items = userBased.recommend(firstUser, 10);
for(RecommendedItem item : items) {
System.out.println(item.getItemID()+" Estimated preference: "+item.getValue());
}
可以在javadocs中找到更多信息:
https://builds.apache.org/job/mahout-quality/javadoc/org/apache/mahout/cf/taste/recommender/Recommender.html
广泛的代码示例可以在这里找到:
https://github.com/ManuelB/facebook-recommender-demo/blob/master/src/main/java/de/apaxo/bedcon/FacebookRecommender.java