欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Task 2 协同过滤

程序员文章站 2022-07-14 22:09:59
...

Task 2 协同过滤

1. 协同过滤算法介绍

基本思想:根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐),一般是仅仅基于用户的行为数据(评价、购买、下载等), 而不依赖于项的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄, 性别等)

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

不管是UserCF还是ItemCF算法, 非常重要的步骤之一就是计算用户和用户或者物品和物品之间的相似度

2. 相似度度量方法

  1. 杰卡德(Jaccard)相似系数
    s i m u v = ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ ∣ N ( u ) ∣ ∩ ∣ N ( v ) ∣ sim_{uv}=\frac{|N(u)| \cup |N(v)|}{|N(u)| \cap |N(v)|} simuv=N(u)N(v)N(u)N(v)

    其中, N ( u ) N(u) N(u) N ( v ) N(v) N(v)表示用户 u u u和用户 v v v交互商品的集合。

    Jaccard相似系数一般无法反映用户的评分喜好信息,所以常用来评估用户是否会对某商品进行打分,而不是预估用户会对某商品打多少分。

  2. 余弦相似度

    余弦相似度衡量了两个向量的夹角,夹角越小越相似。
    s i m u v = ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ ∣ N ( u ) ⋅ ∣ N ( v ) ∣ sim_{uv}=\frac{|N(u)| \cup |N(v)|}{{|N(u) \cdot |N(v)|}} simuv=N(u)N(v)N(u)N(v)
    从向量的角度进行描述,令矩阵 A A A为用户-商品交互矩阵,即矩阵的每一行表示一个用户对所有商品的交互情况。

    若用户和商品数量分别为 m , n m,n m,n的话,交互矩阵 A A A就是一个 m m m n n n列的矩阵。此时用户的相似度可以表示为:
    s i m u v = c o s ( u , v ) = u ⋅ v ∣ u ∣ ⋅ ∣ v ∣ sim_{uv}=cos(u,v)=\frac{u \cdot v}{|u| \cdot |v|} simuv=cos(u,v)=uvuv
    交互矩阵在现实情况下非常稀疏,为了避免存储这么大的稀疏矩阵,在计算用户相似度的时候一般会采用集合的方式进行计算。

    可以用sklearn中的consine_similarity实现:

    from sklearn.metrics.pairwise import cosine_similarity
    i = [1, 0, 0, 0]
    j = [1, 0.5, 0.5, 0]
    consine_similarity([a, b])
    
  3. 皮尔逊相关系数

    皮尔逊相关系数的公式与余弦相似度的计算公式非常的类似,首先对于上述的余弦相似度的计算公式写成求和的形式,其中 r u i , r v i r_{ui},r_{vi} rui,rvi分别表示用户 u u u和用户 v v v对商品 i i i是否有交互(或者具体的评分值):
    s i m u v = ∑ i r u i ∗ r v i ∑ i r u i 2 ∑ i r v i 2 sim_{uv} = \frac{\sum_i r_{ui}*r_{vi}}{\sqrt{\sum_i r_{ui}^2}\sqrt{\sum_i r_{vi}^2}} simuv=irui2 irvi2 iruirvi
    如下是皮尔逊相关系数计算公式,其中 r u i , r v i r_{ui},r_{vi} rui,rvi分别表示用户 u u u和用户 v v v对商品 i i i是否有交互(或者具体的评分值), r ˉ u , r ˉ v \bar r_u, \bar r_v rˉu,rˉv分别表示用户 u u u和用户 v v v交互的所有商品交互数量或者具体评分的平均值。
    s i m ( u , v ) = ∑ i ∈ I ( r u i − r ˉ u ) ( r v i − r ˉ v ) ∑ i ∈ I ( r u i − r ˉ u ) 2 ∑ i ∈ I ( r v i − r ˉ v ) 2 sim(u,v)=\frac{\sum_{i\in I}(r_{ui}-\bar r_u)(r_{vi}-\bar r_v)}{\sqrt{\sum_{i\in I }(r_{ui}-\bar r_u)^2}\sqrt{\sum_{i\in I }(r_{vi}-\bar r_v)^2}} sim(u,v)=iI(ruirˉu)2 iI(rvirˉv)2 iI(ruirˉu)(rvirˉv)
    所以相比余弦相似度,皮尔逊相关系数通过使用用户的平均分对各独立评分进行修正,减小了用户评分偏置的影响

