基于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个数多、数据量大,需要做优化。
谁有想法欢迎留言、来信,谢谢。
相关文章推荐
- [置顶] Hadoop伪分布安装详解+MapReduce运行原理+基于MapReduce的KNN算法实现
- 基于Socket的聊天室实现原理
- 基于jQuery实现轮播特效(原理)
- 一种基于NTLDR的BOOTKIT──原理及实现
- 基于cookie-redis实现单点登录的原理浅谈
- 基于XMPP协议的即时通讯工具的客户端实现原理
- 基于逻辑运算的简单权限系统(原理,设计,实现) VBS 版
- 基于DTW算法的语音识别原理与实现
- MapReduce实现两表的Join--原理及python和java代码实现
- MapReduce初探之一~~基于Mongodb实现标签统计
- JDK动态代理的实现和原理解析(基于JDK1.7)
- 基于SPI的数据报过滤原理与实现
- IOS 基于APNS消息推送原理与实现(JAVA后台)--转
- 基于逻辑运算的简单权限系统(原理,设计,实现) VBS 版
- 简单问答系统实现原理 - 基于机器学习的
- 基于Cookie的原理,实现单点登陆
- 深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
- 《Spring设计思想》AOP实现原理(基于JDK和基于CGLIB)
- Dubbo原理解析-Dubbo内核实现之基于SPI思想Dubbo内核实现
- Hadoop 基于protobuf 的RPC的客户端实现原理