1. 前言

说完基于用户的协同过滤后,趁热打铁,我们来说说基于物品的协同过滤:“看了又看”,“买了又买”。

如果说协同过滤在推荐系统的召回策略中,占据着非常重要的地位,那么基于物品的协同过滤ItemCF,就是协同过滤的重心。

协同过滤算法诞生于1998年,由亚马逊首先提出,论文是:Item-Based Collaborative Filtering Recommendation

Algorithms。该论文被授予“时间检验奖”,理由就是:该论文深深的影响了实际应用。历经二十多年,至今仍发光发热,为推荐系统的演化,做出了不可磨灭的贡献。

有的小伙伴可能会问:有了UserCF,还要什么ItemCF?存在即合理,在总结了UserCF后,大家有没有想过它的缺点呢?

  1. 用户的数量很大,计算起来,很耗时
  2. 用户的兴趣和口味会随着时间而变化
  3. 数据稀疏,用户间的消费会受热门物品的影响,很难发现用户真正的兴趣

而针对以上UserCF的缺点,ItemCF很好的解决了该问题。原因在于,构建物品-用户的倒排表,先去计算物品间的相似度,然后对用户已经消费过的物品进行规则过滤,那么这样的话,用户的兴趣就能很好的体现出来,此外,物品上通常比用户基数少,在计算方面相应的会缩短计算时间。

接下来,我们就详细的说说ItemCF。

2. 原理&计算&改进

跟用户的协同过滤很像,物品的协同过滤,也需要用户-物品的共现矩阵,区别于UserCF利用相似度计算方法去计算用户间的相似度,ItemCF是计算物品间的相似度,然后根据物品的相似度,再去加权评分给用户推荐。

当然,也可以直接对相似物品进行排序,直接把相似性高的物品,推荐给用户,作为召回结果。具体根据效果来判定使用哪种方式。

同UserCF计算相似度的方法一样,ItemCF的相似度计算也可以根据共现矩阵的特点去针对性的选择余弦相似度、杰卡德、皮尔逊等方法。此处,更新下变种的余弦相似度计算方法:

\[w_{i,j} = \frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}}
\]

分母\(|N(i)|\)是浏览 i 的用户数,分子\(|N(i)\cap N(j)|\)是一个月内同时浏览过 i 和 j 的用户数。在计算完相似度后,可以直接使用:

\[pred(u,i)=\hat{r}_{ui}=\frac{\sum_{v\in U}sim(u,v)*r_{vi}}{\sum_{v\in U}|sim(u,v)|}
\]

公式的核心思想如下:

要预测一个用户 u 对一个物品 i 的分数,遍历用户 u 评分过的所有物品,假如一共有 m个,每一个物品和待计算物品 i 的相似度乘以用户的评分,这样加权求和后,除以所有这些相似度的总和,就得到了一个加权平均评分,作为用户 u 对物品 i 的分数预测。

在实际的工作中,相似度的计算都是拿前一天的用户数据离线计算完成后,直接存储在redis或hbase中,供后续排序阶段使用。

当然,相似度的计算方法有很多种,主要是根据业务实际情况来选择,还有Slope One算法,以及考虑序列跨度的相似度算法。此外,常规的改进思路有:在评分体系中,可以用矩阵中物品的分数,减去物品的均值分数。这样做的目的就是为了减少个人倾向所造成的影响。

3. 总结

关于协同过滤的总结到这里就告一段路,后续会继续总结其他召回通路,其实对于推荐召回侧来说,主要的就是与业务相关策略的实现,而排序侧主要就是算法为主了。

在实际的工作中,sklearn通常作为调试使用,如果数据量大,可以通过spark分布式计算框架来缩短计算量,但spark的底层一般不好修改,所以业界在大规模数据时,会以TensorFlow或Pytorch来训练模型。

对于推荐系统来说,不管数据量多大,使用什么平台工具,其根本就是就是思想和理念,所以一定要把召回侧、排序侧的实现原理搞懂,剩下的工具,不需太过担心,唯熟练尔。

最后,对于协同过滤来说,不管是UserCF还是ItemCF,无非就是三个过程:输入端的数据处理,中间过程的相似度计算方法,输出端的相似性词典和推荐得分。另外,根据不同的特征,选择不同的方法,组合拼接就可以实现最基本的推荐召回,一点也不难。

继续加油!

推荐召回--基于物品的协同过滤:ItemCF的更多相关文章

  1. 转】Mahout分步式程序开发 基于物品的协同过滤ItemCF

    原博文出自于: http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ 感谢! Posted: Oct 14, 2013 Tags: Hadoopite ...

  2. 基于物品的协同过滤ItemCF的mapreduce实现

    文章的UML图比较好看..... 原文链接:www.cnblogs.com/anny-1980/articles/3519555.html 基于物品的协同过滤ItemCF 数据集字段: 1.  Use ...

  3. 基于物品的协同过滤item-CF 之电影推荐 python

    推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based:基于内容 : Content Based 协同过滤包括基于物品的协同过滤和基于用户 ...

  4. Mahout分步式程序开发 基于物品的协同过滤ItemCF

    http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  5. 推荐召回--基于用户的协同过滤UserCF

    目录 1. 前言 2. 原理 3. 数据及相似度计算 4. 根据相似度计算结果 5. 相关问题 5.1 如何提炼用户日志数据? 5.2 用户相似度计算很耗时,有什么好的方法? 5.3 有哪些改进措施? ...

  6. 【RS】Amazon.com recommendations: item-to-item collaborative filtering - 亚马逊推荐:基于物品的协同过滤

    [论文标题]Amazon.com recommendations: item-to-item collaborative filtering (2003,Published by the IEEE C ...

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

    最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...

  8. 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms” .

    ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3 基于物品的协同过滤推荐算法--读"Item-Based ...

  9. ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路

    ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第 ...

随机推荐

  1. Vim使用简介

    Vim操作 Vim真的很酷:D 编辑模式 正常模式:在文件中四处移动光标进行修改 插入模式:插入文本 替换模式:替换文本 可视化(一般,行,块)模式:选中文本块 命令模式:用于执行命令 在不同的操作模 ...

  2. AcWing429. 奖学金

    题目: 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金. 期末,每个学生都有3门课的成绩:语文.数学.英语. 先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从 ...

  3. JAVA导入(读取)Excel中的数据(支持xls与xlsx文件)

    一.导入jar包 poi-3.7.jarpoi-scratchpad-3.7.jarpoi-examples-3.7.jarpoi-ooxml-3.7.jarpoi-ooxml-schemas-3.7 ...

  4. JAVA通过正则匹配html里面body标签的内容,去掉body标签

    /** * 获取html中body的内容 包含body标签 * @param htmlStr html代码 * @return */ public static String getBody(Stri ...

  5. C语言补漏-逗号运算符与逗号表达式

    1. 新名词? 今天看到一个新名词: 逗号表达式. C语言就有.额,怎么当时学习C没见过,一头雾水. 对我来说是新名词,其实它早就存在了,只是我还不知道. 2. 逗号表达式 C语言提供了逗号运算符-- ...

  6. 【LeetCode】136. Single Number 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 异或 字典 日期 [LeetCode] 题目地址:h ...

  7. 【LeetCode】599. Minimum Index Sum of Two Lists 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:找到公共元素再求索引和 方法二:索引求和,使 ...

  8. 1266 - Points in Rectangle

    1266 - Points in Rectangle    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...

  9. Labeling Balls(poj3687)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13109   Accepted: 3782 D ...

  10. 1382 - The Queue

    1382 - The Queue   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB On som ...