from scipy.stats import pearsonr

i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
pearsonr(i, j)

3. 基于用户的协同过滤(UserCF)

当一个用户A需要个性化推荐的时候, 可以先找到和他有相似兴趣的其他用户, 然后把那些用户喜欢的, 而用户A没有听说过的物品推荐给A

Task 2 协同过滤

UserCF算法主要包括两个步骤:

  1. 找到和目标用户兴趣相似的集合

    • 基于相似性度量方法找出与目标用户兴趣相似的用户(TopN)
  2. 找到这个集合中的用户喜欢的, 且目标用户没有听说过的物品推荐给目标用户。

    • 基于相似用户喜欢的物品来对目标用户进行推荐,依赖于目标用户对相似用户喜欢的物品的一个喜好程度

    • 利用用户相似度和相似用户的评价加权平均获得用户的评价预测(常用)
      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} \in S}\left(w_{\mathrm{u}, \mathrm{s}} \cdot R_{\mathrm{s}, \mathrm{p}}\right)}{\sum_{\mathrm{s} \in S} w_{\mathrm{u}, \mathrm{s}}} Ru,p=sSwu,ssS(wu,sRs,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的评分。

    • 考虑到有的用户的评分标准不一的情况,该物品的评分与此用户的所有评分的差值进行加权平均(更为推荐)
      P i , j = R ˉ i + ∑ k = 1 n ( S i , k ( R k , j − R ˉ k ) ) ∑ k = 1 n S j , k P_{i, j}=\bar{R}_{i}+\frac{\sum_{k=1}^{n}\left(S_{i, k}\left(R_{k, j}-\bar{R}_{k}\right)\right)}{\sum_{k=1}^{n} S_{j, k}} Pi,j=Rˉi+k=1nSj,kk=1n(Si,k(Rk,jRˉk))

UserCF的缺点

  • 存储开销大

    用户相似度矩阵的存储开销非常大。

  • 数据稀疏性

    一个大型的电子商务推荐系统一般有非常多的物品,用户可能买的其中不到1%的物品,不同用户之间买的物品重叠性较低,导致算法无法找到一个用户的邻居,即偏好相似的用户。这导致UserCF不适用于那些正反馈获取较困难的应用场景(如酒店预订, 大件商品购买等低频应用)。

  • 算法拓展性

    基于用户的协同过滤需要维护用户相似度矩阵以便快速的找出Topn相似用户, 该矩阵的存储开销非常大,存储空间随着用户数量的增加而增加,不适合用户数据量大的情况使用

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

4. 基于物品的协同过滤

基本思想:预先根据所有用户的历史偏好数据计算物品之间的相似性,然后把与用户喜欢的物品相类似的物品推荐给用户。比如物品a和c非常相似,因为喜欢a的用户同时也喜欢c,而用户A喜欢a,所以把c推荐给用户A。ItemCF算法并不利用物品的内容属性计算物品之间的相似度, 主要通过分析用户的行为记录计算物品之间的相似度, 该算法认为, 物品a和物品c具有很大的相似度是因为喜欢物品a的用户大都喜欢物品c

Task 2 协同过滤

ItemCF算法主要包括两个步骤:

  1. 计算物品之间的相似度
  2. 根据物品的相似度和用户的历史行为给用户生成推荐列表(购买了该商品的用户也经常购买的其他商品)

5. 算法评估

  1. 召回率
    Recall ⁡ = ∑ u ∣ R ( u ) ∩ T ( u ) ∣ ∑ u ∣ T ( u ) ∣ \operatorname{Recall}=\frac{\sum_{u}|R(u) \cap T(u)|}{\sum_{u}|T(u)|} Recall=uT(u)uR(u)T(u)
    其中, R ( u ) R(u) R(u)为对用户u推荐的N个物品, T ( u ) T(u) T(u)为用户u在测试集上喜欢的物品集合。

  2. 准确率
    Precision ⁡ = ∑ u ∣ R ( u ) ∩ T ( u ) ∣ ∑ u ∣ R ( u ) ∣ \operatorname{Precision}=\frac{\sum_{u} \mid R(u) \cap T(u)|}{\sum_{u}|R(u)|} Precision=uR(u)uR(u)T(u)
    即:推荐的物品中,用户真正看的有多少。

  3. 覆盖率

    反应推荐算法挖掘长尾的能力,覆盖率越高,说明推荐算法越能将长尾中的物品推荐给用户。

 Coverage  = ∣ ⋃ u ∈ U R ( u ) ∣ ∣ I ∣ \text { Coverage }=\frac{\left|\bigcup_{u \in U} R(u)\right|}{|I|}  Coverage =IuUR(u)

​ 覆盖率表示最终的推荐列表中包含多大比例的物品,如果所有物品都被给推荐给至少一个用户, 那么覆盖率是100%。

  1. 新颖度

    如果推荐出的物品都很热门, 说明推荐的新颖度较低。 由于物品的流行度分布呈长尾分布, 所以为了流行度的平均值更加稳定, 在计算平均流行度时对每个物品的流行度取对数。

6. 协同过滤算法的权重改进

  1. 基础算法
    w i j = ∣ N ( i ) ∩ ∣ N ( j ) ∣ N ( i ) w_{ij}=\frac{|N(i) \cap |N(j)|}{N(i)} wij=N(i)N(i)N(j)

  2. 对热门物品的惩罚
    w i j = ∣ N ( i ) ∩ ∣ N ( j ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{ij}=\frac{|N(i) \cap |N(j)|}{\sqrt{|N(i)| |N(j)|}} wij=N(i)N(j) N(i)N(j)
    如果 item-j 是很热门的商品,导致很多喜欢 item-i 的用户都喜欢 item-j,这时 w i j w_{ij} wij 就会非常大。

    分母通过引入 N ( j ) N(j) N(j) 来对 item-j 的热度进行惩罚。如果物品很热门, 那么 N ( j ) N(j) N(j)就会越大, 对应的权重就会变小。

  3. 对热门物品的进一步惩罚
    w i j = ∣ N ( i ) ∩ ∣ N ( j ) ∣ ∣ N ( i ) ∣ 1 − α ∣ N ( j ) ∣ α w_{ij}=\frac{|N(i) \cap |N(j)|}{|N(i)|^{1-\alpha}|N(j)|^\alpha} wij=N(i)1αN(j)αN(i)N(j)
    通过调节参数 α \alpha α α \alpha α越大,惩罚力度越大,热门物品的相似度越低,整体结果的平均热门程度越低。

  4. 对活跃用户的惩罚
    w i j = ∑ ω ∈ N ( i ) ∩ N ( j ) 1 l o g ( 1 + ∣ N ( u ) ∣ ) ∣ N ( i ) ∣ 1 − α ∣ N ( j ) ∣ α w_{ij}=\frac{\sum_{\omega \in N(i) \cap N(j)}{\frac{1}{log(1+|N(u)|)}}}{|N(i)|^{1-\alpha}|N(j)|^\alpha} wij=N(i)1αN(j)αωN(i)N(j)log(1+N(u))1
    活跃用户对物品相似度的贡献小于不活跃用户.

7. 协同过滤算法的问题分析

  1. 泛化能力弱

    无法将两个物品相似的信息推广到其他物品的相似性上。 导致的问题是热门物品具有很强的头部效应, 容易跟大量物品产生相似, 而尾部物品由于特征向量稀疏, 导致很少被推荐

  2. 矩阵分解技术MF在协同过滤共现矩阵的基础上,使用更稠密的隐向量表示用户和物品, 挖掘用户和物品的隐含兴趣和隐含特征, 在一定程度上弥补协同过滤模型处理稀疏矩阵能力不足的问题。