推荐系统 - 召回 - 协同过滤

协同过滤

这里要先声明一点,仅仅基于用户行为(浏览、加购物车、购买)数据设计的推荐算法一般称为协同过滤算法。凡是那些考虑了商品本身特性的算法不叫协同过滤。

1. 基于用户的协同过滤算法

定义:在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的整个用户群体,然后把这个用户群体喜欢的、而用户A没有听说过的物品推荐给A。

主要包含两个步骤:
a. 计算用户之间的相似度:找到和用户A兴趣相似的用户群体。
b. 用户群体对物品的喜好程度、以及用户A和用户群体的相似度为每个物品打分:找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

Step1: 计算用户相似度

根据协同过滤算法的定义,这里主要是利用用户行为的相似度来计算兴趣的相似度。

给定用户u和用户v, 令N(u)和N(v)分别表示用户u和用户v曾经有过正反馈的物品集合,则有如下三种方式计算相似度:

1.1 Jaccard相似度

用户u和用户v的相似度记作w_{uv}。分子是两者浏览/加购/购买的商品的交集;分母是二者的并集。

1.2 余弦相似度

举例:

用户A对物品{a, b, d}有过行为,用户B对物品{a, c}有过行为,用户C对物品{b,e}有过行为,用户D对物品{c,d,e}有过行为。

对利用余弦相似度公式计算用户A和用户B、C、D的相似度为:

分析

以上例子对两两用户通过利用余弦相似度计算相似度。因为要两两比较所有的用户,这种方法的时间复杂度是O(|U|*|U|),|U|代表用户数。这在用户数很大时非常耗时。京东的活跃用户超过一亿,每次都计算一遍用户两两相似度是绝对不可能的。

解决办法1.  建立“物品—用户”的倒排表。这里的优化思路是,很多用户之间的行为并没有交集(没有购买过相同的商品),根本就不需要两两比较他们。在Item-User的倒排表中,同一个Item下面的User两两之间一定是有交集的(因为这些用户至少都买了这个item)。所以只需要遍历所有的Item,对其下所有的User两两进行统计即可,这样可以极大降低时间复杂度。

所以,可以建立一个稀疏对称矩阵C[u][v] =  | N(u)∩N(v) |,第u行第v列就代表用户u和用户v购买的相同商品的个数。这个矩阵必是对称的,因为用户u和用户v购买的相同商品个数 一定等于 用户v和用户u购买的相同商品个数。这个矩阵一般是很稀疏的,这是因为当商品有很多的时候,大部分用户并没有购买过相同的商品。

具体做法是,扫描倒排表中每个item对应的用户列表,将用户列表中的两两用户对应的C[u][v]加1(意思是用户u和用户v购买了一个相同的商品)。最终就可以得到C[u][v]矩阵,具体如下图所示:

解决办法2. 在实际工程上,我们采用了LSH的方法:https://blog.csdn.net/weixin_41332009/article/details/112828093

1.3 改进的余弦相似度(UserIIF算法)

余弦相似度计算用户兴趣过于粗糙,因为可能有一些非常热门的商品,很多人都会去买,但是这并不代表用户是相似的。

改进思路:两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。

在UserIIF算法中,N(i)是物品i的热度(就是item-user倒排索引中,有多少用户对这个物品i有过行为)。通过1/log(1+|N(i)|)惩罚了用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。这种算法叫做User-IIF算法。可见其对热门物品进行了惩罚,因为两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。

对UserCF-IIF的推荐性能,并将其和UserCF进行对比:

可以看到,UserCF-IIF在各项性能上略优于UserCF。这说明在计算用户兴趣相似度时考虑物品的流行度对提升推荐结果的质量确实有帮助。

考虑物品流行度之后,推荐算法的流行度降低了(新颖度提高了),说明它能够关注那些 冷门的商品;相应的,覆盖率上升了,说明它能够覆盖更多的长尾商品。

Step2: 为物品打分

得到用户之间的兴趣相似度后, UserCF算法会给用户u推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了UserCF算法中用户u对物品i的感兴趣程度

用户u对物品i的感兴趣程度可以用和用户u相似的用户群体对物品i的感兴趣程度来估计。

p(u,i)表示用户u对物品i的感兴趣程度,S(u,K)表示和用户u兴趣最接近的K个用户,N(i)是对物品i有过行为的用户集合。这里考虑S(u,K)和N(i)的交集,作为和用户u相似的用户群体。w_{uv}​是用户u和用户v的兴趣相似度,r_{vi}是用户v对物品i的兴趣。

在实现的时候,往往会取一个较小的K值,先召回一批物品(找到这K个相似用户感兴趣的物品集)。然后为这个物品集中选择目标用户u未见过的物品利用上述公式进行打分,就得到了用户u对物品集中所有物品的感兴趣程度。

分析:

使用MovieLens数据集上的离线实验来评测基础算法的性能。 UserCF只有一个重要的参数K,即为每个用户选出K个和他兴趣最相似的用户,然后推荐那K个用户感兴趣的top n个物品:

可以发现参数K是UserCF的一个重要参数,它的调整对推荐算法的各种指标都会产生一定的影响。(K表示要去关注多少个和我们的目标用户相似的用户)

- 准确率accuracy和召回率recall:

可以看到,推荐系统的精度指标(准确率和召回率)并不和参数K成线性关系。在MovieLens数据集中,选择K=80左右会获得比较高的准确率和召回率。因此选择合适的K对于获得高的推荐系统精度比较重要。

- 流行度:

可以看到,在3个数据集上K越大则UserCF推荐结果就越热门。这是因为K决定了UserCF在给你做推荐时参考多少和你兴趣相似的其他用户的兴趣,那么如果K越大,参考的人越多,结果就越来越趋近于全局热门的物品。

