推荐召回--基于物品的协同过滤:ItemCF
1. 前言
说完基于用户的协同过滤后,趁热打铁,我们来说说基于物品的协同过滤:“看了又看”,“买了又买”。
如果说协同过滤在推荐系统的召回策略中,占据着非常重要的地位,那么基于物品的协同过滤ItemCF,就是协同过滤的重心。
协同过滤算法诞生于1998年,由亚马逊首先提出,论文是:Item-Based Collaborative Filtering Recommendation
Algorithms。该论文被授予“时间检验奖”,理由就是:该论文深深的影响了实际应用。历经二十多年,至今仍发光发热,为推荐系统的演化,做出了不可磨灭的贡献。
有的小伙伴可能会问:有了UserCF,还要什么ItemCF?存在即合理,在总结了UserCF后,大家有没有想过它的缺点呢?
- 用户的数量很大,计算起来,很耗时
- 用户的兴趣和口味会随着时间而变化
- 数据稀疏,用户间的消费会受热门物品的影响,很难发现用户真正的兴趣
而针对以上UserCF的缺点,ItemCF很好的解决了该问题。原因在于,构建物品-用户的倒排表,先去计算物品间的相似度,然后对用户已经消费过的物品进行规则过滤,那么这样的话,用户的兴趣就能很好的体现出来,此外,物品上通常比用户基数少,在计算方面相应的会缩短计算时间。
接下来,我们就详细的说说ItemCF。
2. 原理&计算&改进
跟用户的协同过滤很像,物品的协同过滤,也需要用户-物品的共现矩阵,区别于UserCF利用相似度计算方法去计算用户间的相似度,ItemCF是计算物品间的相似度,然后根据物品的相似度,再去加权评分给用户推荐。
当然,也可以直接对相似物品进行排序,直接把相似性高的物品,推荐给用户,作为召回结果。具体根据效果来判定使用哪种方式。
同UserCF计算相似度的方法一样,ItemCF的相似度计算也可以根据共现矩阵的特点去针对性的选择余弦相似度、杰卡德、皮尔逊等方法。此处,更新下变种的余弦相似度计算方法:
\]
分母\(|N(i)|\)是浏览 i 的用户数,分子\(|N(i)\cap N(j)|\)是一个月内同时浏览过 i 和 j 的用户数。在计算完相似度后,可以直接使用:
\]
公式的核心思想如下:
要预测一个用户 u 对一个物品 i 的分数,遍历用户 u 评分过的所有物品,假如一共有 m个,每一个物品和待计算物品 i 的相似度乘以用户的评分,这样加权求和后,除以所有这些相似度的总和,就得到了一个加权平均评分,作为用户 u 对物品 i 的分数预测。
在实际的工作中,相似度的计算都是拿前一天的用户数据离线计算完成后,直接存储在redis或hbase中,供后续排序阶段使用。
当然,相似度的计算方法有很多种,主要是根据业务实际情况来选择,还有Slope One算法,以及考虑序列跨度的相似度算法。此外,常规的改进思路有:在评分体系中,可以用矩阵中物品的分数,减去物品的均值分数。这样做的目的就是为了减少个人倾向所造成的影响。
3. 总结
关于协同过滤的总结到这里就告一段路,后续会继续总结其他召回通路,其实对于推荐召回侧来说,主要的就是与业务相关策略的实现,而排序侧主要就是算法为主了。
在实际的工作中,sklearn通常作为调试使用,如果数据量大,可以通过spark分布式计算框架来缩短计算量,但spark的底层一般不好修改,所以业界在大规模数据时,会以TensorFlow或Pytorch来训练模型。
对于推荐系统来说,不管数据量多大,使用什么平台工具,其根本就是就是思想和理念,所以一定要把召回侧、排序侧的实现原理搞懂,剩下的工具,不需太过担心,唯熟练尔。
最后,对于协同过滤来说,不管是UserCF还是ItemCF,无非就是三个过程:输入端的数据处理,中间过程的相似度计算方法,输出端的相似性词典和推荐得分。另外,根据不同的特征,选择不同的方法,组合拼接就可以实现最基本的推荐召回,一点也不难。
继续加油!
推荐召回--基于物品的协同过滤:ItemCF的更多相关文章
- 转】Mahout分步式程序开发 基于物品的协同过滤ItemCF
原博文出自于: http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ 感谢! Posted: Oct 14, 2013 Tags: Hadoopite ...
- 基于物品的协同过滤ItemCF的mapreduce实现
文章的UML图比较好看..... 原文链接:www.cnblogs.com/anny-1980/articles/3519555.html 基于物品的协同过滤ItemCF 数据集字段: 1. Use ...
- 基于物品的协同过滤item-CF 之电影推荐 python
推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based:基于内容 : Content Based 协同过滤包括基于物品的协同过滤和基于用户 ...
- Mahout分步式程序开发 基于物品的协同过滤ItemCF
http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...
- 推荐召回--基于用户的协同过滤UserCF
目录 1. 前言 2. 原理 3. 数据及相似度计算 4. 根据相似度计算结果 5. 相关问题 5.1 如何提炼用户日志数据? 5.2 用户相似度计算很耗时,有什么好的方法? 5.3 有哪些改进措施? ...
- 【RS】Amazon.com recommendations: item-to-item collaborative filtering - 亚马逊推荐:基于物品的协同过滤
[论文标题]Amazon.com recommendations: item-to-item collaborative filtering (2003,Published by the IEEE C ...
- 基于物品的协同过滤算法(ItemCF)
最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...
- 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms” .
ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3 基于物品的协同过滤推荐算法--读"Item-Based ...
- ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路
ItemCF_基于物品的协同过滤 1. 概念 2. 原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3. java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第 ...
随机推荐
- Linux使用tar解压的时候去掉父级目录
去除解压目录结构使用 --strip-components N 如: 压缩文件text.tar 中文件信息为 src/src1/src2/text.txt 运行 tar -zxvf text.tar ...
- JS中使用reconnecting-websocket实现websocket断开自动重新连接
这里用了第三方的js 官方地址:https://github.com/joewalnes/reconnecting-websocket 引入js reconnecting-websocket.min. ...
- JAVA使用IDEA本地调试服务的代码
然后将启动参数的 jdwp=transport=dt_socket,server=y,suspend=n,address=8086 放到服务器上 在执行jar包的命令加入这个 例如 java -jar ...
- MacOS设置终端代理
前言 国内的开发者或多或少都会因为网络而烦恼,因为一些特殊原因有时候网络不好的时候需要使用代理才能完成对应的操作.原来我一直都是使用斐讯路由器然后刷了梅林的固件,直接在路由器层面设置转发代理,把一些国 ...
- 【LeetCode】21. Merge Two Sorted Lists 合并两个有序链表
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,有序链表,递归,迭代,题解,leetcode, 力 ...
- Discrete Logging(poj2417)
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5120 Accepted: 2319 ...
- PAT甲组 1010 Radix (二分)
1010 Radix (25分) Given a pair of positive integers, for example, \(6\) and \(110\), can this equatio ...
- TLS、SSL
TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 Hash.对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性. ...
- Redis 实现了自己的 VM
Redis的VM(虚拟内存)机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据). Redis提高数据库容量的办法有两种: 1.一种是可以 ...
- ios离线打包报错Showing Recent Messages :-1: HBuilder has conflicting provisioning settings. HBuilder is automatically signed for development, but a conflicting code signing identity iPhone Distribution has
1.解决方案找到项目工程文件右击->显示包内容->双击project.pbxproj->搜索distribution改写成Developer