mahout中map-reduce版的itembased推荐算法思想

最近想写一个map-reduce版的userbased,于是先研究mahout中已实现的itembased算法。itembased看起来简单,但是深入到实现细节还是有点复杂的,用map-reduce实现就更复杂了。

itembased的本质:

预测某用户user对某物品item的打分,

看看该用户对其他item的打分,如果其他item跟该item越相似,则权重越高。

最后加权平均。

itembased核心步骤:

1 计算item相似度矩阵(利用两个矩阵相乘)

2 user打分矩阵 乘以 item相似度矩阵  = user评分预测矩阵

当然,这里所谓的矩阵相乘,并不是数学意义上的相乘。数学意义上的相乘,前面矩阵的行向量和后面的列向量是算内积。而这里,往往不仅仅是内积,有可能做了normalize,有可能做了downsample等等。

输入文件数据格式:        userID,itemID,pref

user1,item1,pref

user2,item1,pref

user2,item2,pref

user3,item1,pref

USER_VECTORS:      userID,vector[(itemID,pref)]

user1,vector[(item1,pref)]

user2,vector[(item1,pref),(item2,pref)]

user3,vector[(item1,pref)]

RATING_MATRIX:    itemID,vector[(userID,pref)]

item1,vector[(user1,pref),(user2,pref),(user3,pref)]

item2,vector[(user2,pref)]

RATING_MATRIX-> similarityMatrix

通过计算RATING_MATRIX行与行之间的相似性,得出itemsimilarity


Item1


Item2


Item1


Item2

MAPPER:

similarityMatrix->    itemID,vector[(itemID,sim)]

item1,vector[(item2,sim)]

item2,vector[(item1,sim)]

USER_VECTORS-> itemID,(userID,pref)

item1,(user1,pref)

item1,(user2,pref)

item2,(user2,pref)

item1,(user3,pref)

(格式跟输入文件一直,但是存储的数据结构不同)

REDUCER:itemID,(vector[(itemID,sim)],(vector[userID],vector[pref]))

当前ITEM,与当前ITEM相似的item的列表(取topK),对当前ITEM打过分的user列表及其打分。

item1,(vector[(item2,sim)],(vector[user1,user2,user3],vector[pref,pref,pref]))

item2,(vector[(item1,sim)],(vector[user2],vector[pref]))

MAPPER:userID,(pref(cur_item),vector[(itemID,sim)])

表示userID对cur_item的打分是pref,与cur_item相似的item列表及其相似度是vector。

user1,(pref(item1),vector[(item2,sim)])

user2,(pref(item1),vector[(item2,sim)])

user3,(pref(item1),vector[(item2,sim)])

user2,(pref(item2),vector[(item1,sim)])

比如第一行表示的意思,到时要预测user1对未评分item的打分,因为item1与她相似,所以要考虑user1对item1的评分。

REDUCE:userID,itemID,pref

通过上面的mapper,同一user的数据都落在一个reducer中,

就可以得到一个用户所有的打分item,以及这些item跟其他item的相似度。


UserID


Item1


Item2


Item1,pref


NULL


sim


Item2,pref


Sim


NULL


User1


Item1


Item2


Item1,pref


NULL


sim


Item2,unkownPref


Sim


NULL


User2


Item1


Item2


Item1,pref


NULL


sim


Item2,pref


Sim


NULL


User3


Item1


Item2


Item1,pref


NULL


sim


Item2,unkownPref


Sim


NULL

根据这个(user,item),item的矩阵,就可以预测出该user对未打分的item的打分了。

p(u,n)=sum(pref(u,i)*sim(n,i))/sum(sim(n,i))

表达的意思是,想预测u对n的偏好,

遍历u之前看过的i,

参考对这些i的偏好,

和这些n跟i的相似度,

加权平均。

值得一提的是,mahout为了考虑性能,并没有真正做了一个完整的矩阵乘法。

比如就itemsimilarity,只保留了topK,其他都没有存(其实就是相似度太小,可以忽略不计)。

因此,对于某个user,要预测的item集合,并不是item全集减去该user已评分的item集合。而是该user已评分的item各自最为相似topK的item集合。对于不在这集合里面的item,表明与当前user已评分的item相似性太小,直接表明该user不感兴趣,于是预测的分就是0了,就不用计算了。

