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. mysql三种提交类型

    mysql提交分显式提交.隐式提交及自动提交. (1) 显式提交用COMMIT命令直接完成的提交为显式提交.其格式为:SQL>COMMIT: (2) 隐式提交用SQL命令间接完成的提交为隐式提交 ...

  2. cmake以源码的方式引入第三方项目

    最前 本文将介绍一种以源码的方式引入第三方库的方法 准备 主项目,需要引用第三方库的某些函数 第三方库,以源码的形式提供给主项目使用 注意: 本文的背景:已经将第三方源码下载好. 一个例子 我这里准备 ...

  3. win10使用cmake编译libevent(解决依赖openssl)

    概述 win10没有安装openssl cmake version: 3.18 libevent version: 2.1.10-stable libevent目前的版本中写好了 CMakeLists ...

  4. C++之面试题(4)

    题目描述 来源:牛客网 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素. 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在 ...

  5. vc++ 调用winapi调节屏幕亮度(增加win7代码demo)

    1.关于 代码是通过测试的,测试环境: win7 + MFC 为什么要发在这里? 区别于上一篇随笔. MD排版更顺眼 demo 会放到 这里 更正了上一篇随笔中的代码错误 2.头文件 #include ...

  6. 使用.NET 6开发TodoList应用(8)——实现全局异常处理

    系列导航 使用.NET 6开发TodoList应用文章索引 需求 因为在项目中,会有各种各样的领域异常或系统异常被抛出来,那么在Controller里就需要进行完整的try-catch捕获,并根据是否 ...

  7. 【LeetCode】320. Generalized Abbreviation 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...

  8. 【九度OJ】题目1061:成绩排序 解题报告

    [九度OJ]题目1061:成绩排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1061 题目描述: 有N个学 ...

  9. Android程序设计基础 • 【第1章 Android程序入门】

    全部章节   >>>> 本章目录 1.1 Android 平台介绍 1.1.1 Android 简介 1.1.2 Android 平台的发展 1.1.3 Android 平台架 ...

  10. MySQL数据操作与查询笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...