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

转载自:http://blog.csdn.net/qq1010885678/article/details/50751607?locationNum=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阶段,分割每行内容,输出的key为1,value为101:5.0 
3.在reduce阶段,将UserId相同的所有评分记录进行汇总拼接,输出的key仍然为1,value形如:101:5,102:3,103:2.5…

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

4.计算物品同现矩阵

该矩阵大概长这个样子:

101  102 ……

101     5     3

102     3      4

……

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

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

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

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

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

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

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

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

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

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

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

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

了解矩阵相乘的意义之后,第三个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作为大Map的key,value为小Map,小Map的key为101/102,value为5/3。

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

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

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

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

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案例之基于物品的协同过滤算法ItemCF相关推荐

  1. 推荐系统实践(二)----基于物品的协同过滤算法(ItemCF)

      上一篇博客我简单讲了一下基于用户的协同过滤算法,这里我们一起来学习一下另一种:基于物品的协同过滤算法.基于物品的协同过滤算法是目前业界应用最多的算法,亚马逊.Netflix.Hulu.YouTub ...

  2. 基于物品的协同过滤算法ItemCF

    基于物品的协同过滤算法ItemCF 基于item的协同过滤,通过用户对不同item的评分来评测item之间的相似性,基于item之间的相似性做出推荐.简单来讲就是:给用户推荐和他之前喜欢的物品相似的物 ...

  3. 大数据Hadoop学习之————基于物品的协同过滤算法实现物品推荐

    一.基础概念 协同过滤算法一般分为两种实现: 基于用户的协同过滤算法(userCF):通过寻找相似兴趣的其他用户,为指定用户推荐物品.比如用户A喜欢商品A.B,用户B也喜欢商品A和B,则可以认为用户A ...

  4. 使用Spark DataFrame实现基于物品的协同过滤算法(ItemCF)

    简书不支持Markdown Math语法,请移步https://glassywing.github.io/2018/04/10/spark-itemcf/ 简介 当前spark支持的协同过滤算法只有A ...

  5. itemCF matlab算法,基于物品的协同过滤算法(ItemCF)

    物品相似度计算 余弦相似度公式: 其中 , 分别表示对物品 , 喜欢的用户数, 为同时喜欢 和 的人数.我们这里还是使用漫威英雄举例:假设目前共有5个用户: A.B.C.D.E:共有5个漫威英雄人物: ...

  6. 推荐算法 itemcf java_推荐系统之基于物品的协同过滤算法(ItemCF)

    推荐系统之基于物品的协同过滤算法(ItemCF) 发布时间:2018-03-04 16:55, 浏览次数:1778 , 标签: ItemCF 推荐系统之基于物品的协同过滤算法(ItemCF) 前端时间 ...

  7. ItemCF,基于物品的协同过滤算法

    转载自   ItemCF,基于物品的协同过滤算法 ItemCF:Item Collaboration Filter,基于物品的协同过滤 算法核心思想:给用户推荐那些和他们之前喜欢的物品相似的物品. 比 ...

  8. [推荐算法]ItemCF,基于物品的协同过滤算法

     [推荐算法]ItemCF,基于物品的协同过滤算法 标签: ItemCF基于用户的协同过滤算法 2015-03-09 15:11 4144人阅读 评论(1) 收藏 举报 本文章已收录于: 分类: ...

  9. 【推荐系统】基于物品的协同过滤算法

    基于物品的协同过滤算法 目前业界应用最多的算法. 给用户推荐和他们之前喜欢的物品相似的物品. 其主要通过分析用户的行为记录计算物品之间的相似度.物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都 ...

最新文章

  1. Repeater嵌套
  2. 新手第四课-PaddlePaddle快速入门
  3. linux shell if判断字符串是否包含某字符串
  4. 怎样查看.a和so文件中的接口
  5. 模式识别两种方法:知识和数据
  6. “开源、共享、创新”, 中国最具前景开发者峰会落幕魔都
  7. LeetCode 823. 带因子的二叉树(动态规划)
  8. [UE4] Component BluePrint 组合 代替 BluePrint 继承 实现 ECS 结构
  9. Python教程:丛入门到实践
  10. SQL server 数据导入导出BCP工具使用详解
  11. AMEsim2019.2的安装和matlab2019的联合仿真
  12. 背景的css代码,CSS 背景(示例代码)
  13. python姓名转拼音_实用小技巧,Python一秒将全部中文姓名转为拼音!
  14. 多源数据融合算法综述
  15. android微软雅黑字体,关于 Android 默认字体以及对比微软雅黑字体
  16. 用AI引导人类直觉促进数学发展 【DeepMind Nature2021.12.1】
  17. 计算机在现代教育中的作用,现代教育技术的作用
  18. CVPR 2018值得一看的25篇论文,都在这里了 | 源码 解读
  19. 【杂谈】 Listary自带的字典功能失效?没关系,让我们自己来改造它
  20. HTMLCSSHTTP

热门文章

  1. 多线程与高并发-volatile与CAS
  2. 曹茂永《数字图像处理》第一章习题(部分)
  3. 阅读【hashtable】源码
  4. 基于JavaEE的和平部落野生动物网站系统_JSP网站设计_SqlServer数据库设计
  5. 总投资超百亿健康医疗大数据项目集中签约合肥高新区
  6. Gradle 1.12用户指南翻译——第五十六章. 多项目构建
  7. 点亮自然光线,享受更健康的照明,TaoTronics TT-DL16护眼台灯体验
  8. matlab里脚本循环语句,Matlab中while循环语句的用
  9. tableau高级绘图(三)-tableau绘制王者荣耀人物关系图
  10. 出现Python OSError: [Errno 22] Invalid argument的来龙去脉