文档章节

推荐系统中协同过滤算法实现分析

Breath_L
 Breath_L
发布于 2012/06/16 13:17
字数 1693
阅读 27630
收藏 50
点赞 6
评论 18

      原创博客,欢迎转载,转载请注明:http://my.oschina.net/BreathL/blog/62519

      最近研究Mahout比较多,特别是里面协同过滤算法;于是把协同过滤算法的这个实现思路与数据流程,总结了一下,以便以后对系统做优化时,有个清晰的思路,这样才能知道该如何优化且优化后数据亦能正确。

     推荐中的协同过滤算法简单说明下:

     首先,通过分析用户的偏好行为,来挖掘出里面物品与物品、或人与人之间的关联。

     其次,通过对这些关联的关系做一定的运算,得出人与物品间喜欢程度的猜测,即推荐值。

     最后,将推荐值高的物品推送给特定的人,以完成一次推荐。

     这里只是笼统的介绍下,方便下边的理解,IBM的一篇博客对其原理讲解得浅显易懂,同时也很详细深入推荐引擎相关算法 - 协同过滤》,我这里就不细讲了。

     协同过滤算法大致可分为两类,基于物品的与基于用户的;区分很简单,根据上面的逻辑,若你挖掘的关系是物品与物品间的,就是基于物品的协同过滤算法,若你挖掘的关系是用户与用户间的,就是基于用户的协同过滤算法;由于它们实现是有所不同,所以我分开整理,先来看看基于物品的协同过滤实现,我自己画了一幅图:


基于物品的协同过滤算法流程图

     我通过数字的顺序,来标示数据变化的方向(由小到大);下面分析下每一个步骤的功能以及实现。

     首先,说明下两个大的数据源,用户偏好数据:UserID、ItemID、Preference:表示一个对一个物品的喜好程度;关系数据:ItemIDA(UserIDA)、ItemIDB(UserIDB)、Similarity:表示两个人或物品间的相似程度;接着一个用户来了,我们需要为其推荐,得拿到他的身份标示,一般是UserID,于是:

     .    查找这个用户喜欢过的物品(即偏好的产品,并查出偏好值后面会用),以及还没有喜欢过的商品,前者是推荐运算的根据,后者作为一个产生推荐的一个集合;如画的那样。

     .    这里是一个可扩展的地方(我自己理解);因为这两部分的数据的作用非常明显,修改这两个集合对后面产生的推荐结果可产生非常直观的影响,比如清洗过滤,或根据用户属性缩小集合;不仅使后面推荐效果更优,运算性能也可以大幅度提高。

     .    查找这两个集合之间的关系,这是一对多的关系:一个没有偏好过的物品与该用户所有偏好过的物品间的关系,有一个值来衡量这个关系叫相似度Similarity;这个关系怎么来的,看蓝色箭头的指向。步骤

     .    得到这个一对多的关系后,就可以计算这个物品对于这个用户的推荐值了,图中similarity_i-x表示Item_i 与 Item_x 之间的相似度,Item_x是该用户偏好过得,该用户对其偏好值记为 value_x ,相乘;Item_i 与 该用户偏好过的所有物品以此做以上运算后,得到的值取平均值 便是 Item_i的推荐值了。注:有可能Item_i 不是与所有 该用户偏好过的物品都都存在相似性,不存在的,不计算即可;另外这里方便理解介绍的都是最简单的实现;你也可以考一些复杂的数学元素,比如方差来判断离散性等。

     .    这步就简单多了,刚才对该用户没有偏好过的集合中的所有Item都计算了推荐值,这里就会得到一个list,按推荐值由大到小排序,返回前面的一个子集即可。

     。 前面已经提到,关系数据时怎么来的,也是根据用户的偏好数据;你把其看成一个矩阵,横着看过来,参考两个Item间的共同用户,以及共同用户的偏好的值的接近度;这里的可选择的相似度算法很多,不一一介绍了,前面提到的IBM博客也详细讲解了。

     基于物品的协同过滤算法分析完了,下面是基于用户的协同过滤算法,还是自己画了一幅图:

