推荐算法之基于物品的协同过滤

基于物品的协同过滤( item-based collaborative filtering )算法是此前业界应用较多的算法。无论是亚马逊网,还是NetflixHuluYouTube ,其推荐算法的基础都是该算法。为行文方便,下文以英文简称ItemCF表示。本文将从其基础算法讲起,一步步进行改进并基于MovieLens 数据集给出代码实现,带你领略这一经典算法的美。

1.基本原理

前面我们简单讲解了一下基于用户的协同过滤推荐(UserCF),并且给出了实现代码。还不了解的朋友可以转到链接----推荐算法之基于用户的协同过滤。但是我们也讲到该算法存在一些缺点,首先,随着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系。其次,基于用户的协同过滤很难对推荐结果作出解释。因此,著名的电子商务公司亚马逊提出了另一个算法——ItemCF 。

ItemCF 给用户推荐那些和他们之前喜欢的物品相似的物品。比如,该算法会因为你购买过《统计学习方法》而给你推荐《机器学习》。不过,ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度该算法认为,物品 A 和物品 B 具有很大的相似度是因为喜欢物品 A 的用户大都也喜欢物品B

基于物品的协同过滤算法可以利用用户的历史行为给推荐结果提供推荐解释,比如给用户推荐《迷迭香》的解释可以是因为用户之前喜欢《她的睫毛》。

基于物品的协同过滤算法主要分为两步

  1. 计算物品之间的相似度
  2. 根据物品的相似度和用户的历史行为给用户生成推荐列表

购买了该商品的用户也经常购买的其他商品这句话的定义出发,我们可以用下面的公式定义物品的相似度:
\[
w_{ij}=\frac{|N(i) \bigcap N(j)|}{|N(i)|}
\]
这里,分母\(|N(i)|\)是喜欢物品i的用户数,而分子\(N(i) \bigcap N(j)\)是同时喜欢物品i和物品j的用户数。因此,上述公式也可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。

上述公式虽然看起来很有道理,但是却存在一个问题。如果物品 j 很热门,很多人都喜欢,那么 \(w_{ij}\)就会很大,接近 1 。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,这对于致力于挖掘长尾信息的推荐系统来说显然不是一个好的特性。为了避免推荐出热门的物品,可以用下面的公式:
\[
w_{ij}=\frac{|N(i) \bigcap N(j)|}{\sqrt{|N(i)||N(j)|}}
\]
这个公式惩罚了物品 j 的权重,因此减轻了热门物品会和很多物品相似的可能性。

从上面的定义可以看到,在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜欢,也就是说每个用户都可以通过他们的历史兴趣列表给物品贡献相似度。这里面蕴涵着一个假设就是每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度

UserCF算法类似,不过这里是建立用户-物品倒排表,然后计算物品的相似度。ItemCF通过如下公式计算用户u对一个物品j的兴趣:
\[
p_{uj}=\sum_{i \in N(u) \bigcap S(j,K)}{W_{ji}r_{ui}}
\]
本文基于MovieLens数据集(显性反馈数据集)实现了该算法,地址详见:ItemCF算法实现

2.算法改进

2.1 引入IUF参数软性惩罚活跃用户

在前面的篇幅中可以看到,在ItemCF中两个物品产生相似度是因为它们共同出现在很多用户的兴趣列表中。换句话说,每个用户的兴趣列表都对物品的相似度产生贡献。但是,在现实生活中并不是每个用户的贡献都相同

于是John S. Breese在论文中提出了一个称为 \(IUF\)(Inverse User Frequence ),即用户活跃度对数的
倒数的参数,他也认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加 IUF
参数来修正物品相似度的计算公式:
\[
w_{ij}=\frac{\sum_{u \in N(i) \bigcap N(j)}{\frac{1}{\log1 + |N(u)|}}}{\sqrt{|N(i)||N(j)|}}
\]
当然,上面的公式只是对活跃用户做了一种软性的惩罚,但对于很多过于活跃的用户,比如上面那位买了当当网 80% 图书的用户,为了避免相似度矩阵过于稠密,我们在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中

2.2 归一化相似矩阵

