(原文地址:http://blog.youkuaiyun.com/codemosi/article/category/2777041,转载麻烦带上原文地址。hadoop hive hbase mahout storm spark kafka flume,等连载中,做个爱分享的人)
1 那么问题又来了 ????
如何实现一个推荐系统?
1 : 基于内容的推荐,比如用户要买一部手机,在查看iPhone5S的商品详细界面时,系统会推荐更逼格的iPhone6S,三星土豪note,镶钻诺基亚3120c。等内容相似的商品。
2 : 基于协同过滤的推荐,用户购买iPhone5S的界面。系统会推荐,iPhone5S原装充电器,ipad ,mac等土豪级用户购买的商品。学数据挖掘技术哪家强,,中国山东找蓝翔。
2 概念
协同过滤,基于user和item关系的推荐系统(摘自mahout in action)。仅仅需要 user 购买了哪些item,和打分rating。不需要知道item的类型,价格等详细信息,是一种依赖用户的历史行为的数据挖掘的过程。
mahout实现推荐功能,通过下面5个步骤,1 接入历史数据 --> 2 计算user或者item的相似度 --> 3寻找邻居 --> 4使用推荐器做推荐 --> 计算查准率和召回率
3 算法类型
协同过滤算法分为三种
1 基于用户的推荐算法(已user为中心效果:为买iPhone5S的土豪李总,寻找土豪邻居老王,老马,小马,再推荐这群土豪,都非常喜欢的apple原装充电器。)
2 基于商品的推荐算法(以item为中心的效果:为准备购买爆米花手机的王尼玛,推荐爆米花手机的铁杆米粉唐马儒,张全蛋,都非常喜欢的拔粪宝)
3 基于模型的推荐算法(根据用户和商品得出一个数学模型,如slopeone算法 计算一个简单版的线性方程one 数学公式,如 y = x + 4,带入公式计算商品的得分。)
4 mahout三种类型推荐的实现
mahout的协调过滤是吸收taste框架的,下面是taste框架各类推荐器
Item-based:(基于商品的推荐算法)
GenericItemBasedRecommender
GenericBooleanPrefItemBasedRecommender
KnnItemBasedRecommender
User-based:(基于用户的推荐算法)
GenericUserBasedRecommender
GenericBooleanPerfUserBasedRecommender
Model-based:(模型的推荐算法)
SlopeOneRecommender
SVDRecommender
TreeClusteringRecommender
ItemAverageRecommender
ItemUserAverageRecommender
4 mahout相似度的实现
PearsonCorrelationSimilarity 皮尔逊距离
EuclideanDistanceSimilarity 欧几里德距离 (初中的距离公式,如:x(1,3),y(3,1),x和y的距离= 【(3-1)平方 + (1-3)平方 】开根号= 2)
CosineMeasureSimilarity 余弦距离(0.7变成了UncenteredCosineSimilarity)
SpearmanCorrelationSimilarity 斯皮尔曼等级相关
TanimotoCoefficientSimilarity 谷本相关系数
LogLikelihoodSimilarity 一般好于TanimotoCoefficientSimilarity(不懂)
CityBlockSimilarity基于曼哈顿距离
5 mahout 实现推荐功能,涉及的相关接口API
1 org.apache.mahout.cf.taste.model.DataModel 接入数据,有文件和数据库等多种类型的接入方式
2 org.apache.mahout.cf.taste.similarity.UserSimilarity 各种相似度
3 org.apache.mahout.cf.taste.neighborhood.UserNeighborhood 寻找近邻
4 org.apache.mahout.cf.taste.recommender.Recommender 所有推荐器的基类
5 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator 计算查准率和召回率
6 购买iPhone5s的推荐功能案例(爆米花和拔粪宝的例子)
基于商品的推荐算法(以item为中心的效果:为准备购买爆米花手机的王尼玛,推荐爆米花手机的铁杆米粉唐马儒,张全蛋,都非常喜欢的拔粪宝)
淘走电商平台的数据有3张表
6.1案例假设
表1:用户表
userid name profession sex
10086 王尼玛 羊驼 x
3 张全蛋 3号流水线工人 男
4008823823 唐马儒 肯打鸡总裁 基佬
表2:商品表
id name price(¥) color
911 iPhone5S 3888 土豪金
77 apple原装充电器 200 白
34 爆米花手机 9 黑
5 拔粪宝 6 黄
22 尼玛牌辣条 2 红
1282 妄想牌MP3 101 绿
488 魅族手机XX7 177 紫
表3:购买记录表
userid itemid rating(评分 1~5分)
4008823823 34 5
4008823823 5 3
4008823823 22 5
4008823823 22 4
4008823823 1282 0
3 22 5
3 34 3
3 5 3
10086 22 5
假设王尼玛停在 爆米花手机 在淘走平台的商品详细页面。此时应该推荐什么商品。给王尼玛?
使用mahout的协同过滤来实现推荐功能,只需要user 和item 的历史记录,不需要根据商品的其他属性,也就是需要,表3:购买记录表
6.2 mahout协同过滤代码 1 接入历史数据 --> 2 计算user或者item的相似度 --> 3寻找邻居 --> 4使用推荐器做推荐 --> 5 计算查准率和召回率
long userid = 10086;//准备数据
int size = 5;
DataModel model = new FileDataModel(new File("/opt/useritemrating.txt")); //1 接入历史数据
ItemSimilarity similarity = new PearsonCorrelationSimilarity(model); //2 计算user或者item的相似度
Recommender recommender = new GenericItemBasedRecommender(model, similarity); //4使用推荐器做推荐
List<RecommendedItem> recommendations = recommender.recommend(userid , size); //4使用推荐器做推荐
for (RecommendedItem ei : recommendations) {
System.out.println("推荐的itemId:" + ei.getItemID() + ",item得分:" + ei.getValue());//打印推荐的商品
}
6.3 协同过滤算法的代码,做了什么事
1 构造item-user向量
itemid userid
911
77
34 {4008823823,3}
5 {4008823823,3}
22 {4008823823,4008823823,3,10086}
1282 {4008823823}
488
2 构造被购买次数非空的item-item 矩阵
34 5 22 1282
34 2 2 2 1
5 2 2 2 1
22 2 2 3 1
1282 1 1 1 1
3 构造用户item-user-rating矩阵
10086
34 0
5 0
22 5
1282 0
4 item-item 矩阵 和 item-user-rating矩阵,两个矩阵相乘
34 5 22 1282 10086 score
34 2 2 2 1 0 10
5 2 2 2 1 0 10
22 2 2 3 1 X 5 = 15
1282 1 1 1 1 0 5
5 结论
得带 分数最高的2个10分是 {34,5 } ,{ 爆米花手机,拔粪宝,尼玛牌辣条} 除去有rating的22代表购买过的,剩下{34,5} ,{ 爆米花手机,拔粪宝}。假设王尼玛停在 爆米花手机 再除去爆米花手机。 剩下10分的{5} ,{ 拔粪宝}。+一个5分{1282},{妄想牌MP3}。拔粪宝得分比较高,所以推荐{5} ,{ 拔粪宝}。