3.4 基于Taste构建电影推荐引擎3.4.1 数据下载本工程所用到的数据来源于此处: http://www.grouplens.org/node/12,下载数据“MovieLens 1M - Consists of 1 million ratings from 6000 users on 4000 movies.”
这个数据文件夹下有三个文件:movies.dat,ratings.dat和users.dat,数据形式如下三个图所示:
b) 基于内容相似度的推荐引擎
理解了基于用户相似读的推荐引擎,基于内容相似读的推荐引擎类似,甚至更加简单。
public class MyItemBasedRecommender { public List<RecommendedItem> myItemBasedRecommender(long userID,int size){ List<RecommendedItem> recommendations = null; try { DataModel model = new FileDataModel(new File("/home/huhui/movie_preferences.txt"));//构造数据模型,File-based ItemSimilarity similarity = new PearsonCorrelationSimilarity(model);//计算内容相似度 Recommender recommender = new GenericItemBasedRecommender(model, similarity);//构造推荐引擎 recommendations = recommender.recommend(userID, size);//得到推荐接过 } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return recommendations; }}
在这个推荐引擎中,使用的是File-based Datamodel,数据文件格式如下图所示:
每一行都是一个简单的三元组< 用户 ID, 物品 ID, 用户偏好 >。
c) 基于Slop One的推荐引擎
基于用户和基于内容是最常用最容易理解的两种推荐策略,但在大数据量时,它们的计算量会很大,从而导致推荐效率较差。因此 Mahout 还提供了一种更加轻量级的 CF 推荐策略:Slope One。
Slope One 是有 Daniel Lemire 和 Anna Maclachlan 在 2005 年提出的一种对基于评分的协同过滤推荐引擎的改进方法,下面简单介绍一下它的基本思想。
假设系统对于物品 A,物品 B 和物品 C 的平均评分分别是 3,4 和 4。基于 Slope One 的方法会得到以下规律:
•用户对物品 B 的评分 = 用户对物品 A 的评分 + 1
•用户对物品 B 的评分 = 用户对物品 C 的评分
基于以上的规律,我们可以对用户 A 和用户 B 的打分进行预测:
•对用户 A,他给物品 A 打分 4,那么我们可以推测他对物品 B 的评分是 5,对物品 C 的打分也是 5。
•对用户 B,他给物品 A 打分 2,给物品 C 打分 4,根据第一条规律,我们可以推断他对物品 B 的评分是 3;而根据第二条规律,推断出评分是 4。当出现冲突时,我们可以对各种规则得到的推断进行就平均,所以给出的推断是 3.5。
这就是 Slope One 推荐的基本原理,它将用户的评分之间的关系看作简单的线性关系:
Y = mX + b;
当 m = 1 时就是 Slope One,也就是我们刚刚展示的例子。
public class MySlopeOneRecommender { public List<RecommendedItem> mySlopeOneRecommender(long userID,int size){ List<RecommendedItem> recommendations = null; try { DataModel model = new FileDataModel(new File("/home/huhui/movie_preferences.txt"));//构造数据模型 Recommender recommender = new CachingRecommender(new SlopeOneRecommender(model));//构造推荐引擎 recommendations = recommender.recommend(userID, size);//得到推荐结果 } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return recommendations; }}