Karypis在研究中发现如果将 ItemCF相似度矩阵按最大值归一化,可以提高推荐的准确率。其研究表明,如果已经得到了物品相似度矩阵 w ,那么可以用如下公式得到归一化之后的相似度矩阵 ‘w‘ :
\[
w'_{ij} = \frac{w_{ij}}{\max_{j}w_{ij}}
\]
归一化的好处不仅仅在于增加推荐的准确度,它还可以提高推荐的覆盖率和多样性。一般来说,物品总是属于很多不同的类,每一类中的物品联系比较紧密。

举一个例子,假设在一站中,有两种电影——纪录片和动画片。那么, ItemCF 算出来的相似度一般是纪录片和纪录片的相似度或者动画片和动画片的相似度大于纪录片和动画片的相似度。但是纪录片之间的相似度和动画片之间的相似度却不一定相同。假设物品分为两类—— A 和 B , A 类物品之间的相似度为 0.5 , B 类物品之间的相似度为 0.6 ,而 A 类物品和 B 类物品之间的相似度是 0.2 。在这种情况下,如果一个用户喜欢了 5 个 A 类物品和 5 个 B 类物品,用 ItemCF 给他进行推荐,推荐的就都是 B 类物品,
因为 B 类物品之间的相似度大。但如果归一化之后, A 类物品之间的相似度变成了 1 , B 类物品之间的相似度也是 1 ,那么这种情况下,用户如果喜欢 5 个 A 类物品和 5 个 B 类物品,那么他的推荐列表中 A 类物品和 B 类物品的数目也应该是大致相等的。从这个例子可以看出,相似度的归一化可以提高推荐的多样性。

那么,对于两个不同的类,什么样的类其类内物品之间的相似度高,什么样的类其类内物品相似度低呢?一般来说,热门的类其类内物品相似度一般比较大。如果不进行归一化,就会推荐比较热门的类里面的物品,而这些物品也是比较热门的。因此,推荐的覆盖率就比较低。相反,如果进行相似度的归一化,则可以提高推荐系统的覆盖率。

3.小结

ItemCF的推荐结果着重于维系用户的历史兴趣,即推荐更加个性化,反映了用户自己的兴趣传承。在图书、电子商务和电影网站,比如亚马逊、豆瓣、Netflix 中, ItemCF 则能极大地发挥优势。首先,在这些网站中,用户的兴趣是比较固定和持久的。这些网站中个性化推荐的任务是帮助用户发现和他研究领域相关的物品

Item算法适用于物品数明显小于用户数的场合,长尾物品丰富,用户个性化需求强烈的领域。该算法可实时性强,用户有新行为,一定会导致推荐结果的实时变化。并且可以给出良好的推荐解释。冷启动方面,新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品。但没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户。

PS:(???)觉得作者文章还不错的话,请点一下推荐哦!万分感谢!)

原文地址:https://www.cnblogs.com/rainbowly/p/12128615.html

时间: 2024-10-24 11:13:05

推荐算法之基于物品的协同过滤的相关文章

推荐算法之基于物品的协同过滤算法

基于物品的协同过滤算法(ItemCF)是业界应用最多的算法,主要思想是利用用户之前有过的行为,给用户推荐和之前物品类似的物品. 基于物品的协同过滤算法主要分为两步: 1)计算物品之间的相似度. 2)依据物品的相似度和用户的历史行为给用户生成推荐列表. 第一步的关键点在于计算物品之间的相似度,这里并不採用基于内容的相似性,而是去计算在喜欢物品i的用户中有多少是喜欢物品j的,这样计算的前提是用户的兴趣爱好通常是比較确定的,不easy变,那么当一个用户对两个物品都喜欢的时候,我们往往能够觉得这两个物品

推荐算法之基于用户的协同过滤算法

协同过滤是推荐算法中最基本的算法,主要分为基于用户的协同过滤算法和基于物品的协同过滤算法. 这篇文章主要介绍基于用户的协同过滤算法,简单来说,要给用户u作推荐,那么只要找出那些和u之前的行为类似的用户,即和u比较像的用户,把他们的行为推荐给用户u即可.所以基于用户的系统过滤算法包括两个步骤:1)找到和目标用户兴趣相似的用户集合  2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 第一步的关键点在于计算用户之间的相似度,相似度一般通过Jaccard公式或者余弦相似度即可求

