Mahout的taste推荐系统里的几种Recommender分析

简介:

Taste简介

看自:http://blog.csdn.net/zhoubl668/article/details/13297583

Mahout 是apache下的一个java语言的开源大数据机器学习项目,与其他机器学习项目不同的是,它的算法多数是mapreduce方式写的,可以在hadoop上运行,并行化处理大规模数据。


协同过滤在mahout里是由一个叫taste的引擎提供的, 它提供两种模式,一种是以jar包形式嵌入到程序里在进程内运行,另外一种是MapReduce Job形式在hadoop上运行。这两种方式使用的算法是一样的,配置也类似。基本上搞明白了一种,就会另外一种了。


Taste的系统结构如下图


ed4fcc98-3e71-3f7f-bd96-98597963f171.png


其中:

Perference:表示用户的喜好数据,是个三元组(userid, itemid, value),分别表示用户id, 物品id和用户对这个物品的喜好值。

DataModel:是Perference的集合,可以认为是协同过滤用到的user*item的大矩阵。DateModel可以来自db, 文件或者内存。

Similarity:相似度计算的接口,各种相似度计算算法都是继承自这个接口,具体相似度计算的方法,可以参考这篇文章:http://anylin.iteye.com/blog/1721978

Recommender: 利用Similarity找到待推荐item集合后的各种推荐策略,这是最终要暴露个使用者的推荐接口,本文将重点介绍下taste里各种recommender的实现策略,有错误之处,请多指正。


各种Recommender介绍

按照协同过滤方法的分类, taste里的recommender可以分别划到对应的分类下:

Item-based:

        GenericItemBasedRecommender

        GenericBooleanPrefItemBasedRecommender

        KnnItemBasedRecommender

User-based:

        GenericUserBasedRecommender

        GenericBooleanPerfUserBasedRecommender

Model-based:

        SlopeOneRecommender

        SVDRecommender

        TreeClusteringRecommender

 ItemAverageRecommender

        ItemUserAverageRecommender


每种Recommender的详细介绍如下:

GenericUserBasedRecommender

一个很简单的user-based模式的推荐器实现类,根据传入的DataModel和UserNeighborhood进行推荐。其推荐流程分成三步:

第一步,使用UserNeighborhood获取跟指定用户Ui最相似的K个用户{U1…Uk};

第二步,{U1…Uk}喜欢的item集合中排除掉Ui喜欢的item, 得到一个item集合 {Item0...Itemm}

第三步,对{Item0...Itemm}每个itemj计算 Ui可能喜欢的程度值perf(Ui, Itemj) ,并把item按这个数值从高到低排序,把前N个item推荐给Ui。其中perf(Ui, Itemj)的计算公式如下:

cc78ecaa-f3bd-3976-8337-c57c62106db1.png

其中 370e439e-6685-36b5-a532-5df62d961b6d.png是用户Ul对Itemj的喜好值。

GenericBooleanPerfUserBasedRecommender

继承自GenericUserBasedRecommender, 处理逻辑跟GenericUserBasedRecommender一样,只是 的计算公式变成如下公式

dee0cc62-6524-31a2-99ac-6df408b0d3e5.png

其中370e439e-6685-36b5-a532-5df62d961b6d.png是布尔型取值,不是0就是1。

GenericItemBasedRecommender

一个简单的item-based的推荐器,根据传入的DateModel和ItemSimilarity去推荐。基于Item的相似度计算比基于User的相似度计算有个好处是,item数量较少,计算量也就少了,另外item之间的相似度比较固定,所以相似度可以事先算好,这样可以大幅提高推荐的速度。

其推荐流程可以分成三步:

      第一步,获取用户Ui喜好的item集合{It1…Itm}

第一步,使用MostSimilarItemsCandidateItemsStrategy(有多种策略, 功能类似UserNeighborhood) 获取跟用户喜好集合里每个item最相似的其他Item构成集合 {Item1…Itemk};

第二步,对{Item1...Itemk}里的每个itemj计算 Ui可能喜欢的程度值perf(Ui, Itemj) ,并把item按这个数值从高到低排序,把前N个Item推荐给Ui。其中perf(Ui, Itemj)的计算公式如下:

3e00bcbb-3d9b-33c0-a0c1-f7d6c193a742.png

其中16d44f6b-43e9-3a90-9380-c065f7ef927a.png 是用户Ul对Iteml的喜好值。

GenericBooleanPrefItemBasedRecommender

继承自GenericItemBasedRecommender, 处理逻辑跟GenericItemBasedRecommender一样,只是 的计算公式变成如下公式