基于用户的协同过滤算法流程图


     .    同样也是查询,只是查询的对象不一样了,查询的是与该用户相似的用户,所以一来直接查了关系数据源。以及相似用户与该用户的相似度。

     .    与刚才类似,也是对数据集的一个优化,不过作用可能没那么大。(个人感觉)

     .    查询关系数据源,得到相似用户即邻居偏好过的物品;如步骤;图中由于空间小,没有把所有邻居的偏好关系都列出来,用……表示。其次还要得到该用户偏好过的物品集合。

     .    被推荐的Item集合是由该用户的所有邻居的偏好过的物品的并集,同时再去掉该用户自己偏好过的物品。作用就是得到你的相似用户喜欢的物品,而你还没喜欢过的。

     .    集合优化同基于物品的协同过滤算法的步骤

     .    也是对应类似的,依次计算被推荐集合中Item_i 的推荐值,计算的方式略有不同,Value_1_i表示邻居1对,Item_i的偏好值,乘以该用户与邻居1的相似度 Similarity1;若某个邻居对Item_i偏好过,就重复上述运算,然后取平均值;得到Item_i的推荐值。

     ⑦、. 与上一个算法的最后两部完全类似,只是步骤  你竖着看,判断两个用户相似的法子和判断两个物品相似的法子一样。

     详细的实现过程分析完了,但Mahout里面的实现时,似乎不太考虑查询的成本,并非一次全部查出,每计算个Item的推荐值查一次,你计算5000个就查5000次,若数据源都使用的是MySQL的话,我有点根儿颤,但一次全部查出再计算,肯定是个慢查询,且查询后的数据不是规则的,需要整,又添加了计算量;若各位有好的优化思路,望能分享下,先谢过。

     

© 著作权归作者所有

共有 人打赏支持
Breath_L

Breath_L

粉丝 222
博文 20
码字总数 26444
作品 0
朝阳
程序员
加载中

评论(18)

仙人指路有人用了
仙人指路有人用了

引用来自“babyxiayuan”的评论

请问下博主,文章的框图是用什么软件? 谢谢
同问
babyxiayuan
babyxiayuan
请问下博主,文章的框图是用什么软件? 谢谢
babyxiayuan
babyxiayuan
请问下博主,文章的框图是用什么软件? 谢谢
haoranjunzi
haoranjunzi
不好意思 博主 我发错地方了 我应该在您的“Apache Mahout中推荐算法Slope one源码分析”发表
haoranjunzi
haoranjunzi
博主您好 我特意申请了个账号来咨询您 希望不吝赐教 我想问的是 由于评分矩阵非常稀疏 所有可以在推荐前对评分矩阵通过某种方法进行填充 降低洗属性 利用slopeone就是一种方法 但是如何利用mahout中的slopeon进行填充预测 博主是否知道什么思路 以下是我的思路:
文中slopeone 是对某一个用户的未评分项目的预测 是否可以依照文中方法遍历所有用户,最后就能得到所有用户的未评分项目的预测 这样就将评分矩阵填充 但是这个评分矩阵用什么对象可以取得 similarity?

还有个问题 我是一名研究生 需要对推荐算法进行研究并写论文 但是我现在比较迷茫的是我该利用什么平台进行仿真,mahout还是其他?,我肯定要对算法进行改进 我该怎么mahout里改进算法呢?
p
pengkui
我也在研究taste 遇到一些问题,大家有兴趣的讨论下,我邮箱是:pengkui201208@163.com
只是因为你
只是因为你

引用来自“yunitongle”的评论

楼主,我真心想知道,我如果想把关系数据全本存储起来,当用户很多的时候这个数量是相当巨大的,我如果只能用MySQL进行存储的话,应该怎么办,能不能承受的住呀?

实际上,你的数据很稀疏的,要存储的关系也不多,比如100万用户,8000个商品,没必要为每个用户推荐8000个商品,可能只要只要top10,最多就top100吧, 也就一亿。
yunitongle
yunitongle

引用来自“Breath_L”的评论

引用来自“yunitongle”的评论

楼主,我真心想知道,我如果想把关系数据全本存储起来,当用户很多的时候这个数量是相当巨大的,我如果只能用MySQL进行存储的话,应该怎么办,能不能承受的住呀?

一个你可以考虑分布式存储,推荐引擎的数据都比较大,另一个你可以考虑存储关系数据的子集,比如存一个用户的邻居,不用存储所有邻居,只存最相似的N即可

嗯,看来也只能这样办了,实在是想把所有的都存储下来,一遍下一步的分析利用呀,没办法,放不下呀!
yunitongle
yunitongle