- 覆盖率:

可以看到,在3个数据集上, K越大则UserCF推荐结果的覆盖率越低。覆盖率的降低是因为随着流行度增加, UserCF越来越倾向于推荐热门的物品,从而对长尾物品的推荐越来越少,因此造成了覆盖率的降低。

基于用户的协同过滤总结

  • 随着着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系。
  • 很难对推荐结果作出解释。

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

基于物品的协同过滤算法是目前业界应用最多的算法。

定义:

给用户推荐那些和他们之前喜欢的物品“相似的”物品。(“买过这个商品的人也买了...”)

步骤:

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

step 1. 计算物品的相似度

注意,这里的“物品相似度”指的不是物品本身内容上的相似,而是利用用户的行为数据,即比较对两个物品有过正反馈的用户集合的相似性。令N(i)为喜欢物品i的用户集合,则有如下几种相似度计算方法:

  • 余弦相似度(ItemCF算法)

其中,N(i)表示对商品i有过行为的用户集合;N(j)表示对商品j有过行为的用户集合。而分子 |N(i)∩N(j)| 是同时喜欢物品 i 和物品 j 的用户数。

  • 改进的余弦相似度(ItemCF-IUF算法)

N(i)表示对物品i感兴趣的用户群体;N(j)表示对物品j感兴趣的用户群体。N(u)表示用户u感兴趣的所有物品。两个物品产生相似度是因为它们共同出现在同一个用户的兴趣列表中(想一想user-item倒排索引)。换句话说,每个用户的兴趣列表都对物品的相似度产生贡献。那么,是不是每个用户的贡献都相同呢?

未必。有些用户虽然活跃,但是他买的书覆盖了当当网图书的很多领域(但是这些书并不相似!)。所以这个用户对于他所购买书的两两相似度的贡献应该远远小于一个只买了十几本自己喜欢的书的文学青年。所以,与UserIIF算法类似,这里也对热门用户进行了惩罚。即:活跃用户对物品相似度的贡献应该小于不活跃的用户

Step2: 为物品打分

在统计完物品之间的相似度之后,就可以利用这种物品相似度以及用户对历史物品的感兴趣程度为未见物品打分。其公式如下: 

想要判断用户u对商品j的喜爱程度p(u,j),就需要找到和商品j相似的、且用户u有过行为的商品群体。这里N(u)是用户u有过行为的物品集合,S(j,K)是和物品j最相似的K个物品的集合。w_{ji}是物品j和i的相似度,r_{ui}​是用户u对物品i的兴趣。

例子:

用户喜欢《C++ Primer中文版》和《编程之美》两本书。然后ItemCF会为这两本书分别找出和它们最相似的3本书(这一部分是初步召回,“相似”指的是二者的用户群体相似),并根据公式的定义计算用户对每本书的感兴趣程度。

用户对《C++ Primer中文版》的喜爱程度为1.3,《C++ Primer中文版》和《C++编程思想》的相似度为0.7,所以用户对《C++编程思想》的喜爱程度就是1.3*0.7 = 0.91.

可以看到, ItemCF的一个优势就是可以提供推荐解释,即利用用户历史上喜欢的物品为现在的推荐结果进行解释。(比如,推荐了《算法导论》的原因是用户购买了《C++ Primer中文版》)

在实际计算中,为了减少运行时间,可以首先建立用户—物品倒排表(即对每个用户建立一个包含他喜欢的物品的列表),然后对于每个用户,将他物品列表中的物品两两在共现矩阵C中加1。C[i][j] 记录了同时喜欢物品 i 和物品 j 的用户数。最后,将C矩阵归一化可以得到物品之间的余弦相似度矩阵W。

 

3. ItemCF和UserCF的比较

UserCF给用户推荐那些和他有共同兴趣爱好的用户喜欢的物品

ItemCF给用户推荐那些和他之前喜欢的物品类似的物品

所以,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,既社会化。而ItemCF的推荐结果着重于维系用户的历史兴趣,即个性化

因此,在新闻推荐中使用UserCF,原因有三:

  1. 用户的兴趣不是特别细化,绝大多数用户都喜欢看热门的新闻。
  2. 物品的更新速度远远快于新用户的加入速度,物品相似度矩阵实在太大难以维护。
  3. 这类网站用户数相对较稳定,维护用户相似度矩阵代价较小。

图书、电子商务和电影网站中使用ItemCF,原因有二:

  1. 在这些网站中,用户的兴趣是比较固定和持久的,即对物品热门程度并不是那么敏感。
  2. 这类网站物品数相对较稳定,维护物品相似度矩阵代价较小,一天一次更新物品相似度矩阵对它们来说不会造成太大的损失,是可以接受的。

在这里插入图片描述

4. 哈利波特问题

在设计ItemCF算法之初发现ItemCF算法计算出的图书相关表存在一个问题,就是很多书都和《哈利波特》相关。也就是说,购买任何一本书的人似乎都会购买《哈利波特》。后来他们研究发现,主要是因为《哈利波特》太热门了,确实是购买任何一本书的人几乎都会购买它。

但实际上,这些书与《哈利波特》并不同属同一类型。换句话说,哈利波特问题描述的是两个不同领域的最热门物品之间往往具有比较高的相似度

解决办法:

其中一个办法是可以在分母上加大对热门物品的惩罚,比如采用如下公式:

其中α∈[0.5 ,1] 。通过提高α,就可以惩罚热门的物品 j 。而更好的方法是依靠引入物品的内容数据解决这个问题,比如对不同领域的物品降低权重等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值