推荐算法之基于用户的协同过滤

基于用户的的协同过滤算法是推荐统统最古老的算法,简称UserCF.该算法的诞生一定程度上标志着推荐系统的诞生.本文将对UserCF算法原理进行讲解,并且基于Movielens数据集给出实现代码供大家交流学习. 基本原理 在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,先找到和他相似兴趣的其他用户,然后把那些用户喜欢的而用户A没有听说过的物品推荐给用户A.这种方法就称为基于用户的协同过滤算法.该算法主要包括两个步骤: 找到和目标用户兴趣相似的用户集合 找到这个集合中用户喜欢的且目标用户没

推荐算法简介:基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐

参考来源: https://blog.csdn.net/u011748319/article/details/90269818 1.推荐算法 1.1.协同过滤 协同过滤是目前应用最广泛的推荐算法,它仅仅通过了解用户与物品之间的关系进行推荐,而根本不会考虑到物品本身的属性. 可分成两类: 1.基于用户(user-based)的协同过滤 2.基于商品(item-based)的协同过滤 1.1.1.基于用户的协同过滤 基本思想: 基于用户对物品的偏好找到邻居用户(相似用户),然后将邻居用户(相似用户)

基于用户和基于物品的协同过滤算法的比较

首先回顾一下,协同过滤算法主要有两种,一种是基于用户的协同过滤算法(UserCF),另一种是基于物品的协同过滤算法(ItemCF). 基于用户的协同过滤算法主要有两步: 1)找到和目标用户兴趣相似的用户集合 2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 基于物品的协同过滤算法主要有两步: 1)计算物品之间的相似度. 2)根据物品的相似度和用户的历史行为给用户生成推荐列表. 由此可以看出UserCF是推荐用户所在兴趣小组中的热点,更注重社会化,而ItemCF则是根据用

基于物品的协同过滤算法ItemCF算法实现

基于物品的协同过滤算法(ItemCF)的基本思想是:给用户推荐那些和他们之前喜欢的物品相似的物品. 比如,该算法会因为你购买过<Java从入门到精通>而给你推荐<Java并发编程实战>.不过,基于物品的协同过滤算法并不利用物品的内容属性计算物品之间的相似度,二是通过分析用户的行为数据计算物品之间的相似度.该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B. 实现代码: # -*- coding=utf-8 -*- from operator impor

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

2017年2月19日, 星期日 ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第二步:构建用户的得分矩阵 第三步:同现矩阵*评分矩阵 第四步:拿到最终结果,排序,得到给用户的推荐列表 问题一:物品同现矩阵和用户得分矩阵如何构建? 问题二:矩阵相乘如何来做?   六个MapReduce step1_第一个MapReduce: 目的-->去重去除数据

基于物品的协同过滤(二)

MapReduce实现基于物品的协同过滤: 实现过程中需要执行多个mapreduce任务. 初始数据: u1,i101,5.0 u1,i102,3.0 u1,i103,2.5 u2,i101,2.0 u2,i102,2.5 u2,i103,5.0 u2,i104,2.0 u3,i101,2.0 u3,i104,4.0 u3,i105,4.5 u3,i107,5.0 u4,i101,5.0 u4,i103,3.0 u4,i104,4.5 u4,i106,4.0 u5,i101,4.0 u5,i10

百万用户,八十万商品,如何计算基于物品的协同过滤

问题描述: 数据包含了一百四十万用户对80万商品的打分.要利用基于物品的协同过滤来计算.如果直接两两计算140万维的向量相似度,肯定不行啊. 问题分析: 每个物品的向量虽然是140万维的,但是其实给一个物品打分的用户其实不多,这个矩阵是非常稀疏的.而且根据长尾问题来说,大部分物品只有很少的用户有过评分. 总结来说就是每个物品评分的用户远远小于140万,每个用户评价过的商品远远小于80万.所以我们的问题就转换为如何处理这个稀疏的矩阵. 解决方法: 在计算相似度时,选用了夹角余弦(因为相比于杰卡德,