ddd04a93-0eee-3258-a044-ddb836b2d6fc.png

其中16d44f6b-43e9-3a90-9380-c065f7ef927a.png是布尔型取值,不是0就是1。

KnnItemBasedRecommender

继承自GenericItemBasedRecommender, 处理逻辑跟GenericItemBasedRecommender一样,只是 的计算公式比较复杂,基于一篇论文提到的算法,论文地址在这里

http://public.research.att.com/~volinsky/netflix/BellKorICDM07.pdf。根据论文介绍,该算法对数据进行了一些预处理,同时改进了邻居选取策略,再不怎么增加计算量的情况下,可以较大幅度提高推荐准确度。

ItemAverageRecommender

这是一个提供给实验用的推荐类,简单但计算快速,推荐结果可能会不够好。它预测一个用户对一个未知item的喜好值是所有用户对这个item喜好值的平均值,预测公式如下。

34d958c4-da43-3aa6-ad20-3ca217c6d99f.png

ItemUserAverageRecommender

在ItemAverageRecommender的基础上,考虑了用户喜好的平均值和全局所有喜好的平均值进行调整,它的预测公式如下:

d8c8f300-7df3-3e91-a85e-c73bb6f2537e.png

        其中 5e2a9662-05d3-3973-a214-e2ae31b0b93d.png是所有用户对Itemj喜好的平均值, 1334eaf4-cd90-3703-8421-8a03f94efba3.png是用户Ul所有喜好的平均值,09d37c9f-e6a7-3155-a38a-664cdd6fa18d.png是全局所有喜好值的平均值。

RandomRecommender

随机推荐item,  除了测试性能的时候有用外,没太大用处。

SlopeOneRecommender

基于Slopeone算法的推荐器,Slopeone算法适用于用户对item的打分是具体数值的情况。Slopeone算法不同于前面提到的基于相似度的算法,他计算简单快速,对新用户推荐效果不错,数据更新和扩展性都很不错,预测能达到和基于相似度的算法差不多的效果,很适合在实际项目中使用。


基本原理:


用户   对itema打分     对itemb打分

X                          3                          4

Y                          2                          4

Z                          4                          ?

用户Z对itemb的打分可能是多少呢? Slope one算法认为:所有用户对事物A对itemb的打分平均差值是:((3 - 4) + (2 - 4)) / 2 = -1.5,也就是说人们对itemb的打分一般比事物A的打分要高1.5,于是Slope one算法就猜测Z对itemb的打分是4 + 1.5 = 5.5


当然在实际应用中,用户不止X,Y 两个,跟itemb相关的item也不止A一个,所以slopeone的预测公式如下:

647d4b9e-d81e-3d41-b22e-98d81c067f24.png

其中8184dc61-3c7a-3998-b0d2-32546388133e.png表示与, 用户Ui打过分的除itemj之外所有其他item集合, e61e7e31-70d0-392d-8505-7c79fb026e40.png表示用户Ui对 itemk的打分。9cc5ec0b-9ceb-3424-bf77-23a71c8d116a.png表示除Ui外所有其他用户对itemk和itemj打分差值的平均值。

91bb0a01-5ada-3d14-bddd-440ced6cbace.png

其中0a6443ed-8167-3a46-b8dd-72928998670e.png表示除Ui外其他所有用户的集合。

SVDRecommender

 SVD(Singular Value Decomposition)的想法是根据已有的评分情况,分析出评分者对各个因子的喜好程度以及电影包含各个因子的程度,最后再反过来根据分析结果预测评分。电影中的因子可以理解成这些东西:电影的搞笑程度,电影的爱情爱得死去活来的程度,电影的恐怖程度。。。。。。SVD的想法抽象点来看就是将一个N行M列的评分矩阵R(R[u][i]代表第u个用户对第i个物品的评分),分解成一个N行F列的用户因子矩阵P(P[u][k]表示用户u对因子k的喜好程度)和一个M行F列的物品因子矩阵Q(Q[i][k]表示第i个物品的因子k的程度)。用公式来表示就是
               R = P * T(Q)              //T(Q)表示Q矩阵的转置


基于SVD矩阵分解技术的推荐器,暂时没有研究, 具体可以参考这个文档。

https://cwiki.apache.org/confluence/display/MAHOUT/Collaborative+Filtering+with+ALS-WR

