【甘道夫】Mahout推荐算法编程实践

标签: 甘道夫 mahout 推荐算法 | 发表时间:2014-09-10 17:27 | 作者:u010967382
出处:http://blog.csdn.net
引言
Taste是曾经风靡一时的推荐算法框架,后来被并入Mahout中,Mahout的部分推荐算法基于Taste实现。
下文介绍基于Taste实现最常用的UserCF和ItemCF。
本文不涉及UserCF和ItemCF算法的介绍,这方面网上资料很多,本文仅介绍如何基于Mahout编程实现。

欢迎转载,请注明来源:
http://blog.csdn.net/u010967382/article/details/39183839

步骤一:构建数据模型
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算法做推荐,则在完成相似度计算方法的指定后,需要指定近邻算法。

  • 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

  • 代码
import java.io.File;
import java.util.List;
import org.apache.mahout.cf.taste.impl.model.GenericBooleanPrefDataModel;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericBooleanPrefUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.CityBlockSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
public class UserCFRecommender {
     public  static  void main(String[] args)  throws Exception {
        // 创建数据模型,不包含用户评分
        DataModel dm =  new GenericBooleanPrefDataModel(
                GenericBooleanPrefDataModel
                        .toDataMap( new FileDataModel( new File("E:\\testdata\\2columns"))));
        // 使用曼哈顿距离计算相似度
        UserSimilarity us =  new CityBlockSimilarity(dm);

        //指定NearestNUserNeighborhood作为近邻算法
        UserNeighborhood unb =  new NearestNUserNeighborhood(10, us, dm);
        
        // 构建不包含用户评分的UserCF推荐器
        Recommender re =  new GenericBooleanPrefUserBasedRecommender(dm, unb, us);
        
        // 输出推荐结果,为1号用户推荐5个商品
        List<RecommendedItem> list = re.recommend(1, 5);
         for (RecommendedItem recommendedItem : list) {
            System. out.println(recommendedItem.getItemID()+" : "+recommendedItem.getValue());  
        }
    }
}
作者:u010967382 发表于2014-9-10 17:27:09 原文链接
阅读:80 评论:0 查看评论

相关 [甘道夫 mahout 推荐算法] 推荐:

【甘道夫】Mahout推荐算法编程实践

- - CSDN博客云计算推荐文章
Taste是曾经风靡一时的推荐算法框架,后来被并入Mahout中,Mahout的部分推荐算法基于Taste实现. 下文介绍基于Taste实现最常用的UserCF和ItemCF. 本文不涉及UserCF和ItemCF算法的介绍,这方面网上资料很多,本文仅介绍如何基于Mahout编程实现. UserCF和ItemCF算法的输入数据是用户偏好,用户偏好数据可以有两种形式:.

Mahout: SVDRecommender SVD推荐算法

- -

[转]Mahout推荐算法基础

- - 小鸥的博客
Mahout推荐算法分为以下几大类. 2.相近的用户定义与数量. 2.用户数较少时计算速度快. 1.基于item的相似度. 1.item较少时就算速度更快. 2.当item的外部概念易于理解和获得是非常有用. 1基于SlopeOne算法(打分差异规则). 当item数目十分少了也很有效. 需要限制diffs的存储数目否则内存增长太快.

Mahout推荐算法API详解

- - zzm
Mahout推荐算法API详解. Hadoop家族系列文章, 主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等.

【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解

- - CSDN博客云计算推荐文章
1、sport.tar 是体育类的文章,一共有10个类别;.    用这些原始材料构造一个体育类的文本分类器,并测试对比bayes和cbayes的效果;.    记录分类器的构造过程和测试结果. 2、user-sport.tar 是用户浏览的文章,每个文件夹对应一个用户;.    利用上题构造的文本分类器,计算每个用户浏览各类文章的占比;.

Mahout介绍

- - 互联网 - ITeye博客
Mahout 是机器学习和数据挖掘的一个分布式框架,区别于其他的开源数据挖掘软件,它是基于hadoop之上的; 所以hadoop的优势就是Mahout的优势. http://mahout.apache.org/ 上说的Scalable就是指hadoop的可扩展性. Mahout用map-reduce实现了部分数据挖掘算法,解决了并行挖掘的问题.

mahout部署实践

- - CSDN博客云计算推荐文章
一 下载mahout并解压. JAVA_HOME mahout运行需指定jdk的目录. MAHOUT_JAVA_HOME指定此变量可覆盖JAVA_HOME值. HADOOP_HOME  如果配置,则在hadoop分布式平台上运行,否则单机运行. HADOOP_CONF_DIR指定hadoop的配置文件目录.

社会化推荐算法

- - CSDN博客云计算推荐文章
本文是论文《一种结合推荐对象间关联关系的社会化推荐算法》(以下简称论文)的笔记(下). 该论文提出的算法是以PMF为框架基础的. 因而若对PMF不太了解的话,可以参考我的 上一篇文章脑补一下,当然,那篇文章只是概述,详细了解PMF还需要阅读初始论文,但读完那篇文章后,对本文的理解应该没有问题. 所谓社会化推荐算法,是将社交网络的特性加入到推荐系统中来.

常用推荐算法

- - 互联网 - ITeye博客
       在推荐系统简介中,我们给出了推荐系统的一般框架. 很明显,推荐方法是整个推荐系统中最核心、最关键的部分,很大程度上决定了推荐系统性能的优劣. 目前,主要的推荐方法包括:基于内容推荐、协同过滤推荐、基于关联规则推荐、基于效用推荐、基于知识推荐和组合推荐. 基 于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器学习的方法从关于内容的特征描述的事例中得到用户的兴趣资料.

mahout 实用教程之一

- - CSDN博客云计算推荐文章
mahout 实用教程 (一). 本文力求把mahout从使用的角度为读者建立一个框架,为后续的使用打下基础. 本文为原创文章转载请注明原网址 http://blog.csdn.net/comaple,谢谢. 下面首先给出源代码svn地址以及用于测试的公共数据集,大家可以下载并测试. mahout svn仓库地址: http://svn.apache.org/repos/asf/mahout/trunk.