分享

Mahout推荐算法编程实践

本帖最后由 坎蒂丝_Swan 于 2015-1-17 20:45 编辑

问题导读


1.指定距离计算方法最直接用做什么?
2.如何指定近邻算法?











引言


Taste是曾经风靡一时的推荐算法框架,后来被并入Mahout中,Mahout的部分推荐算法基于Taste实现。
下文介绍基于Taste实现最常用的UserCF和ItemCF。
本文不涉及UserCF和ItemCF算法的介绍,这方面网上资料很多,本文仅介绍如何基于Mahout编程实现。



步骤一:构建数据模型


UserCF和ItemCF算法的输入数据是用户偏好,用户偏好数据可以有两种形式:
  • 包含用户对目标评分的【用户ID,itemID,评分】
  • 不包含评分的【用户ID,itemID】

推荐算法的第一步是基于数据源构建数据模型,Taste构建数据模型的数据源可以有很多,比如JDBC,文件等。

下面仅介绍最常用的文件数据源:

  • 用户偏好数据包含评分

示例代码:
DataModel dm = new FileDataModel(new File("E:\\testdata\\3columns"));


  • 用户偏好数据不包含评分

示例代码:
DataModel dm = new GenericBooleanPrefDataModel(
GenericBooleanPrefDataModel
.toDataMap(new FileDataModel(new File("E:\\testdata\\2columns"))));



步骤二:指定距离(相似度)计算方法

创建好数据模型后,第二步需要指定一种计算“距离”的方法,因为在后续的步骤中需要计算user或item之间的“距离”。

Taste提供的计算距离的方法很多,以下仅介绍常用的方法:
  • 用户偏好数据包含评分

欧氏距离:EuclideanDistanceSimilarity
皮尔森距离:PearsonCorrelationSimilarity
余弦距离:UncenteredCosineSimilarity
  • 用户偏好数据不包含评分

曼哈顿距离:CityBlockSimilarity
对数似然距离: LogLikelihoodSimilarity

示例代码:
UserSimilarity us = new CityBlockSimilarity(dm);
ItemSimilarity is = new CityBlockSimilarity(dm);



步骤三(仅UserCF需要):选择近邻算法

如果选择使用UserCF算法做推荐,则在完成相似度计算方法的指定后,需要指定近邻算法。
20140910172748614.png

  • NearestNUserNeighborhood

指定距离最近的N个用户作为邻居。
示例:UserNeighborhood unb = new NearestNUserNeighborhood(10, us, dm);
三个参数分别是:邻居的个数,用户相似度,数据模型   


  • ThresholdUserNeighborhood
指定距离最近的一定百分比的用户作为邻居。

示例:UserNeighborhood unb = new ThresholdUserNeighborhood(0.2, us, dm);

三个参数分别是:阀值(取值范围0到1之间),用户相似度,数据模型


步骤四:创建推荐器

实施推荐算法的最后一步就是创建推荐引擎,Taste为UserCF和ItemCF算法,针对有用户评分和没用户评分的情况,分别提供了推荐器:

  • 用户偏好数据包含评分

示例代码:
UserCF:Recommender re = new GenericUserBasedRecommender(dm, unb, us);
ItemCF:Recommender re = new GenericItemBasedRecommender(dm, is);

  • 用户偏好数据不包含评分

示例代码:
UserCF:Recommender re = new GenericBooleanPrefUserBasedRecommender(dm, unb, us);
ItemCF:Recommender re = new GenericBooleanPrefItemBasedRecommender(dm, is);


题外话:

通过召回率和查准率的测试,CityBlockSimilarity + UserCF 的推荐效果最好。

示例代码:用户偏好数据不包含评分 + CityBlockSimilarity + UserCF
  • 用户偏好数据

1,101
1,102
1,103
2,101
2,102
2,103
2,104
3,101
3,104
3,105
3,107
4,101
4,103
4,104
4,106
5,101
5,102
5,103
5,104
5,105
5,106


  • 代码
  1. import java.io.File;
  2. import java.util.List;
  3. import org.apache.mahout.cf.taste.impl.model.GenericBooleanPrefDataModel;
  4. import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
  5. import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
  6. import org.apache.mahout.cf.taste.impl.recommender.GenericBooleanPrefUserBasedRecommender;
  7. import org.apache.mahout.cf.taste.impl.similarity.CityBlockSimilarity;
  8. import org.apache.mahout.cf.taste.model.DataModel;
  9. import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
  10. import org.apache.mahout.cf.taste.recommender.RecommendedItem;
  11. import org.apache.mahout.cf.taste.recommender.Recommender;
  12. import org.apache.mahout.cf.taste.similarity.UserSimilarity;
  13. public class UserCFRecommender {
  14.     public static void main(String[] args) throws Exception {
  15.         // 创建数据模型,不包含用户评分
  16.         DataModel dm = new GenericBooleanPrefDataModel(
  17.                 GenericBooleanPrefDataModel
  18.                         .toDataMap(new FileDataModel(new File("E:\\testdata\\2columns"))));
  19.         // 使用曼哈顿距离计算相似度
  20.         UserSimilarity us = new CityBlockSimilarity(dm);
  21.         //指定NearestNUserNeighborhood作为近邻算法
  22.         UserNeighborhood unb = new NearestNUserNeighborhood(10, us, dm);
  23.         
  24.         // 构建不包含用户评分的UserCF推荐器
  25.         Recommender re = new GenericBooleanPrefUserBasedRecommender(dm, unb, us);
  26.         
  27.         // 输出推荐结果,为1号用户推荐5个商品
  28.         List<RecommendedItem> list = re.recommend(1, 5);
  29.         for (RecommendedItem recommendedItem : list) {
  30.             System.out.println(recommendedItem.getItemID()+" : "+recommendedItem.getValue());  
  31.         }
  32.     }
  33. }
复制代码







本文转自http://blog.csdn.net/u010967382/article/details/39183839

本帖被以下淘专辑推荐:

欢迎加入about云群90371779322273151432264021 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

已有(2)人评论

跳转到指定楼层
stark_summer 发表于 2015-1-18 10:06:22
回复

使用道具 举报

Joker 发表于 2015-1-19 10:01:07
非常不错,虽然刚学这个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条