设为首页 加入收藏

TOP

Hadoop案例之基于物品的协同过滤算法ItemCF
2019-04-18 00:37:17 】 浏览:118
Tags:Hadoop 案例 基于 物品 协同 过滤 算法 ItemCF

Hadoop案例之基于物品的协同过滤算法ItemCF

转载自:http://blog.csdn.net/qq1010885678/article/details/50751607locationNum=7&fps=1

1.ItermCF的基本思想

基于物品相似度的协同过滤推荐的思想大致可分为两部分:

1.计算物与物之前的相似度
2.
根据用户的行为历史,给出和历史列表中的物品相似度最高的推荐

通俗的来讲就是:

对于物品 A,根据所有用户的历史偏好,喜欢物品 A 的用户都喜欢物品 C,得出物品 A 和物品 C 比较相似,而用户 C 喜欢物品 A,那么可以推断出用户 C 可能也喜欢物品 C

2. ItermCF的算法实现思路

对于以下的数据集:

UserId

ItermId

Preference

1

101

5

1

102

3

1

103

2.5

2

101

2

2

102

2.5

2

103

5

2

104

2

3

101

2

3

104

4

3

105

4.5

3

107

5

4

101

5

4

103

3

4

104

4.5

4

106

4

5

101

4

5

102

3

5

103

2

5

104

4

5

105

3.5

5

106

4

6

102

4

6

103

2

6

105

3.5

6

107

4

3.计算用户评分矩阵

首先可以建立用户对物品的评分矩阵,大概长这个样子:


列为UserId,行为ItermId,矩阵中的值代表该用户对该物品的评分。

从列的方向看,该矩阵的每一个列在mr程序中可以用一行简单的字符串来表示:

1 101:5,102:3,103:2.5... 

这样一来,上面的矩阵5个列就可以由5行类似的字符串来构成。
那么第一个mr任务的功能就是一个简单的数据转换过程:

1.输入的key为行偏移量,value为每行内容,形如:1,101,5.0
2.map阶段,分割每行内容,输出的key1value101:5.0
3.reduce阶段,将UserId相同的所有评分记录进行汇总拼接,输出的key仍然为1value形如:101:5,102:3,103:2.5…

如此一来通过第一个mr任务得到了用户的评分矩阵。

4.计算物品同现矩阵

该矩阵大概长这个样子:

101102 ……

101 53

102 3 4

……

矩阵的值表示,两个物品同时被用户喜欢(评过分)的次数,例如:101102这个组合被125三个用户喜欢过,那么在矩阵中101102对应的值就是3

这个矩阵的意义就是各个物品之间的相似度,为什么可以这么说?
如果两个物品经常同时被很多用户喜欢,那么可以说这两个物品是相似的,同时被越多的用户喜欢(即为通同现度,上面矩阵中的值),这两个物品的相似度就越高
其实观察可以发现,行和列上相同的(比如101101)相比其他值(比如101102101103)都是最大的,因为101101就是同一个物品,相似度肯定是最大的

从列的方向上看,这个同现矩阵的每一列在mr程序中可以通过下面简单的字符串来表示:

101:101 5 
101:102 3
101:103 4
...

m*n的同现矩阵就由m个以上的字符串(n行)组成。

那么第二个mr任务的功能就是在第一个mr任务的输出结果上得到物品同现矩阵:

1.输入的key为偏移量,输入的valueUserId+制表符+ItermId1:Perference1,ItermId2:Perference2…
2.输入的value中,UserIdPerference是不需要关心的,观察物品的同现矩阵,map阶段的工作就是将每行包含的ItermId都解析出来,全排列组合作为key输出,每个keyvalue记为1
3.
reduce阶段所做的就是根据keyvalue进行累加输出。

如此一来便能够得到物品的同现矩阵。

5.物品同现矩阵和用户评分矩阵的相乘

物品同现矩阵*用户评分矩阵=推荐结果:

为什么两个矩阵相乘可以得到推荐结果?
物品1和各个物品的同现度*用户对各个物品的喜好度,反应出用户对物品1的喜好度。

例如,要预测用户3103物品的喜好度,我们需要找到和103相似的物品,比如101物品,和103的同现度为4是很类似的物品,用户3101的评分为2,那么一定程度上可以反映出用户对103的喜好度101103的相似度(即同现度)*用户3101的评分可以得到用户3103的喜好度权重,将用户3对各个物品的权重相加,可以反映出用户3103的喜好度

了解矩阵相乘的意义之后,第三个mr任务的功能就是实现两个矩阵的相乘,并将结果输出。

在这个mr任务中,这两个矩阵的相乘可以这样来计算:

将同现矩阵存入一个Map中,形如:

Map<String, Map<String, Double>> colItermOccurrenceMap = new HashMap<String, Map<String, Double>>();

同现矩阵中的每一行就是大Map中的一条记录,每行对应的每列都在该记录的小Map中。

map阶段的开始的时候初始化这个Map,输入的value形如101:101 5,101:102 3,将101作为大Mapkeyvalue为小Map,小Mapkey101/102value5/3

由于map函数读取文件是并发读取的,不能保证两个输入文件的读取顺序(在同一个文件中也不能保证),所以这里使用Hadoop提供的分布式缓存机制来对同现矩阵进行共享。

关于Hadoop的分布式缓存机制请看:
HadoopDistributedCache机制

初始化同现矩阵之后,读取评分矩阵的每一行,输入的value1 101:5,102:3,103:2.5 …
将每行的itermIds和对应的评分数提取出来,遍历itermId,根据itermIditermOccurrenceMap中找到对应的List集合,找到每个itermId在该集合中对应的itermId2记录,将评分数*同现度,之后进行累加,以UserId:ItermID作为key,累加值作为value输出。

reduce的工作就很简单了,根据keyvalue进行累加输出即可。

6.项目代码

源码Github地址

7. 程序输出

7.1 用户评分矩阵

1 103:2.5,101:5,102:3

2 101:2,102:2.5,103:5,104:2

3 107:5,101:2,104:4,105:4.5

4 103:3,106:4,104:4.5,101:5

5 101:4,102:3,103:2,104:4,105:3.5,106:4

6 102:4,103:2,105:3.5,107:4

7.2 物品同现矩阵

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

7.3 最终推荐结果

1 104:33.5

1 105:21.0

1 106:18.0

1 107:10.5

2 105:23.0

2 106:20.5

2 107:11.5

3 102:28.0

3 103:34.0

3 106:16.5

4 102:40.0

4 105:29.0

4 107:12.5

5 107:20.0

6 101:31.0

6 104:25.0

6 106:11.5

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇第四章:hadoop 启动wordcount实.. 下一篇hadoop集群中一些默认的端口和配..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目