协同过滤(Collaborative Filtering, CF)——经典的推荐算法

“协同过滤” 就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程。

1. User CF 概述

user CF:基于用户的相似度进行推荐

应用场景:

  • 预测用户X是否购买某个 item
  • 给用户X推荐候选商品

具体步骤如下:

  1. 基于历史行为(例如打分)生成共现矩阵
  2. 找到与用户X最相似的Top K个用户
  3. 综合相似用户对某个 item的评价,得出用户X对 item 评价的预测。或找到相似用户喜欢,且目标用户没有听说过的item推荐给目标用户

下面将对“用户相似度计算”及“最终结果的排序”做详细说明。

1.1 用户相似度

计算用户相似度,就是计算用户向量 i 和用户向量 j 之间的相似度,两个向量之间常用的相似度计算方法有如下几种:

1.1.1 余弦相似度( Cosine Similarity )

衡量了用户向量i和用户向量J之间的向量夹角大小。显然,夹角越小,证明余弦相似度越大,两个用户越相似。
协同过滤(Collaborative Filtering, CF)——经典的推荐算法_第1张图片

1.1.2 皮尔逊相关系数

通过使用用户平均分对各独立评分进行修正,减小了用户评分偏置的影响
其中, R i , p R_{i,p} Ri,p代表用户i对物品p的评分。 R i ‾ \overline{R_i} Ri代表用户i对所有物品的平均评分,P代表所有物品的集合。
协同过滤(Collaborative Filtering, CF)——经典的推荐算法_第2张图片

1.1.3 计算用户两两之间的相似度矩阵

对两两用户都利用余弦相似度计算相似度。这种方法的时间复杂度是O(N^2)。耗时很大。

因此我们需要建立一张物品到用户之间的 倒排表(补充实现) ,这样就能排除对根本没有任何联系的用户之间的相似度计算。

再根据倒排表计算共同评分过的物品的矩阵。

如下图所示
协同过滤(Collaborative Filtering, CF)——经典的推荐算法_第3张图片
矩阵中的每一个数值都是余弦相似度中的分子部分,然后将分子除以分母可以得到最终的用户兴趣相似度。即可以将上图中的共同评分过的物品的矩阵转换为用户之间的相似度矩阵,且只用计算非0的部分。

1.2 最终结果的排序

在获得Top k相似用户之后,利用Top k用户生成最终推荐结果的过程如下。

假设“目标用户与其相似用户的喜好是相似的”,可根据相似用户的已有评价对目标用户的偏好进行预测。这里最常用的方式是利用用户相似度和相似用户的评价的加权平均获得目标用户的评价预测。

协同过滤(Collaborative Filtering, CF)——经典的推荐算法_第4张图片
其中,权重 w u , s w_{u,s} wu,s是用户u和用户s的相似度, R S , P R_{S,P} RS,P是用户s对物品p的评分。

1.3 User CF的缺点

  • 存储开销大:在互联网应用的场景下,用户数往往远大于物品数,而 UserCF 需要维护用户相似度矩阵以便快速找出 Top 相似用户。该用户相似度矩阵的存储开销非常大,而且随着业务的发展,用户数的增长会导致用户相似度矩阵的空间复杂度以的速度快速增长,这是在线存储系统难以承受的扩展速度。
  • 数据稀疏:用户的历史数据向量往往非常稀疏,对于只有几次购买或者点击行为的用户来说,找到相似用户的准确度是非常低的,这导致 UserCF 不适用于那些正反馈获取较困难的应用场景( 如酒店预定、大件商品购买等低频应用)。

实际在线系统使用UserCF的例子

2. Item CF 概述

由于UserCF技术上的两点缺陷,导致很多电商平台并没有采用这种算法,而是采用了ItemCF算法实现最初的推荐系统。

Item CF是基于物品相似度的协同过滤算法给用户推荐那些和他们之前喜欢的物品相似的物品。Item CF并不利用物品的内容属性计算物品之间的相似度,主要通过分析用户的行为记录计算物品之间的相似度。

具体步骤如下:

  1. 基于历史数据,构建以用户(假设用户总数为m)为行坐标,物品(物品总数为n)为列坐标的mxn维的共现矩阵。
  2. 计算共现矩阵两两列间的相似性。
  3. 获得用户历史行为数据中的正反馈物品列表,针对正反馈物品, 找出相似的Top k个物品, 组成相似物品集合。
  4. 对相似物品集合中的物品, 利用相似度分值进行排序,生成最终的推荐列表。

如果一个物品与多个用户行为历史中的正反馈物品相似,那么该物品最终的相似度应该是多个相似度的累加:
协同过滤(Collaborative Filtering, CF)——经典的推荐算法_第5张图片
其中,H 是目标用户的正反馈物品集合, w p , h w_{p,h} wp,h是物品 p 与物品 h 的物品相似度, R u , h R_{u,h} Ru,h 是用户 u 对物品 h 的已有评分。

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

假设有这么一个用户,他是开书店的,并且买了当当网上80%的书准备用来自己卖。那么, 他的购物车里包含当当网80%的书。假设当当网有100万本书,也就是说他买了80万本。从前面 对ItemCF的讨论可以看到,这意味着因为存在这么一个用户,有80万本书两两之间就产生了相似度,也就是说,内存里即将诞生一个80万乘80万的稠密矩阵。

因此应对对活跃用户做一种软性的惩罚、

