[mahout in action]mahout推荐引擎如何处理无rating数据
2015-08-16 22:54
489 查看
并不是所有的 user和item的关系都可以用评分来衡量的。例如 新闻应用,我们大多数情况下只有 user的浏览记录。电商网站,记录了user看过哪个商品。这些都代表着user的兴趣。
或许对于电影评分,我们可以理解为,用户对这一类电影感兴趣(不感兴趣的连看都不会看,更不用说评分了),但是对个别电影的观后感不同导致评分不同。但如果还有该类型的电影,用户依然会去看(看完可能 评5分,也可能评1分)。这个时候,基于无rating的推荐,就是预测用户会不会去看一部电影,而不是预测用户看完会评多少分
基于这种考虑,可能有时候进行 无rating的推荐会有更好的效果
GenericBooleanPrefDataModel , 就是与GenericDataModel相对应的存储 无prefvalue数据的DataModel
GenericBooleanPrefDataModel 使用FastIDSets来处理数据,而不是PreferenceArrays。toDataMap() 提供了两者之间的转换
直接看代码:
注意:
1,皮尔逊相似度 和 欧拉距离相似度不能用于计算 该类型数据的相似度,因为根据两者的公式,PeasonCorrelationSImilarity计算得到分母是0,而EuclideanDistanceSimilarity计算的所有相似度都是1。所以,计算相似度矩阵一般用
LogLikelihoodSimilarity 或者 TanimotoCoefficientSimilarity
2,评测不能用 平均绝对误差,因为评分都是1.0(默认),绝对误差的结果最后是0.0。但可以用 precision 和 recall
或许对于电影评分,我们可以理解为,用户对这一类电影感兴趣(不感兴趣的连看都不会看,更不用说评分了),但是对个别电影的观后感不同导致评分不同。但如果还有该类型的电影,用户依然会去看(看完可能 评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
相关文章推荐
- MySQL常用命令
- GitHub上README写法暨GFM语法解读
- 数据库与表的创建
- 黑马程序员——String类
- 黑马程序员 基本数据类型对象包装类
- 天津baozha,十问责相关部门!
- python核心编程--笔记
- Linux环境PHP7.0安装
- python核心编程--笔记
- 二叉树中序遍历
- 原型的安装及使用
- android真机测试
- 原型的安装及使用
- httplib,urllib和urllib2
- 出一个字符中只出现过一次且是出现一次的字符串中最先出现的字符
- Lua中的面向对象
- POJ 3468 A Simple Problem with Integers // 线段树 区间更新
- 命令行编译、运行java
- Visual Studio 2015的“转到定义”和“查看定义”出错的Bug
- httplib,urllib和urllib2