您的位置:首页 > 其它

基于Mapreduce的推荐器原理和实现

2012-08-22 16:41 316 查看

原理:item相似矩阵*user对item喜好矩阵 得到 预测的user对所有item的喜好矩阵(推荐度),排列取高

Recommender程序实现(初):



CardID:卡号,对应于用户
ShopID:店铺标识
步骤1:
消费记录文件作为输入,生成用户(银行卡)数据、评分
MAP
在消费记录文件中,提取CardID、ShopID
输入:(Long,String),Long表示文件中的位置,String表示该行的消费记录
输出:(CardID,ShopID),如98955/ 590
REDUCE
先对每个用户统计ShopID,再跟据评分系统评分
输出:(CardID,Vector),Vector中存放该用户消费过的所有商铺和评分。如
98955/ [590:3.0, 22:4.0, 9059:1.0]

步骤2
步骤1的结果文件作为输入,衡量店铺的相关程度
MAP
输入:(CardID,Vector),如98955/
[590:3.0, 22:4.0, 9059:1.0]

输出:(ShopID1,【ShopID2:s12】),s12表示12的相关程度,如590/[22:12.0]
REDUCE
对每个店铺统计其他店铺的相关度
输出:(ShopID1,Vector),Vector中存放其他店铺和该店铺的相关度。如
590/[22:12.0,95:1.0,...,9059:3.0,...]

步骤3
步骤1的结果文件作为输入
MAP
输入:(CardID,Vector),如98955/
[590:3.0, 22:4.0, 9059:1.0]

输出:(ShopID,【CardID:W】),W为偏好程度,如590/[98955:3.0]
REDUCE
无操作
步骤4
步骤2、3的结果文件作为输入
MAP
无操作
REDUCE
根据ShopID,把用户喜好信息、与其他店铺相似信息收集在一起
输出:(ShopID,VectorAndPrefsWritable),VectorAndPrefsWritable中存储用户喜好信息、与其他店铺相似信息。如590/
[ [ 98955:3.0,98966:4.0,...];[22:12.0,95:1.0,...,9059:3.0,...]]


步骤5
步骤4的结果文件作为输入,得到总的推荐度,得到推荐数据
MAP
根据用户划分,用用户喜好程度和店铺相似程度相乘得到推荐度
输出:(CardID,Vector),如98955 /[22:36.0,95:3.0,...,9059:9.0,...]
COMBINER
根据CardID,把Vector累加
REDUCE
根据CardID,把Vector累加,找到推荐度高的前N个店(没有消费过的)
输出:(CardID,Vector),如98955/
[23:15.0,195:1.0,...]




Recommender程序实现(改):

主题思想:

由于数据量巨大,要通过Hadoop分布式编程实现该任务。

具体实现:

通过7步Mapreduce程序分布实现,并通过main函数控制7个mapreduce的执行。

Step0:

做itemID和index映射的准备工作。mapper逐行读入item文件,并作处理后得到itemID,再依次标号,写出到文件。

Step1

mapper首先在setup过程中,根据step0文件构建hash表(HashMap)。在map函数中对文件内容处理后,写出<userID,index>对。
combiner累加
reducer把相同的进行累加,得到用户去过每个店铺的次数的容器,在根据次数、评分对应关系转化成每个用户评分的容器。

Step2:

mapper根据step1结果,如果两个item共同出现在,输出<item1,item2>
combiner累加
reducer累加得到最终的item1和其他item共同出现次数

step3:

mapper以step1结果为输出,以itemindex拆分,得到多个<itemindex,(user:preference)>

step4:

默认mapper,以2、3为输入
reducer把list(user)、list(preference)、itemindex和其他item共同出现次数(vector)根据itemindex整合到一起

step5:

mapper中对每个user计算preference*vector,输出<user,preference*vector>
combiner\reducer根据user把preference*vector叠加,完成两个矩阵得乘法。

Step6:

默认的mapper,step1、step5结果作为输出。
reducer中,在step构建用于index和itemID转化的HashMap。在reduce函数中,先去掉值为0的元素得到迭代器,统计个数比再次得到Vector。比较个数即可分别preferenceVector、recommendationVector。把preferenceVector去0后做循环,把1两者相同的元素在recommendationVector中的值设为0。在根据recommendationVector得到对于用户前K个推荐度最高的index,做转化后写出到输出文件(step6)

有待解决的问题:
由于mapreduce个数多、数据量大,需要做优化。

谁有想法欢迎留言、来信,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: