注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

being23

写给未来的自己

 
 
 

日志

 
 
关于我

真正的坚定,就是找到力量去做自己喜欢的事情,并为之努力,这样才会觉得生活是幸福的。

网易考拉推荐

基于item的推荐计算过程  

2014-09-07 10:36:49|  分类: work@oppo |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近需要做个关于mahout是如何计算推荐的分享,于是有了下文——

测试数据

每一行依次表示 userid,itemid,prefval

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.5 
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 

协同矩阵

表示每对物品共同出现的次数,其中NaN是一个标识,后续可据此排除已下载项。

基于item的推荐计算过程 - 柒.smilence - being23

用户评分向量

考虑用户1

1,101,5.0 
1,102,3.0 
1,103,2.5 

有评分向量

基于item的推荐计算过程 - 柒.smilence - being23

推荐向量

推荐向量等于协同矩阵与评分向量相乘

基于item的推荐计算过程 - 柒.smilence - being23

归一化 
公式
基于item的推荐计算过程 - 柒.smilence - being23

这里

  • u表示用户
  • i表示用户还没有评分过的物品
  • N表示所有与i相似的物品

意思就是,对于用户u来说,物品i的推荐值等于其与所有物品n的相似度和用户u对物品n评分乘积的和除以所有物品n的相似度和。

分子的计算见上面,下面给出分母的计算过程

计算归一化向量

协同矩阵的前三列对应求和

基于item的推荐计算过程 - 柒.smilence - being23

推荐值向量点除归一化向量

基于item的推荐计算过程 - 柒.smilence - being23

从这里得到的推荐列表是

1       [107:5,105:3.875,104:3.7222223,106:3.6]

但是mahout计算的实际推荐结果是

[root@datanode1 ~]# hadoop fs -cat /theme/output/part-r-00000
Warning: $HADOOP_HOME is deprecated.

1       [105:3.875,104:3.7222223,106:3.6]
2       [106:2.9285715,105:2.5833333,107:2.0]
3       [106:3.5,102:3.3333333,103:3.3125]
4       [107:4.75,105:4.3333335,102:4.111111]
5       [107:3.8333333]

解释

这种差异的原因在于,mahout在计算推荐的时候引入了一个限制条件——

潜在推荐项至少要关联两个已知下载项

具体代码:

for (Element element : numerators.nonZeroes()) {
    int itemIDIndex = element.index();
    /* preference estimations must be based on at least 2 datapoints */
    if (numberOfSimilarItemsUsed.getQuick(itemIDIndex) > 1) {
    /* compute normalized prediction */
        double prediction = element.get() / denominators.getQuick(itemIDIndex);
        recommendationVector.setQuick(itemIDIndex, prediction);
    }
}

继续以用户1来说明,用户1涉及到的协同向量有3个,分别是协同矩阵的前3列

基于item的推荐计算过程 - 柒.smilence - being23

这里可以看到,物品107只跟物品101关联,跟102、103没有关联,导致代码中的if条件不成立,所以不会出现在最终的推荐结果中。

进一步考虑,如果某个用户只下载了一个物品,那么协同向量只有一个,带来的结果就是所有潜在的推荐项只跟一个物品关联,就是用户下载的那个物品,if条件不成立,所以就出现了只下载一个物品的用户是没有推荐列表的。

2014-08-31@前海花园

如果数据量非常大,在计算物品向量的时候(preparation第三个阶段,之后会在这些向量的基础上计算协同矩阵),对于某个热门的物品,由于用户量大,会出现内存溢出。今天在同事俊杰的提醒下,先抽样出一部分数据,然后在这些数据的基础上计算物品向量,最后用抽样计算来的协同矩阵与所有用户向量相乘,就可以得到最终的用户推荐向量。

2014-10-24@前海花园

  评论这张
 
阅读(185)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017