引用来自“Breath_L”的评论

引用来自“yunitongle”的评论

楼主,我真心想知道,我如果想把关系数据全本存储起来,当用户很多的时候这个数量是相当巨大的,我如果只能用MySQL进行存储的话,应该怎么办,能不能承受的住呀?

一个你可以考虑分布式存储,推荐引擎的数据都比较大,另一个你可以考虑存储关系数据的子集,比如存一个用户的邻居,不用存储所有邻居,只存最相似的N即可

嗯,看来也只能这样办了,实在是想把所有的都存储下来,一遍下一步的分析利用呀,没办法,放不下呀!
Breath_L
Breath_L

引用来自“yunitongle”的评论

楼主,我真心想知道,我如果想把关系数据全本存储起来,当用户很多的时候这个数量是相当巨大的,我如果只能用MySQL进行存储的话,应该怎么办,能不能承受的住呀?

一个你可以考虑分布式存储,推荐引擎的数据都比较大,另一个你可以考虑存储关系数据的子集,比如存一个用户的邻居,不用存储所有邻居,只存最相似的N即可
各大平台的推荐系统原来是靠他来完成的,太牛了

1. 推荐系统概述 电子商务网站是个性化推荐系统重要地应用的领域之一,亚马逊就是个性化推荐系统的积极应用者和推广者,亚马逊的推荐系统深入到网站的各类商品,为亚马逊带来了至少30%的销售...

h8b6pk7m7r8
2017/11/27
0
0
各大平台的推荐系统原来是靠他来完成的,太牛了

1. 推荐系统概述 电子商务网站是个性化推荐系统重要地应用的领域之一,亚马逊就是个性化推荐系统的积极应用者和推广者,亚马逊的推荐系统深入到网站的各类商品,为亚马逊带来了至少30%的销售...

h8b6pk7m7r8
2017/11/30
0
0
推荐算法综述

1. 前言 随着移动互联网技术和社交网络的发展,每天都有大量包括博客,图片,视频,微博等等的信息发布到网上。我们正处于大数据的时代,传统的信息检索技术已经不能满足用户对信息发现的需求...

u013709270
2017/11/24
0
0
系列学习——推荐算法综述

作者:章华燕 编辑:祝鑫泉 随着移动互联网技术和社交网络的发展,每天都有大量包括博客,图片,视频,微博等等的信息发布到网上。我们正处于大数据的时代,传统的信息检索技术已经不能满足用...

u013709270
01/01
0
0
推荐系统思考小结(基于Mahout)

最近一直学习Mahout和推荐引擎相关的知识,一直想搞清楚,什么样的推荐系统的架构才是合理,既能对海量数据进行复杂运算,又能及时响应做出推荐。在网上发现一篇对推荐系统结构讲解的很好的文...

Breath_L
2012/06/03
0
5
推荐系统-初识

推荐系统可认为是一种特殊形式的信息过滤(Information Filtering)系统,主要有“协同过滤推荐”、“基于内容的推荐”、“基于关联规则的推荐”、“基于知识推理的推荐”、“组合推荐”这几...

whk66668888
2017/10/31
0
0
探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤

集体智慧和协同过滤 什么是集体智慧 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web 应用中利用集体智慧构建更加有趣的应用或者得到更好的用...

Endeavour
2015/08/12
0
0
机器学习讲座,如何利用Spark MLlib进行个性推荐?

随着互联网发展,更多电商网站更加提倡用户参与和用户贡献。而在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法。 这种在信息过滤和信息系统中很受欢迎的技术...

zlw东南风
2017/10/25
0
0
推荐算法概览

推荐算法概览(一) 为推荐系统选择正确的推荐算法非常重要,而可用的算法很多,想要找到最适合所处理问题的算法还是很有难度的。这些算法每种都各有优劣,也各有局限,因此在作出决策前我们...

hblt-j
01/23
0
0
推荐系统之用户行为分析

最近读了项亮博士的《推荐系统实践》,在此对用户行为分析这章做一个总结。 用户行为介绍 基于用户行为的推荐,在学术界名为协同过滤算法。 协同过滤就是指用户可以齐心协力,通过不断地和网...

超级个体颛顼
2017/12/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
9分钟前
0
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
22分钟前
0
0
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
34分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
39分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
54分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
今天
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
今天
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
今天
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
今天
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部