推荐系统Day2笔记

协同过滤(Collaborative Filtering)推荐算法是最经典、最常用的推荐算法。基本思想是:

  • 根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品。

    • 基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐。
    • 一般是仅仅基于用户的行为数据(评价、购买、下载等), 而不依赖于项的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄, 性别等)。
  • 目前应用比较广泛的协同过滤算法是基于邻域的方法,主要有:

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

不管是 UserCF 还是 ItemCF 算法, 重点是计算用户之间(或物品之间)的相似度。

UserCF

杰卡德(Jaccard)相似系数

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

余弦相似度 余弦相似度衡量了两个向量的夹角,夹角越小越相似。余弦相似度的计算如下,其与杰卡德(Jaccard)相似系数只是在分母上存在差异

上述用户-物品交互矩阵在现实中是十分稀疏的,为了节省内存,交互矩阵会采用字典进行存储。在 sklearn 中,余弦相似度的实现:

from sklearn.metrics.pairwise import cosine_similarity

i = [1, 0, 0, 0]
j = [1, 0, 1, 0]
cosine_similarity([i, j])

皮尔逊相关系数

在用户之间的余弦相似度计算时,将用户向量的内积展开为各元素乘积和、皮尔逊相关系数与余弦相似度的计算公式非常的类似。

相较于余弦相似度,皮尔逊相关系数通过使用用户的平均分对各独立评分进行修正,减小了用户评分偏置的影响。在scipy中,皮尔逊相关系数的实现:

from scipy.stats import pearsonr

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

适用场景

  • JaccardJaccard 相似度表示两个集合的交集元素个数在并集中所占的比例 ,所以适用于隐式反馈数据(0-1)。
  • 余弦相似度在度量文本相似度、用户相似度、物品相似度的时候都较为常用。
  • 皮尔逊相关度,实际上也是一种余弦相似度。不过先对向量做了中心化,范围在 −1−1 到 11。
    • 相关度量的是两个变量的变化趋势是否一致,两个随机变量是不是同增同减。
    • 不适合用作计算布尔值向量(0-1)之间相关度。

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

  • 例如,我们要对用户 AA 进行物品推荐,可以先找到和他有相似兴趣的其他用户。
  • 然后,将共同兴趣用户喜欢的,但用户 AA 未交互过的物品推荐给 AA。

过程

计算用户之间的相似度

计算用户对新物品的评分预测

对用户进行物品推荐

User-based算法存在两个重大问题:

1. 数据稀疏性

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

2. 算法扩展性

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

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

判断

召回率:在模型召回预测的物品中,预测准确的物品占用户实际喜欢的物品的比例。

精确率:推荐的物品中,对用户准确推荐的物品占总物品的比例。

如要确保召回率高,一般是推荐更多的物品,期望推荐的物品中会涵盖用户喜爱的物品。而实际中,推荐的物品中用户实际喜爱的物品占少数,推荐的精确率就会很低。故同时要确保高召回率和精确率往往是矛盾的,所以实际中需要在二者之间进行权衡。

覆盖率:推荐系统能够推荐出来的物品占总物品集合的比例。覆盖率表示最终的推荐列表中包含多大比例的物品。如果所有物品都被给推荐给至少一个用户, 那么覆盖率是100%

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

基于物品的协同过滤(ItemCF):

  • 预先根据所有用户的历史行为数据,计算物品之间的相似性。
  • 然后,把与用户喜欢的物品相类似的物品推荐给用户。

协同过滤算法存在的问题之一就是泛化能力弱:

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

权重改进四法

base公式

对热门物品进行惩罚

控制对热门物品的惩罚力度

对活跃用户的惩罚

矩阵分解

协同过滤算法的特点:

  • 协同过滤算法的特点就是完全没有利用到物品本身或者是用户自身的属性, 仅仅利用了用户与物品的交互信息就可以实现推荐,是一个可解释性很强, 非常直观的模型。
  • 但是也存在一些问题,处理稀疏矩阵的能力比较弱。

为了使得协同过滤更好处理稀疏矩阵问题, 增强泛化能力。从协同过滤中衍生出矩阵分解模型(Matrix Factorization, MF)或者叫隐语义模型:

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

算法原理

  • 矩阵分解算法将 m×nm×n 维的共享矩阵 RR ,分解成 m×km×k 维的用户矩阵 UU 和 k×nk×n 维的物品矩阵 VV 相乘的形式。
  • 其中,mm 是用户数量, nn 是物品数量, kk 是隐向量维度, 也就是隐含特征个数。
  • 这里的隐含特征没有太好的可解释性,需要模型自己去学习。
  • 一般而言, kk 越大隐向量能承载的信息内容越多,表达能力也会更强,但相应的学习难度也会增加。所以,我们需要根据训练集样本的数量去选择合适的数值,在保证信息学习相对完整的前提下,降低模型的学习难度。

你可能感兴趣的:(机器学习,人工智能)