02 机器学习算法库Mahout - 协同过滤算法实现推荐功能



(原文地址:http://blog.csdn.net/codemosi/article/category/2777041,转载麻烦带上原文地址。hadoop hive hbase mahout storm spark kafka flume,等连载中,做个爱分享的人奋斗

1 那么问题又来了  ????

    如何实现一个推荐系统?

    1 : 基于内容的推荐,比如用户要买一部手机,在查看iPhone5S的商品详细界面时,系统会推荐更逼格的iPhone6S,三星土豪note,镶钻诺基亚3120c。等内容相似的商品。

    2 : 基于协同过滤的推荐,用户购买iPhone5S的界面。系统会推荐,iPhone5S原装充电器,ipad  ,mac等土豪级用户购买的商品。学数据挖掘技术哪家强,,中国山东找蓝翔

 

   

2 概念

     协同过滤,基于useritem关系的推荐系统(摘自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} ,{ 拔粪宝}。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值