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

来源:互联网 发布:万方数据库怎么查论文 编辑:程序博客网 时间:2024/06/05 03:23

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


Recommender程序实现(初):

CardID:卡号,对应于用户

ShopID:店铺标识

步骤1

消费记录文件作为输入,生成用户(银行卡)数据、评分

MAP

在消费记录文件中,提取CardIDShopID

输入:(LongString),Long表示文件中的位置,String表示该行的消费记录

输出:(CardIDShopID),如98955/ 590

REDUCE

先对每个用户统计ShopID,再跟据评分系统评分

输出:(CardIDVector),Vector中存放该用户消费过的所有商铺和评分。如

98955/ [590:3.0, 22:4.0, 9059:1.0]


步骤2

步骤1的结果文件作为输入,衡量店铺的相关程度

MAP

输入:(CardIDVector),如98955/ [590:3.0, 22:4.0, 9059:1.0]

输出:(ShopID1,【ShopID2s12】),s12表示12的相关程度,如590/[2212.0]

REDUCE

对每个店铺统计其他店铺的相关度

输出:(ShopID1Vector),Vector中存放其他店铺和该店铺的相关度。如

590/[2212.0951.0...90593.0...]


步骤3

步骤1的结果文件作为输入

MAP

输入:(CardIDVector),如98955/ [590:3.0, 22:4.0, 9059:1.0]

输出:(ShopID,【CardIDW】),W为偏好程度,如590/[989553.0]

REDUCE

无操作

步骤4

步骤23的结果文件作为输入

MAP

无操作

REDUCE

根据ShopID,把用户喜好信息、与其他店铺相似信息收集在一起

输出:(ShopIDVectorAndPrefsWritable),VectorAndPrefsWritable中存储用户喜好信息、与其他店铺相似信息。如590/ [ [ 989553.0989664.0...][2212.0951.0...90593.0...]]


步骤5

步骤4的结果文件作为输入,得到总的推荐度,得到推荐数据

MAP

根据用户划分,用用户喜好程度和店铺相似程度相乘得到推荐度

输出:(CardIDVector),如98955 /[2236.0953.0...90599.0...]

COMBINER

根据CardID,把Vector累加

REDUCE

根据CardID,把Vector累加,找到推荐度高的前N个店(没有消费过的)

输出:(CardIDVector),如98955/ [2315.01951.0...]



Recommender程序实现(改):


主题思想:

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


具体实现:

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


Step0

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


Step1

mapper首先在setup过程中,根据step0文件构建hashHashMap)。在map函数中对文件内容处理后,写出<userID,index>对。

combiner累加

reducer把相同的进行累加,得到用户去过每个店铺的次数的容器,在根据次数、评分对应关系转化成每个用户评分的容器。


Step2

mapper根据step1结果,如果两个item共同出现在,输出<item1,item2>

combiner累加

reducer累加得到最终的item1和其他item共同出现次数


step3

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


step4

默认mapper,以23为输入

reducerlistuser)、listpreference)、itemindex和其他item共同出现次数(vector)根据itemindex整合到一起


step5

mapper中对每个user计算preference*vector,输出<user,preference*vector>

combiner\reducer根据userpreference*vector叠加,完成两个矩阵得乘法。


Step6

默认的mapperstep1step5结果作为输出。

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



有待解决的问题:

由于mapreduce个数多、数据量大,需要做优化。


谁有想法欢迎留言、来信,谢谢。



原创粉丝点击