解析协同过滤方法

点击上方“蓝字”关注我们

协同过滤( Collaborative Filtering)

Mar 26, 2020

本期介绍推荐系统中的协同过滤方法。

本文约3k字,预计阅读18分钟。

「基于用户行为」设计的推荐算法,即协同过滤,从字面上理解,包括协同和过滤两个操作。所谓协同就是利用群体的行为来做决策(推荐)。对于推荐系统来说,通过用户的持续协同作用(与网站不断进行互动),最终给用户的推荐会越来越准确。而过滤,就是从可行的决策(推荐)物品中将用户喜欢的物品找(过滤)出来。

具体来说,协同过滤的思路是通过群体的行为来找到某种相似性(用户之间的相似性或者物品之间的相似性),通过该相似性来为用户做决策和推荐。

协同过滤有「基于邻域的方法(neighborhood methods)」「隐语义模型(latent factor model)」基于图的随机游走方法(random walk on graph)」等。基于邻域应用最为广泛,主要包含两种算法:

  • 基于用户的协同过滤算法:给用户推荐和他兴趣相似的其他用户喜欢的物品(图左)

  • 基于物品的协同过滤算法:给用户推荐和他之前喜欢的物品相似的物品(图右)

因此协同过滤的核心是怎么计算物品之间的相似度以及用户之间的相似度。相似度系数可以衡量用户或物品之间的相似度。

基于物品的协同过滤

基于用户的协同过滤算法的简单定义:在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。

故该算法主要分为两个步骤:

  • 找到和目标用户兴趣相似的用户集合;

  • 找到这个集合中的用户喜欢的,而目标用户没有听说过的物品推荐给目标用户;

用户相似度计算

可以利用「Jaccard公式」「Cosine相似度」来简单的计算用户 之间的相似度,另外相似度系数常用的还有「Pearson相关性系数(Pearson Correlation)」

  • Jaccard系数用于计算两个集合之间的相似度,比较适合隐式反馈类型的用户行为。

  • Cosine相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。

  • Pearson相关性系数是衡量向量相似度的一种方法。输出范围为[-1, +1], 0代表无相关性,负值为负相关,正值为正相关。

以隐式反馈为例, 表示用户 用过正反馈的物品集合, 表示用户 用过正反馈的物品集合,公式如下:

Jaccard:

Cosine相似度:

物品得分计算

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

其中 包含和用户 兴趣最接近的K个用户, 是对物品 有过行为的用户集合, 是用户 和用户 的兴趣相似度, 代表用户 对物品 的兴趣(或评分)。(若为隐式反馈,则

有了用户对每个物品的评分,基于评分降序排列,就可以取top-K推荐给用户了。

基于用户的协同过滤

基于用户的协同过滤算法的缺点是随着网站的用户数目越来越大,计算用户的兴趣相似度矩阵将越来越困难。故由亚马逊提出了另一个算法---基于物品的协同过滤算法。

基于物品的协同过滤算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。

该算法认为:物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。

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

  • 计算物品之间的相似度;

  • 根据物品的相似度和用户的历史行为给用户生成推荐列表;

物品的相似度计算同用户的相似度计算。

用户 对物品 的兴趣:

其中 是用户喜欢物品的集合(有过行为), 是和物品 最相似的K个物品的集合, 是物品 的相似度, 是用户 对物品 的兴趣(评分)。

然后基于评分进行降序排列,实现top-K推荐

用户活跃度对物品相似度的影响

是不是每个用户的贡献度都相同?

假设一个用户,他是开书店的,并且购买了当当网80%的书。虽然用户活跃,但买这些书并非都是出于自身的兴趣,而且这些书覆盖了当当网图书的很多领域,所以这个用户对于他所购书的两两相似度的贡献应该远远小于一个只买了十几本自己喜欢的用户。

故提出IUF(Inverse User Frequence),即用户活跃度对数倒数的参数,活跃用户对物品相似度的贡献应该小于不活跃的用户,应该增加IUF参数来修正物品相似度的计算公式:

物品相似度的归一化

如果将物品的相似度矩阵按最大值归一化,则会提高推荐的准确率,多样性,覆盖率;

  

基于用户与基于物品的比较


             基于用户的协同过滤           基于物品的协同过滤
性能适用于用户较少的场合,如果用户很多,计算用户的相似度矩阵代价很大适用于物品数明显小于用户数的场合,如果物品很多,计算物品相似度矩阵代价很大
领域时效性较强,用户的个性化兴趣不太明显的领域(新闻)长尾物品丰富,用户个性化需求强烈的领域
实时性用户有新行为,不一定造成推荐结果的立即变化用户有新行为,一定会导致推荐结果的实时变化
冷启动在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的;新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品;但没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户
推荐理由很难提供令用户信服的推荐解释利用用户的历史行为给用户做推荐解释,令用户比较信服

协同过滤的优缺点

优点

  1. 「算法原理简单、思想朴素」

协同过滤算法的实现非常简单,只要懂简单的四则混合运算,了解向量和矩阵的基本概念就可以理解算法的原理。

  1. 「算法易于分布式实现、可以处理海量数据集」

协同过滤算法可以非常容易利用Spark分布式平台来实现,因此可以通过增加计算节点很容易处理大规模数据集。

  1. 「算法整体效果很不错」

协同过滤算法是得到工业界验证过的一类重要算法,在Netflix、Google、Amazon及国内大型互联网公司都有很好的落地和应用。

  1. 「能够为用户推荐出多样性、新颖性的物品」

前面讲到协同过滤算法是基于群体智慧的一类算法,它利用群体行为来做决策。在实践使用中已经被证明可以很好的为用户推荐多样性、新颖性的物品。特别是当群体规模越大,用户行为越多,推荐的效果越好。

  1. 「协同过滤算法只需要用户的行为信息,不依赖用户及标的物的其他信息」

从前面的算法及工程实践中大家可以知道,协同过滤算法只依赖用户的操作行为,不依赖具体用户相关和物品相关的信息就可以做推荐,往往用户信息和物品信息都是比较复杂的半结构化或者非结构化的信息,处理起来很不方便。这是一个极大的优势,正因为这个优势让协同过滤算法在工业界大放异彩。

缺点

  1. 「冷启动问题」

协同过滤算法依赖用户的行为来为用户做推荐,如果用户行为少(比如新上线的产品或者用户规模不大的产品),这时就很难发挥协同过滤算法的优势和价值,甚至根本无法为用户做推荐。这时可以采用基于内容的推荐算法作为补充。

另外,对于新入库的标的物,由于只有很少的用户操作行为,这时相当于用户行为矩阵中该标的物对应的列基本都是零,这时无法计算出该物品的相似物品,同时,该物品也不会出现在其他物品的相似列表中,因此无法将该物品推荐出去。这时,可以采用人工的策略将该标的物在一定的位置曝光,或者强行以一定的比例或者概率加入推荐列表中,通过收集该物品的行为解决该物品无法被推荐出去的问题。

  1. 「稀疏性问题」

对于现代的互联网产品,用户基数大,物品数量多(特别是新闻、UGC短视频类产品),一般物品相似度往往不够精准,最终影响推荐结果的精准度。

参考文献

[1] 项亮.推荐系统实战[M].北京:人民邮电出版社,2012.

扫码关注更多精彩