我正在使用 Mahout 框架,以便使用著名的 movielens 数据集 (ml-100k) 在隐式反馈上下文中获得推荐,我已经将其二值化,考虑到 1 所有评级等于四或五,其他所有评级为零。在这个数据集中有五个拆分,每个拆分都像往常一样分为测试集和训练集。
在推荐过程中,我使用简单的 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] 范围内的估计率,以便按降序对列表进行排名并适当地构建 top-n 推荐。
那么这段代码有什么问题呢?我错过了什么或有什么不正确的吗?或者也许是 Mahout 框架没有提供使用二进制反馈的正确方法?
先感谢您,
亚历山德罗·苏利亚