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

推荐系统的基本架构:

实时推荐和离线推荐

mapreduce实现ItemCF——基于物品的协同过滤_第1张图片

源码:github

注:以下所有数据之间都是以 \t 隔开的,博客里显示效果不好


数据集:

1 101 5
1 102 3
1 103 3
2 101 2
2 102 3
2 103 5
2 104 2
3 101 2
3 104 4
3 105 5
3 107 5
4 101 5
4 103 3
4 104 4
4 106 4
5 101 4
5 102 3
5 103 2
5 104 4
5 105 3
5 106 4
6 102 4
6 103 2
6 105 3
6 107 4

思路:


1.第一个mapreduce:构建用户评分矩阵


mapreduce实现ItemCF——基于物品的协同过滤_第2张图片

输出结果:


1 103:3 101:5 102:3
2 101:2 102:3 103:5 104:2
3 107:5 101:2 104:4 105:5
4 103:3 106:4 104:4 101:5
5 101:4 102:3 103:2 104:4 105:3 106:4
6 102:4 103:2 105:3 107:4

2.第二个mapreduce:构建同现矩阵


mapreduce实现ItemCF——基于物品的协同过滤_第3张图片


输出结果:


101:101 5
101:102 3
101:103 4
101:104 4
101:105 2
101:106 2
101:107 1
102:101 3
102:102 4
102:103 4
102:104 2
102:105 2
102:106 1
102:107 1
103:101 4
103:102 4
103:103 5
103:104 3
103:105 2
103:106 2
103:107 1
104:101 4
104:102 2
104:103 3
104:104 4
104:105 2
104:106 2
104:107 1
105:101 2
105:102 2
105:103 2
105:104 2
105:105 3
105:106 1
105:107 2
106:101 2
106:102 1
106:103 2
106:104 2
106:105 1
106:106 2
107:101 1
107:102 1
107:103 1
107:104 1
107:105 2
107:107 2


3.第三个mapreduce:推荐结果=同现矩阵*评分矩阵


用户u对物品j的喜爱程度=u对物品i的评分*j、i的相似度,累加求和。


如用户1对物品103的喜爱程度:


 


R=4*5+4*3+5*3+3*0+2*0+2*0+1*0=47



mapreduce实现ItemCF——基于物品的协同过滤_第4张图片

输出结果:


6 10130
1 101 46 已购买
5 101 67 已购买
3 101 41 已购买
2 101 47 已购买
4 101 61 已购买
6 102 34 已购买
1 102 39 已购买
5 102 50 已购买
3 102 29
2 102 42 已购买
4 102 39
6 103 36 已购买
1 103 47 已购买
5 103 64 已购买
3 103 35
2 103 51 已购买
4 103 55 已购买
6 104 24
1 104 35
5 104 58 已购买
3 104 39 已购买
2 104 37 已购买
4 104 53 已购买
6 105 29 已购买
1 105 22
5 105 39 已购买
3 105 37 已购买
2 105 24
4 105 28
6 106 11
1 106 19
5 106 34 已购买
3 106 17
2 106 21
4 106 32 已购买
6 107 20 已购买
1 107 11
5 107 19
3 107 26 已购买
2 107 12
4 107 12


4.将推荐结果排序


通过自定义输入类型,按照用户id升序,分数降序排列


输出结果:

1 103 47 已购买
1 101 46  已购买
1 102 39  已购买
1 104 35
1 105 22
1 106 19
1 107 11
2 103 51  已购买
2 101 47  已购买
2 102 42  已购买
2 104 37  已购买
2 105 24
2 106 21
2 107 12
3 101 41  已购买
3 104 39  已购买
3 105 37  已购买
3 103 35
3 102 29
3 107 26  已购买
3 106 17
4 101 61  已购买
4 103 55  已购买
4 104 53  已购买
4 102 39
4 106 32  已购买
4 105 28
4 107 12
5 101 67  已购买
5 103 64  已购买
5 104 58  已购买
5 102 50  已购买
5 105 39  已购买
5 106 34  已购买
5 107 19
6 103 36  已购买
6 102 34  已购买
6 101 30
6 105 29  已购买
6 104 24
6 107 20  已购买
6 106 11

测试数据集  MovieLens ml-100k

推荐结果:

1 50 140234 已购买
1 181 128318  已购买
1 174 125385  已购买
1 100 122214  已购买
1 56 115947  已购买
1 98 115241  已购买
1 172 113888  已购买
1 204 112054  已购买
1 1 111923  已购买
1 121 111208  已购买
1 79 105862  已购买
1 210 105778  已购买
1 69 104589  已购买
1 7 102883  已购买
1 168 102712  已购买
1 127 102084  已购买
1 173 101127  已购买
1 195 100192  已购买
1 423 98904
1 96 97488  已购买
1 117 97396  已购买
1 222 96448  已购买
1 258 96068  已购买
1 216 95675  已购买
1 183 94841  已购买
1 22 94821  已购买
1 176 94718  已购买
1 405 94107
1 202 93679  已购买
1 89 93550  已购买
1 234 92128  已购买
1 237 91652  已购买
1 64 90863  已购买
1 28 90754  已购买
1 82 90236  已购买
1 191 89935  已购买
1 151 89691  已购买
1 294 88793
1 318 88684
1 238 87646  已购买
1 186 87575  已购买
1 196 87403 已购买
1 12 87106  已购买
1 288 86960
1 97 86856  已购买
1 135 86485  已购买
1 228 85377  已购买
1 144 84186  已购买
1 153 84004  已购买
1 70 83390  已购买
1 132 82411  已购买
1 357 82045
1 568 81287
1 286 81110
1 11 80633  已购买
1 25 80246  已购买
1 161 79930  已购买
1 655 79140 
1 265 78983  已购买
1 4 77723  已购买
1 182 77580  已购买
1 143 77255  已购买
1 118 77070  已购买
1 95 76855  已购买
1 385 76753
。。。。。。(省略,太多了)


测试这个数据共用时342363 毫秒,程序大约跑了6分钟。。

对比上一篇的数据,对比用户1,推荐10条


mapreduce计算结果:

1 423 98904
1 405 94107
1 294 88793
1 318 88684
1 288 86960
1 357 82045
1 568 81287
1 286 81110
1 655 79140
1 385 76753

上一篇计算结果:

取前k个:

mapreduce实现ItemCF——基于物品的协同过滤_第5张图片

取所有:
mapreduce实现ItemCF——基于物品的协同过滤_第6张图片


相似度大约在60%~70%,上篇的程序精确到了小数位,而这里全是整数,所以可能有差别。


不过mapreduce计算更为准确!



欢迎指正!



你可能感兴趣的:(hadoop)