3. UserCF 与 ItemCF 的应用场景

  • UserCF 与 ItemCF 在具体应用场景上有所不同。一方面,由于 UserCF 基于用户相似度进行推荐,使其具备更强的社交特性, 用户能够快速得知与自己兴趣相似的人最近喜欢的是什么,即使某个兴趣点以前不在自己的兴趣范围内,也有可能通过 “朋友” 的动态快速更新自己的推荐列表。这样的特点使其非常适用于新闻推荐场景。 因为新闻本身的兴趣点往往是分散的,相比用户对不同新闻的兴趣偏好,新闻的及时性、热点性往往是其更重要的属性, 而 UserCF 正适用于发现热点,以及跟踪热点的趋势
  • 另一方面,ltemCF 更适用于兴趣变化较为稳定的应用, 比如在 Amazon 的电商场景中,用户在一个时间段内更倾向于寻找一类商品,这时利用物品相似度为其推荐相关物品是契合用户动机的。 在 Netflix 的视频推荐场景中 , 用户观看电影、 电视剧的兴趣点往往比较稳定, 因此利用 ltemCF 推荐风格、 类型相似的视频是更合理的选择

4. 协同过滤的下一步发展

协同过滤是一个非常直观、可解释性很强的模型,但它并不具备较强的泛化能力,换句话说,协同过滤无法将两个物品相似这一信息推广到其他物品的相似性计算上。这就导致了一个比较严重的问题:推荐结果的头部效应较明显, 处理稀疏向量的能力弱,也就是说,热门的物品具有很强的头部效应,容易跟大批物品产生相似性;而尾部的物品由于特征向量稀疏, 很少与其他物品产生相似性,导致很少被推荐。

为解决上述问题,同时增加模型的泛化能力,矩阵分解技术被提出。该方法在协同过滤共现矩阵的基础上,使用更稠密的隐向量表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征,在一定程度上弥补了协同过滤模型处理稀疏矩阵能力不足的问题。

另外, 协同过滤(user cf、item cf、矩阵分解)仅利用用户和物品的交互信息, 无法有效地引人用户年龄、性别、商品描述、商品分类、当前时间等一系列用户特征、物品特征和上下文特征, 这无疑造成了有效信息的遗漏。为了在推荐模型中引入这些特征, 推荐系统逐渐发展到以逻辑回归模型为核心的、能够综合不同类型特征的机器学习模型的道路上。

5. 矩阵分解算法——协同过滤的进化

5.1 矩阵分解算法的原理

协同过滤算法泛化能力较弱,因此提出了矩阵分解的算法。

下面以 Netflix 推荐场景的例子说明矩阵分解算法的原理:

矩阵分解算法为每一个用户和视频都生成相应的隐向量,用户和物品的隐向量是通过分解协同过滤生成的共现矩阵得到的。

协同过滤(Collaborative Filtering, CF)——经典的推荐算法_第6张图片
矩阵分解算法将 m × n 维的共现矩阵 R 分解为 m × k 维的用户矩阵 U 和 k × n 维的物品矩阵 V 相乘的形式。其中 m 是用户数量,n 物品数量, k 是隐向量的维度。k 的大小决定了隐向量表达能力以及模型泛化能力的强弱。

在完成矩阵分解过程后,即可得到所有用户和物品的隐向量,并由此计算出用户 u 对物品 i 的预估评分 :
r ^ u i = q i T p u \hat r_{u i }=q_i^Tp_u r^ui=qiTpu

5.2 矩阵分解的求解过程

奇异值分解没有很多了解

在矩阵分解算法中,由于隐向量的存在,使任意的用户和物品之间都可以得到预测分值。而隐向量的生成过程其实是对共现矩阵进行全局拟合的过程,因此隐向量其实是利用全局信息生成的,有更强的泛化能力;而对协同过滤来说,如果两个用户没有相同的历史行为,两个物品没有相同的人购买,那么这两个用户和两个物品的相似度都将为 0 (因为协同过滤只能利用用户和物品自己的信息进行相似度计算,这就使协同过滤不具备泛化利用全局信息的能力)

5.3 矩阵分解的有点和局限性

优点

  1. 泛化能力强。矩阵分解相较协同过滤有更强的泛化能力:在矩阵分解算法中,由于隐向量的存在,使任意的用户和物品之间都可以得到预测分值。而隐向量的生成过程其实是对共现矩阵进行全局拟合的过程,因此隐向量其实是利用全局信息生成的,有更强的泛化能力;而对协同过滤来说,如果两个用户没有相同的历史行为,两个物品没有相同的人购买,那么这两个用户和两个物品的相似度都将为 0 (因为协同过滤只能利用用户和物品自己的信息进行相似度计算,这就使协同过滤不具备泛化利用全局信息的能力)
  2. 空间复杂度低。不需再存储协同过滤模型服务阶段所需的 “庞大” 的用户相似性或物品相似性矩阵,只需存储用户和物品隐向量。空间复杂度由 n 2 n^2 n2级别降低到 ( n + m ) ⋅ k (n+m)\cdot k (n+m)k 级别
  3. 更好的扩展性和灵活性。矩阵分解的最终产岀是用户和物品隐向量,这其实与深度学习中的 Embedding 思想不谋而合,因此矩阵分解的结果也非常便于与其他特征进行组合和拼接,并便于与深度学习网络进行无缝结合

局限性
与协同过滤一样,矩阵分解同样不方便加入用户、物品和上下文相关的特征,这使得矩阵分解丧失了利用很多有效信息的机会,同时在缺乏用户历史行为时,无法进行有效的推荐

#参考链接

  1. 基于用户的协同过滤算法的理解与简单实现

你可能感兴趣的:(深度学习推荐系统,推荐算法,算法,机器学习)