您的位置:首页 > 其它

[mahout in action]mahout推荐引擎如何处理无rating数据

2015-08-16 22:54 489 查看
并不是所有的 user和item的关系都可以用评分来衡量的。例如 新闻应用,我们大多数情况下只有 user的浏览记录。电商网站,记录了user看过哪个商品。这些都代表着user的兴趣。

或许对于电影评分,我们可以理解为,用户对这一类电影感兴趣(不感兴趣的连看都不会看,更不用说评分了),但是对个别电影的观后感不同导致评分不同。但如果还有该类型的电影,用户依然会去看(看完可能 评5分,也可能评1分)。这个时候,基于无rating的推荐,就是预测用户会不会去看一部电影,而不是预测用户看完会评多少分

基于这种考虑,可能有时候进行 无rating的推荐会有更好的效果

GenericBooleanPrefDataModel , 就是与GenericDataModel相对应的存储 无prefvalue数据的DataModel
DataModel model = new GenericBooleanPrefDataModel(
GenericBooleanPrefDataModel.toDataMap(
new FileDataModel(new File("ua.base"))));


GenericBooleanPrefDataModel 使用FastIDSets来处理数据,而不是PreferenceArrays。toDataMap() 提供了两者之间的转换

直接看代码:
public class RecommenderIntro {
public static void main(String[] args) throws Exception{

// RandomUtils.useTestSeed();
// FileDataModel 会内部自动使用 GenericBooleanPrefDataModel,如果输入数据每一行只包含 userID 和 itemID的话
DataModel model = new FileDataModel(new File("train_data0"));

// 包含Precision 和Recall的 evaluator
RecommenderIRStatsEvaluator evaluator =
new GenericRecommenderIRStatsEvaluator();

RecommenderBuilder recommenderBuilder = new RecommenderBuilder(){

@Override
public Recommender buildRecommender(DataModel model)
throws TasteException {
// 这里使用 对数似然相似度
UserSimilarity similarity = new LogLikelihoodSimilarity(model);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, similarity, model);

return new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);
}
};
DataModelBuilder modelBuilder = new DataModelBuilder(){

@Override
public DataModel buildDataModel(FastByIDMap<PreferenceArray> trainingData) {

return new GenericBooleanPrefDataModel(
GenericBooleanPrefDataModel.toDataMap(trainingData));
}
};
IRStatistics stats = evaluator.evaluate(recommenderBuilder, modelBuilder, model, null, 10, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);

System.out.println(stats.getPrecision());
System.out.println(stats.getRecall());
}
}


注意
1,皮尔逊相似度 和 欧拉距离相似度不能用于计算 该类型数据的相似度,因为根据两者的公式,PeasonCorrelationSImilarity计算得到分母是0,而EuclideanDistanceSimilarity计算的所有相似度都是1。所以,计算相似度矩阵一般用
LogLikelihoodSimilarity 或者 TanimotoCoefficientSimilarity
2,评测不能用 平均绝对误差,因为评分都是1.0(默认),绝对误差的结果最后是0.0。但可以用 precision 和 recall
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: