ItemCF_基于物品的协同过滤

1.    概念

2.    原理

如何给用户推荐?
给用户推荐他没有买过的物品--103

3.    java代码实现思路

数据集:
第一步:构建物品的同现矩阵
第二步:构建用户的得分矩阵
第三步:同现矩阵*评分矩阵
第四步:拿到最终结果,排序,得到给用户的推荐列表
 
问题一:物品同现矩阵和用户得分矩阵如何构建?
问题二:矩阵相乘如何来做?
 

六个MapReduce

step1_第一个MapReduce: 目的-->去重去除数据集中重复的数据
    第一个MapReduce最终运行的结果:

  
   Mapper端:key:LongWritable(偏移量)   value:一行数据
                                  步骤一:context.write(value, NullWritable.get());    
                                        
   Reducer端:key:一行数据  value:NullWritable
                                  步骤一:context.write(key, NullWritable.get());
                                   
step2_第二个MapReduce:目的-->按用户分组,计算所有物品出现的组合列表,得到用户对物品的喜爱度得分矩阵
   第二个MapReduce最终运行的结果:

 
                     
   Mapper端:key:LongWritable(偏移量)   value:i1,u2723,click,2014/9/14 9:31 || i1,u2723,pay,2014/9/14 9:31
                                  步骤一:按照“,”切割,得到item(i1), user(u2723), action(click)
                                  步骤二:构建输出的key和value(key:user, value:item:物品的得分【根据用户action得到】
                                  步骤三:输出key,value
 
    Reducer端:key:user(u2723)   value:{i1:1, i1:2, i3:2}
                                  步骤一:遍历{i1:1, i1:2, i3:2}对于迭代器中的每一个Text(i1:1),按照“:”切割,分别得到item(i1)action(1)对同一物品的action进行累加,将结果存储到map对象中(map.put(item, action))
                                  步骤二:构建StringBuffer,key:user(u2723),value:{i1:3, i2:4, i3:5}, 并输出
                                          
step3_第三个MapReduce:目的-->对物品组合列表进行计数,建立物品的同现矩阵
   第三个MapReduce最终运行的结果:
                                   
 
   Mapper端:key:LongWritable(偏移量)   value:u26    i276:1,i201:1,i348:1,i321:1,i136:1,
                                  步骤一:切割"\t",得到tokens[1]
                                  步骤二:双重for循环,得到每一个物品和其他物品的同现的次数
                                  步骤三:输出,(key=itemA:itemB,value=1)这里只是得到了单用户的物品同现,在Reducer端得到的是所有用户--同一物品对其他物品的同现次数
 
   Reducer端:第一种--key:itemA:itemB   value:{1,1,1}
                                  步骤一:对Iterable<IntWritable>遍历,统计sum,得到itemA:itemB同现的次数
 
step4_第四个MapReduce:目的-->把物品同现矩阵和用户得分矩阵相乘
   第四个MapReduce最终运行的结果:
                            
 
   Mapper端:key:LongWritable(偏移量)   value: u14    i25:1,i223:1 ||  i100:i105    1
                                  步骤一:因为Mapper读取了第二次输出(用户得分矩阵)和第三次输出的结果(物品同现矩阵),所以要对maptask所对应的split进行判断,判读所读的数据集属于哪一个,这里采用了重写了setup(Context context)方法,定义了flag来进行标识                                  
                                  步骤二:
                                                 如果为同现矩阵(step3)// 样本:  i100:i181    1
                                                         key:i100    value:A:i181,1  输出
                                                 如果为得分矩阵(step2)// 样本:  u24  i64:1,i218:1,i100:2,
                                                         遍历得分矩阵--key:i100    value:B:u24,2,  输出
 
   Reducer端:key:i100   value: {A:i181,1,  A:i180,1  A:i167,3} || {B:u24,2,B:u25,3, B:u26,3}
                                  步骤一:因为value中的A:B:标识同现矩阵,得分矩阵
                                                val.startWith("A:")
                                                   某一个物品i100,针对它和其他物品的同现次数,存在mapA-->value: {A:i181,1,  A:i180,1  A:i167,3}                                                      mapA.put(i181,1),map.put(i180,1)...      
                                                val.startWith("B:")
                                                    该物品(key中的itemID),所有用户的推荐权重分数mapB--{B:u24,2,B:u25,3, B:u26,3}
                                                    mapB.put(u24,2),mapB.put(u25,3)...
                                  步骤二:进行矩阵相乘运算,对于物品i100,它的同现商品以及对应的次数存放到了mapA,而物品对于i100,所有用户的评分已经存放到了mapB,只需要遍历mapA,将其中同现的每一个商品乘以对应的mapB中每一个用户对i100的评分
                                  步骤三:输出,key=userId, value=itemId,result (u24   i101,8.0)
                                                
                                                 
step5_第五个MapReduce:目的-->把相乘后的矩阵相加,获得结果矩阵 
   第五个MapReduce最终运行的结果:
                  
 
    Mapper端:key:LongWritable(偏移量)   value:u13    i9,5.0
                                  步骤一:key=u13,value=i9,5.0  输出
 
    Reducer端:key:u13    value:{i101,2.0, i103,4.5, i101, 5.7}
                                  步骤一:利用map对同一itemId矩阵求和  
                                  步骤二:输出,key=userId, value=itemId,score(样本:  u13    i9,5.0)
                       
step6_第六个MapReduce:目的-->按照推荐得分降序排序,取前十条(二次排序)
   第六个MapReduce最终运行的结果:
                               
 
   Mapper端:key:LongWritable(偏移量)   value:u13    i9,5.0
                                  步骤一:将用户id,物品和得分封装到一个对象 PairWritable
                                  步骤二:输出,key:(PairWritable) value:(item:num)
 
   Shuffle中Sort:
                                  注意:

                                  重写compare()方法,先比较Uid,相等的话,再比较Num

   Shuffle中Group:
                                   注意:

                                   重写compare()方法,Uid相同的为一组
 
   Reducer端:key: PairWritable  value:Text{i160:58.0,i352:9.0,i192:8.0,i455:7.0...}
                                   步骤一:取前十个,利用StringBuffer拼接
                                   步骤二:输出,key=uid,value=sb.toString()
                     

ItemCF_基于物品的协同过滤的更多相关文章

  1. ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路

    ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第 ...

  2. 转】Mahout分步式程序开发 基于物品的协同过滤ItemCF

    原博文出自于: http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ 感谢! Posted: Oct 14, 2013 Tags: Hadoopite ...

  3. 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms” .

    ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3 基于物品的协同过滤推荐算法--读"Item-Based ...

  4. 基于物品的协同过滤item-CF 之电影推荐 python

    推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based:基于内容 : Content Based 协同过滤包括基于物品的协同过滤和基于用户 ...

  5. Music Recommendation System with User-based and Item-based Collaborative Filtering Technique(使用基于用户及基于物品的协同过滤技术的音乐推荐系统)【更新】

    摘要: 大数据催生了互联网,电子商务,也导致了信息过载.信息过载的问题可以由推荐系统来解决.推荐系统可以提供选择新产品(电影,音乐等)的建议.这篇论文介绍了一个音乐推荐系统,它会根据用户的历史行为和口 ...

  6. Mahout分步式程序开发 基于物品的协同过滤ItemCF

    http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  7. Spark 基于物品的协同过滤算法实现

    J由于 Spark MLlib 中协同过滤算法只提供了基于模型的协同过滤算法,在网上也没有找到有很好的实现,所以尝试自己实现基于物品的协同过滤算法(使用余弦相似度距离) 算法介绍 基于物品的协同过滤算 ...

  8. 基于物品的协同过滤算法(ItemCF)

    最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...

  9. 基于物品的协同过滤ItemCF的mapreduce实现

    文章的UML图比较好看..... 原文链接:www.cnblogs.com/anny-1980/articles/3519555.html 基于物品的协同过滤ItemCF 数据集字段: 1.  Use ...

随机推荐

  1. 软工实践-Alpha 冲刺 (10/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 完成所有界面的链接,整理与测试 展示GitHub当日代码/ ...

  2. ORACLE公司传奇历史

    ORACLE公司传奇 ORACLE公司之起源 很难想象,ORACLE 公司的这一段传奇居然要从 IBM 公司开始. 1970年的6月,IBM 公司的研究员埃德加·考特 (Edgar Frank Cod ...

  3. 第15章 磁盘配额(Quota)与高级文件系统管理

    磁盘配额(quota)的应用与实践 什么是quota 举例来说,用户的默认主文件夹是在/home下面,如果/home是个独立的分区,假设是10G,/home下有30个账号,这样30个用户共享这10G的 ...

  4. 3dContactPointAnnotationTool开发日志(二八)

      师姐说物体间不能有穿透,于是我试了下给物体加rigidbody和meshCollider   然后就报错:   说是用meshCollider要么去掉刚体要么就把刚体设置为iskinematic. ...

  5. 2nd 阅读构建之法有感

    阅读构建之法有感 利用这一周的时间,我大致了解构建之法一书,这本书带我走进了一个全新的领域.它让我以一种新的视角去了解软件产业的发展和工作,领略软件工程的独特魅力,更给出了简单易懂的方式去理解何为软件 ...

  6. spring mvc4 找不到静态文件js/css/html 404

    说明: http://localhost:8080 指向的目录是WEB-INF所在的目录,也就是说请求静态资源时都是从该根目录开始查找.建议将所有静态文件放到和WEB-INF同级的目录下. 以 htt ...

  7. mysql有索引和无索引的查询速度对比

    演示100万级数据有索引和无索引的情况下的查找速度:

  8. 【移动端debug-2】Flexbox在移动端的兼容实践

    最近在项目中用到了flexbox,总结一下使用心得. 一.什么是flexbox,干嘛使的? 曾几何时,我们特别希望能像word一样,在排版时有个分散对齐选项(平均分配子元素宽度)这样我就可以任意在父元 ...

  9. wp开发(一)--应用发布篇

    本文非常简单,适合刚刚刚刚入门的菜鸟,且针对的是wp8版本.wp8应用的发布总体来说没什么难度,只是有几个值得注意的地方,希望本文可以减少菜鸟们不必要的担心. 首先假设项目已经完成,且要发布到应用商城 ...

  10. C++ Win系统下的调试

    有的时候我们找不出错误在哪里,这时候我们需要调试一遍看看到底是哪里出了问题:我们需要分布查看程序运行情况. 这时候我们用到了调试这样一个神奇的东西. 一.基于Dev cpp环境下的调试 Dev cpp ...