协同过滤算法族
Collaborative Filtering, CF
-
协同过滤算法流程
-
前置数据:用户、商品、用户对商品的评价信息(假设“好(+1)”、“无(0)”、“坏(-1)”三种)
-
以用户为行、商品为列、元素为评价信息,构建共现矩阵
-
问题转化为预测共现矩阵中的某个空缺位置的元素(某用户对某商品的感兴趣程度)。因为是“协同过滤”,用户需要考虑与自己兴趣相似的n个用户的评价意见(Top n 用户,n为超参数),然后综合相似用户对待推荐商品的评价,给出用户对商品的评价预测
-
-
用户相似度计算
由于共现矩阵中,每个用户对商品的评价信息可以由一个行向量表示,故用户相似度计算的问题就转化为计算两个向量间相似度的问题
-
余弦相似度
-
皮尔逊相关系数
- 皮尔逊相关系数通过使用用户平均分对各独立评分进行修正,减小了用户评分偏置的影响
s i m ( i , j ) = ∑ p ∈ P ( R i , p − R ‾ i ) ( R j , p − R ‾ j ) ∑ p ∈ P ( R i , p − R ‾ i ) 2 ∑ p ∈ P ( R j , p − R ‾ j ) 2 sim(i,j) = \frac{\sum_{p \in P}(R_{i,p}-\overline{R}_i)(R_{j,p}-\overline{R}_j)}{\sqrt{\sum_{p \in P}(R_{i,p}-\overline{R}_i)^2}\sqrt{\sum_{p \in P}(R_{j,p}-\overline{R}_j)^2}} sim(i,j)=∑p∈P(Ri,p−Ri)2∑p∈P(Rj,p−Rj)2∑p∈P(Ri,p−Ri)(Rj,p−Rj)
其中, R i , p R_{i,p} Ri,p代表用户 i i i对物品 p p p的评分。 R ‾ i \overline{R}_i Ri代表用户 i i i对所有物品的平均评分, P P P代表所有物品集合 -
基于皮尔逊通过引入用户平均分减小用户评分偏置的影响,引入物品平均分减少物品评分偏置对结果的影响
s i m ( i , j ) = ∑ p ∈ P ( R i , p − R ‾ p ) ( R j , p − R ‾ p ) ∑ p ∈ P ( R i , p − R ‾ p ) 2 ∑ p ∈ P ( R j , p − R ‾ p ) 2 sim(i,j) = \frac{\sum_{p \in P}(R_{i,p}-\overline{R}_p)(R_{j,p}-\overline{R}_p)}{\sqrt{\sum_{p \in P}(R_{i,p}-\overline{R}_p)^2}\sqrt{\sum_{p \in P}(R_{j,p}-\overline{R}_p)^2}} sim(i,j)=∑p∈P(Ri,p−Rp)2∑p∈P(Rj,p−Rp)2∑p∈P(Ri,p−Rp)(Rj,p−Rp)
其中 R ‾ p \overline{R}_p Rp代表物品 p p p得到所有评分的平均分
-
-
最终结果排序
-
常用方式是利用用户相似度和相似用户的评价的加权平均获得目标用户的评价预测
R u , p = ∑ s ϵ S ( w u , s ⋅ R s , p ) ∑ s ϵ S w u , s R_{\mathrm{u}, \mathrm{p}}=\frac{\sum_{\mathrm{s} \epsilon S}\left(w_{\mathrm{u}, \mathrm{s}} \cdot R_{\mathrm{s}, \mathrm{p}}\right)}{\sum_{\mathrm{s} \epsilon S} w_{\mathrm{u}, \mathrm{s}}} Ru,p=∑sϵSwu,s∑sϵS(wu,s⋅Rs,p)
其中,权重 w u , s w_{u,s} wu,s是用户 u u u和用户 s s s的相似度, R s , p R_{s,p} Rs,p是用户 s s s对物品 p p p的评分
-
用户协同过滤
UserCF
-
上述介绍的协同过滤算法基于用户相似度进行推荐,因此也被称为基于用户的协同过滤(UserCF)
-
缺点
-
用户数往往远大于物品数,UserCF需要维护用户相似度矩阵以便快速找出Top n相似用户,存储开销非常大
-
用户历史数据向量往往非常稀疏,对于只有几次购买或点击行为的用户来说,找到相似用户的准确度是非常低的,这导致UserCF不适用于那些正反馈获取较困难的应用场景(如酒店预订、大件商品购买等低频应用)
-
物品协同过滤
ItemCF
-
流程
-
基于历史数据构建共现矩阵
-
计算共现矩阵两两列向量之间的相似性,构建n×n维的物品相似度矩阵
-
获取用户历史行为数据中的正反馈物品列表
-
利用物品相似度矩阵,针对目标用户历史行为中的正反馈物品,找出相似的Top k个物品,组成相似物品集合
-
对相似物品集合中的物品,利用相似度分值进行排序,生成最终的推荐列表
-
若一个物品与多个用户行为历史中的正反馈物品相似,那么该物品最终的相似度应该是多个相似度的累加:
R u , p = ∑ h ∈ H ( w p , h ⋅ R u , h ) R_{\mathrm{u}, \mathrm{p}}=\sum_{\mathrm{h} \in H}\left(w_{\mathrm{p}, \mathrm{h}} \cdot R_{\mathrm{u}, \mathrm{h}}\right) Ru,p=h∈H∑(wp,h⋅Ru,h)
其中, H H H是目标用户的正反馈物品集合, w p , h w_{p,h} wp,h是物品 p p p与物品 h h h的物品相似度, R u , h R_{u,h} Ru,h是用户 u u u对物品 h h h的已有评分
-
-
协同过滤缺陷
-
推荐结果的头部效应较明显,处理稀疏向量的能力弱
-
仅利用用户和物品的交互信息,无法有效引入用户年龄、性别、商品描述、分类、当前时间等一系列用户特征、物品特征以及上下文特征,造成有效信息泄露
-
矩阵分解模型
Matrix Factorization, MF
-
动机:为了解决协同过滤对于稀疏矩阵存在严重头部效应的问题。
-
思路:矩阵分解为用户与物品引入了一个隐向量,将用户和物品同时表示到隐向量的表示空间上。距离越近的用户/物品越相似,距离用户越近的物品自然更可能是用户感兴趣的
-
用户和物品的隐向量是通过分解协同过滤生成的共现矩阵得到的
M m × n = U m × k × V k × n M^{m × n} = U^{m × k} × V^{k × n} Mm×n=Um×k×Vk×n
其中, M M M为共现矩阵, U U U为用户矩阵, V V V为物品矩阵, k k k为隐向量的维度( k k k越大,则隐向量表达能力越强,但模型泛化能力越弱; k k k越小,则隐向量表达能力越弱,但模型泛化能力越强) -
用户 u u u对物品 i i i的预估评分:
r ^ u i = q i T p u \hat{r}_{ui} = q_i^Tp_u r^ui=qiTpu
其中 p u p_u pu为用户 u u u在用户矩阵 U U U中的对应行向量, q i q_i qi是物品 i i i在物品矩阵 V V V中的对应列向量 -
矩阵分解求解过程
-
特征值分解(Eigen Decomposition):只能作用于方阵
-
奇异值分解(Singular Value Decomposition, SVD):要求矩阵是稠密的,共现矩阵显然是一个非常稀疏的矩阵;计算复杂度达到 O ( m n 2 ) O(mn^2) O(mn2)。不适用于解决大规模稀疏矩阵的矩阵分解问题。
-
梯度下降(Gradient Descent):目标是让原始评分 r u i r_{ui} rui与用户向量和物品向量之积 q i T p u q_i^Tp_u qiTpu的差尽量小
min q ∗ , p ∗ ∑ ( u , i ) ∈ K ( r u i − q i T p u ) 2 + λ ( ∥ q i ∥ 2 + ∥ p u ∥ 2 ) \min _{\boldsymbol{q}^{*}, \boldsymbol{p}^{*}} \sum_{(\mathrm{u}, \mathrm{i}) \in \mathrm{K}}\left(\boldsymbol{r}_{\mathrm{ui}}-\boldsymbol{q}_{\mathrm{i}}^{\mathrm{T}} \boldsymbol{p}_{\mathrm{u}}\right)^{2}+\lambda\left(\left\|\boldsymbol{q}_{\mathrm{i}}\right\|^{2}+\left\|\boldsymbol{p}_{\mathrm{u}}\right\|^{2}\right) q∗,p∗min(u,i)∈K∑(rui−qiTpu)2+λ(∥qi∥2+∥pu∥2)
其中, K K K为所有用户评分样本的集合。- 对 q i q_i qi与 p u p_u pu求偏导,沿梯度反向更新参数即可
2 ( r u i − q i T p u ) p u − 2 λ q i 2\left(\boldsymbol{r}_{\mathrm{ui}}-\boldsymbol{q}_{\mathrm{i}}^{\mathrm{T}} \boldsymbol{p}_{\mathrm{u}}\right) \boldsymbol{p}_{\mathrm{u}}-2 \lambda \boldsymbol{q}_{\mathrm{i}} 2(rui−qiTpu)pu−2λqi
2 ( r u i − q i T p u ) q i − 2 λ p u 2\left(\boldsymbol{r}_{\mathrm{ui}}-\boldsymbol{q}_{\mathrm{i}}^{\mathrm{T}} \boldsymbol{p}_{\mathrm{u}}\right) \boldsymbol{q}_{\mathrm{i}}-2 \lambda \boldsymbol{p}_{\mathrm{u}} 2(rui−qiTpu)qi−2λpu
q i ← q i − γ ( ( r u i − q i T p u ) p u − λ q i ) \boldsymbol{q}_{\mathrm{i}} \leftarrow \boldsymbol{q}_{\mathrm{i}}-\gamma\left(\left(\boldsymbol{r}_{\mathrm{ui}}-\boldsymbol{q}_{\mathrm{i}}^{\mathrm{T}} \boldsymbol{p}_{\mathrm{u}}\right) \boldsymbol{p}_{\mathrm{u}}-\lambda \boldsymbol{q}_{\mathrm{i}}\right) qi←qi−γ((rui−qiTpu)pu−λqi)
p u ← p u − γ ( ( r u i − q i T p u ) q i − λ p u ) \boldsymbol{p}_{\mathrm{u}} \leftarrow \boldsymbol{p}_{\mathrm{u}}-\gamma\left(\left(\boldsymbol{r}_{\mathrm{ui}}-\boldsymbol{q}_{\mathrm{i}}^{\mathrm{T}} \boldsymbol{p}_{\mathrm{u}}\right) \boldsymbol{q}_{\mathrm{i}}-\lambda \boldsymbol{p}_{\mathrm{u}}\right) pu←pu−γ((rui−qiTpu)qi−λpu)
-
-
矩阵分解完得到用户和物品的隐向量后,即可根据用户与物品隐向量的内积计算出用户对物品的评分预测,排序后得到最终的推荐列表
-
为什么矩阵分解比协同过滤具有更强的泛化能力?
-
在矩阵分解的算法过程中,用户矩阵 U U U与物品矩阵 V V V的生成过程实际上是对共现矩阵的全局拟合过程,因此隐向量其实是利用全局信息生成的,每个隐向量或多或少都受到了全局共现矩阵的影响,因此包含的信息更全面,泛化能力更强
-
在协同过滤中,若两个用户没有相同的历史行为,两个物品没有相同的人购买,那么这两个用户和物品的相似度都将为0,因为协同过滤只利用了特定用户或物品自身的信息进行相似度计算,所以在这一过程中协同过滤并未使用到全局信息,泛化能力较差
-
-
消除用户和物品打分的偏差
-
由于不同用户的评价标准不同(用户A认为3分已经很低了,而用户B认为1分才算低),而且不同物品的衡量标准也不尽相同(电子产品和日用品的平均分差异有可能较大)。为了消除这种偏差,在评分预测中加入偏差向量:
r u i = μ + b i + b u + q i T p u \boldsymbol{r}_{\mathrm{ui}}=\mu+b_{\mathrm{i}}+b_{\mathrm{u}}+\boldsymbol{q}_{\mathrm{i}}^{\mathrm{T}} \boldsymbol{p}_{\mathrm{u}} rui=μ+bi+bu+qiTpu
同时,目标函数也需要改进:min q ∗ , p ∗ , b ∗ ∑ ( u , i ) ∈ K ( r u i − μ − b u − b i − p u T q i ) 2 + λ ( ∥ p u ∥ 2 + ∥ q i ∥ 2 + b u 2 + b i 2 ) \min _{\boldsymbol{q}^{*}, \boldsymbol{p}^{*}, \boldsymbol{b}^{*}} \sum_{(\mathrm{u}, \mathrm{i}) \in K}\left(\boldsymbol{r}_{\mathrm{ui}}-\mu-b_{\mathrm{u}}-b_{\mathrm{i}}-\boldsymbol{p}_{\mathrm{u}}^{\mathrm{T}} \boldsymbol{q}_{\mathrm{i}}\right)^{2}+\lambda\left(\left\|\boldsymbol{p}_{\mathrm{u}}\right\|^{2}+\left\|\boldsymbol{q}_{\mathrm{i}}\right\|^{2}+b_{\mathrm{u}}^{2}+b_{\mathrm{i}}^{2}\right) q∗,p∗,b∗min(u,i)∈K∑(rui−μ−bu−bi−puTqi)2+λ(∥pu∥2+∥qi∥2+bu2+bi2)
-
-
矩阵分解的优点和局限性
-
优点
-
泛化能力强。在一定程度上解决了数据稀疏的问题
-
空间复杂度低。以存储用户和物品的隐向量代替用户和物品的相似度矩阵,使存储空间复杂度由 n 2 n^2 n2降至 ( n + m ) ∗ k (n+m)*k (n+m)∗k
-
更好的扩展性和灵活性。隐向量的概念和Embedding类似,易于与其他特征融合
-
-
局限性
-
仍然无法利用用户、物品、上下文相关的特征
-
缺乏用户历史行为时,无法进行有效的推荐
-
-