我正在使用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

08-16 05:38