地图reduce简单实现基于物品的协同过滤算法
mapreduce简单实现基于物品的协同过滤算法
现在进到各种电商网站都会在页面给你推荐一些物品,那么这些推荐的物品是怎么得出来的呢?这里介绍一种协同过滤算法:基于物品的协同过滤算法。简单的说,就是给用户推荐他之前买过且平分高的相似的物品。该算法的主要思想是:
1. 建立物品的同现矩阵
就是说按用户分组,找出每2个物品在多少用户中同时出现的次数。
2. 建立用户对物品的评分矩阵
每个用户对每个物品的评分
3. 2个矩阵相乘,计算结果。
下面以一个简单的例子进行实际开发。
一份用户对商品的评价数据:
1 101 4 1 106 3 2 105 3 2 101 1 2 106 2 2 103 2 2 104 5 2 102 2 3 101 2 3 106 5 3 103 4 4 101 2 4 102 5 4 105 4 4 104 5 5 105 4 5 104 5 6 102 1 6 104 1 6 101 4 6 103 1 7 104 4 7 101 1 7 102 2 7 105 5 7 103 2 7 106 1 8 101 2
第一个字段为用户id,第二个字段为商品id,第三个字段为评分。
1. 建立物品的同现矩阵
101 | 102 | 103 | 104 | 105 | 106 | |
101 | 7 | 4 | 4 | 4 | 3 | 4 |
102 | 4 | 4 | 3 | 4 | 3 | 2 |
103 | 4 | 4 | 4 | 3 | 2 | 3 |
104 | 4 | 4 | 3 | 5 | 4 | 2 |
105 | 3 | 3 | 2 | 4 | 4 | 2 |
106 | 4 | 2 | 3 | 2 | 2 | 4 |
2. 建立用户的评分矩阵
这里以用户4为例:
u4 | |
101 | 2 |
102 | 5 |
103 | 0 |
104 | 5 |
105 | 4 |
106 | 0 |
3. 矩阵相乘
101 | 102 | 103 | 104 | 105 | 106 | u4 | |||
101 | 7 | 4 | 4 | 4 | 3 | 4 | 101 | 2 | |
102 | 4 | 4 | 3 | 4 | 3 | 2 | 102 | 5 | |
103 | 4 | 4 | 4 | 3 | 2 | 3 | X | 103 | 0 |
104 | 4 | 4 | 3 | 5 | 4 | 2 | 104 | 5 | |
105 | 3 | 3 | 2 | 4 | 4 | 2 | 105 | 4 | |
106 | 4 | 2 | 3 | 2 | 2 | 4 | 106 | 0 |
结果为:
下面用mapreduce程序来实现以上的算法。
1. 上传文件
将用户对物品的评分文件上传至hdfs下的/test/cf/moive.txt 文件下。
2. 编写mapreduce
该mr程序分为4步。
第一步:按用户分组,计算其对每个物品的评分
第二步:每2个物品一组,计算出现次数,建立同现矩阵
第三步:2个矩阵相乘
第四步:找出推荐的商品
编写mr:
第一步:将输入文件为/test/cf/moive.txt ,输出文件为 /test/cf/step1
第二步:将输入文件为/test/cf/step1 ,输出文件为 /test/cf/step2
第三步:将输入文件为/test/cf/step1和/test/cf/step2 ,输出文件为 /test/cf/step3
第四步:将输入文件为/test/cf/step3 ,输出文件为 /test/cf/step4