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

原创博客,欢迎转载,转载请注明: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的话,我有点根儿颤,但一次全部查出再计算,肯定是个慢查询,且查询后的数据不是规则的,需要整,又添加了计算量;若各位有好的优化思路,望能分享下,先谢过。

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老黄的2021

0x01 21年怎么说呢,平淡中带点惊喜。21年在现在的公司待满 2 年了,仔细想想,还真是,这是第一个待满 2 年的公司。这一年,有了很多的挑战,业务上的,技术上的,管理上的都是。下半年开始…

document.elementFromPoint

先说一下这个方法的参数 elemntFromPoint(x,y);//传入坐标值,返回当前页面上包含该坐标点的顶层元素 注意2点,坐标值和顶层元素 先说坐标,因为不同的人理解是不一样的,也就造就了这个方法在不同的浏览器中表现是不一样的&#xff…

iis6 开启options方法_《王者荣耀》暗夜危机什么时候开启 暗夜危机开启时间

导读 王者荣耀神秘关卡暗夜危机怎么进?许多玩家对于这个暗夜危机的关卡还不太熟悉,不知道如何开启,下面就让九游小编为大家带来,王者荣耀暗夜危机开启方法介绍。 王者荣耀神秘关卡暗夜危机怎么进? 峡谷异闻... 王者荣耀…

全球顶级大学,在中国录取率却不足0.5%,答案一针见血!

▲点击查看一提起新加坡教育,恐怕大家的第一反应都是:特别牛!到底有多牛呢?我们拿数据说话——在全球公认的学生能力测试中,新加坡数学屡屡夺魁!在“国际数学和科学评测趋势报告 2019”(TIMSS&a…

div+css+js 树形菜单

2019独角兽企业重金招聘Python工程师标准>>> 代码&#xff1a; <div class"main_2"> <div class"m_left"> <ul class"nav"> <li id"bottom_none"><a href"#" onClick"DoMenu(C…

马化腾最崇拜的作家吴晓波《历代经济变革得失》读书笔记

吴晓波先生&#xff0c;是马化腾最崇拜的作家&#xff0c;腾讯的朋友说&#xff0c;马化腾逢人便推荐吴晓波的写的书《历代经济变革得失》&#xff0c;并亲自指示腾讯视频免费推广这个视频讲座。这本书我通读了两遍&#xff0c;总结了如下的笔记&#xff1a;

SQL:认识数据库约束

讲了关于数据库的很多内容&#xff0c;也讲了很多约束&#xff0c;对唯一和主键、核查和规则、外键约束很感兴趣。 一、唯一和主键&#xff08;实体完整性&#xff09;区别&#xff1a;数量&#xff1a;一张表只可以有一个主键约束&#xff0c;却可以有多个唯一约束。是否空值&…

Android之使用IDA Pro静态分析so文件

安卓应用程序的开发语言是java&#xff0c;但是由于java层的代码很容易被反编译&#xff0c;而反编译c/c程序的难度比较大&#xff0c;所以现在很多安卓应用程序的核心部分都使用NDK进行开发。关于NDK的开发知识点&#xff0c;请看这篇博客&#xff1a;Android之NDK开发。 关于…

.NET 6 中的 Logging Source Generator

.NET 6 中的 Logging Source GeneratorIntroLogging source generator 是 .NET 6 引入的一个新功能&#xff0c;借助 Source Generator 来实现&#xff0c;因为要用到 C# 9 中的分部方法(partial method)&#xff0c;C# 语言需要使用 9 及以上版本&#xff0c;具有更好的性能以…

电脑内部录音教程Virtual Audio Cable使用教程

1:下载Virtual Audio Cable2&#xff1a;安装Virtual Audio Cable3&#xff1a;设置&#xff08;注意这里line1不要开启监听其他设备&#xff09;3&#xff1a;打开声音传输通道软件C:\Program Files\Virtual Audio Cable\audiorepeater.exe点击start启动&#xff0c;最小化。4…

战队口号霸气押韵8字_高考励志班级口号霸气押韵大全

【导语】高考没有什么可怕的&#xff0c;一定要保证心态好&#xff0c;就可能考出比平时更好的成绩。下面是无忧考网分享的高考励志班级口号霸气押韵大全。欢迎阅读参考&#xff01;【篇一】高考励志班级口号霸气押韵1.激情澎湃&#xff0c;高考不败&#xff0c;斗志昂扬&#…

别说理科男不懂撩妹,这个老司机一生只爱两样:物理和18岁的少女

全世界只有3.14 % 的人关注了爆炸吧知识相信在很多人的眼中&#xff0c;科研人员都是正经和严肃的代名词。成就大&#xff0c;光芒大&#xff0c;仿佛天生圣人。但是超模君在和大家讲了这么多科学家的故事后&#xff0c;发现还是那句俗话说得好&#xff1a;科研是科研&#xff…

一条nginx命令引发的对于容器的思考

去年的时候写了一篇原创《前后端分离&#xff0c;如何在前端项目中动态插入后端API基地址&#xff1f;&#xff08;in docker&#xff09;》&#xff0c; 我自认为这篇生产实践是对大前端、 容器化、CI/CD的得意之作。对于前后端分离的web项目&#xff0c;在容器启动的瞬间&…

部门树形结构,使用Treeview控件显示部门

部门树形结构。设计张部门表用于存储部门编码、名称、上级部门id&#xff0c;使用Treeview控件显示部门树&#xff0c;并实现部门增删改、移动、折叠等功能。特别提示&#xff0c;部门有层级关系&#xff0c;可用donetbar的adtree控件 代码如下 1 using System;2 using System.…

移动端 登陆 模板 html_聚会邀请函请柬模板 免费设计制作生成

制作邀请函 请关注我们聚会并非你的个人发布会和生活成果展&#xff0c;而在于描绘经历了风雨沧桑的那道彩虹&#xff0c;世事变化&#xff0c;聚会不是为了显示某人身居高位&#xff0c;也不是衣锦还乡或日过斗金、大富大贵的炫耀&#xff0c;重温那充满梦想的花样年华&#x…

他们是你学生时期的噩梦,但现在你可以把他们按在墙上摩擦了……

全世界只有3.14 % 的人关注了爆炸吧知识用艺术家的眼光去看科学&#xff0c;用人生的角度去看艺术。——尼采看过日剧的朋友都不会陌生下面的场景&#xff1a;日本主妇会将存放在冰箱中的东西列出清单&#xff0c;然后用磁贴将之贴在冰箱门上。每次购物或煮食后&#xff0c;她们…

推荐系统相关算法(1):SVD

假如要预测Zero君对一部电影M的评分&#xff0c;而手上只有Zero君对若干部电影的评分和风炎君对若干部电影的评分&#xff08;包含M的评分&#xff09;。那么能预测出Zero君对M的评分吗&#xff1f;答案显然是能。最简单的方法就是直接将预测分定为平均分。不过这时的准确度就难…

vSphere日志分析器(vCenter Log Insight)安装、配置

很久没更新博客&#xff0c;最近在网上看到了1.0版本的vSphere分析器可下载并可测试&#xff0c;测试完后发觉以前人肉全手动分析log&#xff0c;看得眼前飘白雪的情况不会出现了。这里和大家分享一下。1 关于vCenter Log Insight当ESX/ESXi主机发生故障&#xff0c;很多用户或…