至于这个最为相似的topK怎么取,我没有仔细研究,可能是约定K为一个常数,可能是定一个阈值,相似度小于这个阈值的就不要了。对于这两者,后者更靠谱一些,具有对称性。

本文链接:http://blog.csdn.net/lingerlanlan/article/details/42656161

本文作者:linger

时间: 2024-12-26 12:57:12

mahout中map-reduce版的itembased推荐算法思想的相关文章

推荐决策 对比user-based 和item-based推荐算法

转自 :http://blog.csdn.net/hxxiaopei/article/details/7695740 推荐系统,整体上有三种方式: user->user->item, 推荐与其相同兴趣的用户喜欢的item,user-based user->item->item, 推荐与其喜欢的item相似的item,item-based user->item-feature->item,抽取用户喜欢item的特征,推荐具备这些特征的item, model-based 针

SimRank协同过滤推荐算法

在协同过滤推荐算法总结中,我们讲到了用图模型做协同过滤的方法,包括SimRank系列算法和马尔科夫链系列算法.现在我们就对SimRank算法在推荐系统的应用做一个总结. 1. SimRank推荐算法的图论基础 SimRank是基于图论的,如果用于推荐算法,则它假设用户和物品在空间中形成了一张图.而这张图是一个二部图.所谓二部图就是图中的节点可以分成两个子集,而图中任意一条边的两个端点分别来源于这两个子集.一个二部图的例子如下图.从图中也可以看出,二部图的子集内部没有边连接.对于我们的推荐算法中的

基于特征的推荐算法【转】

http://in.sdo.com/?p=2779 推荐算法准确度度量公式: 其中,R(u)表示对用户推荐的N个物品,T(u)表示用户u在测试集上喜欢的物品集合. 集合相似度度量公式(N维向量的距离度量公式): Jaccard公式: 其中,N(u)表示用户u有过正反馈的物品集合. 余弦相似度公式: UserCF公式: 其中,S(u,k)表示和用户u兴趣最接近的K个用户集合:N(i)表示对物品i有过正反馈的用户集合:w(u,v)表示用户u和用户v的兴趣相似度:r(v,i)表示用户v对物品i的兴趣.

python中filter, map, reduce, lambda

python 中内置的几个函数filter, map, reduce, lambda简单的例子. #!/usr/bin/env python #_*_coding:utf-8_*_ #filter(function, sequence): #对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回. #可以看作是过滤函数. tasks = [ { 'id': 1, 'title

在YARN中,如何控制和监控map/reduce的并发数

配置建议: 1.     In MR1, the mapred.tasktracker.map.tasks.maximum and mapred.tasktracker.reduce.tasks.maximum properties dictated how many map and reduce slots each TaskTracker had. These properties no longer exist in YARN. Instead, YARN uses yarn.nodema

如何在MAP/REDUCE中不检查输出路径?

前言 如果在REDUCE中并没有涉及到生成HDFS文件,比如只是将一些数据写入REDIS,那么每次都要提供一个不存在的OUTPUT,真是挺麻烦的,有没有机制可以让MAP/REDUCE作业不要检查输出路径? 检查输出路径的机制 经常,我们的输出格式是这样的: job.setOutputFormatClass(TextOutputFormat.class); 跟踪下TextOutputFormat,扫描下其中的方法,发现没有检查输出路径的方法. 向上检查TextOutputFormat的父类File

hadoop中map和reduce的数量设置问题

转载http://my.oschina.net/Chanthon/blog/150500 map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务的分布式并行计算,从这个观点来看,如果将map和reduce的数量设置为1,那么用户的任务就没有并行执行,但是map和reduce的数量也不能过多,数量过多虽然可以提高任务并行度,但是太多的map和reduce也会导致整个hadoop框架因为过度的系统资源开销而使任务失败.所以用户在提交map/re

Python中map,filter,reduce的应用

事例1: l=[('main', 'router_115.236.xx.xx', [{'abc': 1}, {'dfg': 1}]), ('main', 'router_183.61.xx.xx', [{'abc': 0}, {'dfg': 1}]), ('main', 'router_52.11.xx.xx', [{'abc': 0}, {'dfg': 1}]), ('main', 'router_183.17.xx.xx', [{'abc': 1}, {'dfg': 1}]) ] 检查参数l

Python中的Map/Reduce

MapReduce是一种函数式编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性.它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上. Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组. 然而在python中,ma