1、关于奇异值分解的理论基础,请参看下面的链接
2、关于奇异值分解的应用场景,请参看下面的例子
http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/
3、关于奇异值分解输入、输出文格式的件的转换,,请参考
注意输出结果解析的时应该用NamedVector,而不是SequentialAccessSparseVector
4、输出结果解释
输入的矩阵记为A,mahout svd输出的结果为矩阵A^t *A的特征值和特征向量,需要注意的是,特征值是按照顺序排列的。要得到U和奇异值需要做进一步的运算(参照第一步里面提到的公式),V则是输出的特征向量。


TreeClusteringRecommender

基于树形聚类的推荐算法

特点

用户数目少的时候非常合适

计算速度快

需要预先计算

这个算法在mahout-0.8版本中,已经被@Deprecated。


基于模型的推荐算法、基于满意度得推荐算法(未实现)



本文转自    拖鞋崽      51CTO博客,原文链接:http://blog.51cto.com/1992mrwang/1337936


相关文章
|
4月前
|
存储 搜索推荐 算法
`surprise`是一个用于构建和分析推荐系统的Python库。
`surprise`是一个用于构建和分析推荐系统的Python库。
|
搜索推荐 NoSQL Redis
149 混合推荐系统案例(功能分析)
149 混合推荐系统案例(功能分析)
84 0
|
6月前
|
算法 搜索推荐 数据挖掘
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
|
JSON 算法 JavaScript
数据挖掘与分析 - 用JS实现推荐系统的原理与开发
数据挖掘与分析 - 用JS实现推荐系统的原理与开发
319 0
数据挖掘与分析 - 用JS实现推荐系统的原理与开发
|
机器学习/深度学习 移动开发 算法
大数据分析实验,包含五个子实验:wordCount实验,PageRank实验,关系挖掘实验,k-means算法,推荐系统算法。(下)
大数据分析实验,包含五个子实验:wordCount实验,PageRank实验,关系挖掘实验,k-means算法,推荐系统算法。(下)
295 0
大数据分析实验,包含五个子实验:wordCount实验,PageRank实验,关系挖掘实验,k-means算法,推荐系统算法。(下)
|
分布式计算 算法 搜索推荐
大数据分析实验,包含五个子实验:wordCount实验,PageRank实验,关系挖掘实验,k-means算法,推荐系统算法。(上)
大数据分析实验,包含五个子实验:wordCount实验,PageRank实验,关系挖掘实验,k-means算法,推荐系统算法。
375 0
大数据分析实验,包含五个子实验:wordCount实验,PageRank实验,关系挖掘实验,k-means算法,推荐系统算法。(上)
|
搜索推荐 算法
十六、推荐系统(Recommender systems)
十六、推荐系统(Recommender systems)
十六、推荐系统(Recommender systems)
|
机器学习/深度学习 搜索推荐 算法
【推荐系统论文精读系列】(三)--Matrix Factorization Techniques For Recommender Systems
现在推荐系统一般是基于两种策略,一种是基于文本过滤的方式,另外一种是协同过滤,而基于文本过滤的方法是创造画像为用户或者物品,说白了就是用一些描述性的特征去描述它们,例如对于一部电影来说,可以为其创造画像电影类型、导演、演员、电影市场、票房等来进行描述,对于用户来说,可以用一些人口统计特征来进行描述。
474 1
|
机器学习/深度学习 搜索推荐 算法
【推荐系统论文精读系列】(十)--Wide&Deep Learning for Recommender Systems
具有非线性特征转化能力的广义线性模型被广泛用于大规模的分类和回归问题,对于那些输入数据是极度稀疏的情况下。通过使用交叉积获得的记忆交互特征是有效的而且具有可解释性,然后这种的泛化能力需要更多的特征工程努力。在进行少量的特征工程的情况下,深度神经网络可以泛化更多隐式的特征组合,通过从Sparse特征中学得低维的Embedding向量。可是,深度神经网络有个问题就是由于网络过深,会导致过度泛化数据。
178 0
【推荐系统论文精读系列】(十)--Wide&Deep Learning for Recommender Systems
|
机器学习/深度学习 负载均衡 搜索推荐
【推荐系统论文精读系列】(十六)--Locally Connected Deep Learning Framework for Industrial-scale Recommender Systems
在这项工作中,我们提出了一个局部连接的深度学习框架推荐系统,该框架将DNN的模型复杂性降低了几个数量级。我们利用Wide& Deep模型的思想进一步扩展了框架。实验表明,该方法能在较短的运行时间内取得较好的效果。
135 0
【推荐系统论文精读系列】(十六)--Locally Connected Deep Learning Framework for Industrial-scale Recommender Systems