其实大家都知道hadoop为我们提供了一个大的框架,真正的算法还是要程序员自己去实现,所以了解hadoop大概架构之后就要了解一些基本的算法。
mahout--可以理解为hadoop的驾驶员。学习它一定要从《mahout in action》入手,在此我记录下一些学习的笔记仅供参考。
第一节:基于用户的推荐算法
GenericUserBasedRecommender 算法原理
官方解释:
for every other user w
compute a similarity s between u and w
retain the top users, ranked by similarity, as a “neighborhood” n
for every item i that some user in n has a preference for,
but that u has no preference for yet
for every other user v in n that has a preference for i
compute a similarity s between u and v
incorporate v's preference for i, weighted by s, into a running average
一:所有用户与用户U做相似性计算,计算出其邻居集合 n
二:循环所有的商品,计算出邻居集合n有兴趣且用户U没有兴趣的商品集合items
三:循环items和邻居集合n,计算出邻居和用户u 的相似度s集合
四:返回s集合并根据相似度排序。
similarity 几个主要算法
在此只做主要介绍,感兴趣的朋友可以研究下具体公式
1、皮尔逊相关系数
用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。两个变量相关性越高,则系数趋近于1,两个变量相互独立,则系数为0,两系数对立,则系数趋近于0。我们看下书本上的例子:
从上图可以看出 user1 和 user4的相关性 比 user1 和user5的相关性高,这似乎有一些counterintuitive。
还有user1和user3是没有相关系数的,这是因为算法程序的规则。
还有一种情况下相关性是不计算的,如果一个user 对所有的item 的perference value相同。
书中介绍这种算法不好不坏,仅仅让你理解一下它的工作原理就好了。
2、欧几里德距离算法
该算法是基于两个user之间的distance,想象用户的坐标就是用户的preference values,距离越小,则说明用户相似度越高。该算法返回值为 1/(1+d),所以当算法返回值为1时,表示两用户相似度完全相等。看下书本上的例子
可以看出该算法和皮尔逊系数有相同的问题,users 1 and 4 have a higher similarity than users 1 and 5.
3、余弦测量相似度算法
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。我们需要立即的就是余弦值在-1到1之间,角度越小(相似度越高)越趋近于1。
4、
其余更多算法请参考 http://www.cnblogs.com/shipengzhi/articles/2540382.html
第二节:基于物品的推荐算法
GenericItemBasedRecommender 算法原理
for every item i that u has no preference for yet
for every item j that u has a preference for
compute a similarity s between i and j
add u's preference for j, weighted by s, to a running average
return the top items, ranked by weighted average
一:循环所有用户没有偏好的物品 i
二:循环所有用户有偏好的物品 j
三:计算i和j的相似度 s
四:为物品j赋予 相似度
五:返回所有物品按权重排序
相似度相关算法例如
public Recommender buildRecommender(DataModel model)
throws TasteException {
ItemSimilarity similarity = new PearsonCorrelationSimilarity(model);
return new GenericItemBasedRecommender(model, similarity);
}
可以看到这里PearsonCorrelationSimilarity 仍然可以使用,因为它实现了ItemSimilarity接口,ItemSimilarity接口完全类似UserSimilarity。
GenericItemBasedRecommender构建比GenericUserBasedRecommender简单,它只需要一个数据模型datamodel,一个相似度算法,而不需要ItemNeighborhood,因为在算法的一开始,用户就已经表达了自己的偏好,这就类似于ItemNeighborhood。
在物品较用户少的情况下,基于物品的推荐算法将运行的更快
第三节:Slope-one 推荐算法
对于上面的数据,首先计算每个item之间的相似性,形成item-item之间的相似度关系。相似度的计算过程不是采用余弦相似度公式等方法,而是根据用户中共同评分的item的差值进行计算的。
相似度计算
例如,item 1与item 2的相似度为 (2+(-1))/2=0.5。但是item 2与item 1之间的相似度为-0.5,整个相似度矩阵不是对称矩阵。而是反对称矩阵。为了后续更新方便,可以将分子与分母分别存储,用的时候再计算相似度。同样的方法,可以计算item1与item 3之间的相似度3。
预测评分
预测的时候,简单的加权是对两个item共同评分的数量,例如item1与item2有2个user共同评分了,则权重是2,同样的item1与item3的权重是1。
Lucy对item 1的预测评分公式如下:
((2+0.5)*2+(3+5)*1)/(2+1)=4.33
在mahout中有这个方法的实现。
第三节:协同过滤之同现矩阵
测试数据集:small.csv
1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.0
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
1). 建立物品的同现矩阵
按用户分组,找到每个用户所选的物品,单独出现计数及两两一组计数。
[101] [102] [103] [104] [105] [106] [107]
[101] 5 3 4 4 2 2 1
[102] 3 3 3 2 1 1 0
[103] 4 3 4 3 1 2 0
[104] 4 2 3 4 2 2 1
[105] 2 1 1 2 2 1 1
[106] 2 1 2 2 1 2 0
[107] 1 0 0 1 1 0 1
2). 建立用户对物品的评分矩阵
按用户分组,找到每个用户所选的物品及评分
U3
[101] 2.0
[102] 0.0
[103] 0.0
[104] 4.0
[105] 4.5
[106] 0.0
[107] 5.0
3). 矩阵计算推荐结果
同现矩阵*评分矩阵=推荐结果