Funrec读书笔记2️⃣:基于协同过滤的召回与矩阵分解

89 阅读5分钟

协同过滤(Collaborative Filtering):仅基于用户行为数据,根据用户历史行为数据挖掘用户的喜好偏向

  1. 相似度度量方法

    0.1 Jaccard相似系数:两用户交互物品集合的交并比。 只能反应用户的交互意愿,无法反应用户喜好

    0.2 余弦相似度:两个one-hot的向量进行乘积再除以两个向量模的乘积,得到余弦相似度。

    代码实现:from sklearn.metrics.pairwise import cosine_similarity

    0.3 皮尔逊相关系数:在计算余弦的时候,把向量内积展开为个元素乘积和。

    通过使用用户的平均分对各独立评分进行修正,减小了用户评分偏置的影响

    代码:from scipy.stats import pearsonr

    0.4 适用场景:Jaccard相似度表示两个集合的交并比; 余弦相似度度量文本、用户、物品相似度; 皮尔逊相似度,在余弦上做了中心化,范围在-1到1之间。相关度量是两个变量的变化趋势是否一致。

  2. UserCF:给用户推荐和他兴趣相似的其他用户喜欢的物品

image.png

具体步骤: 1.1 计算用户之间的相似度,找出目标用户最相似的n个用户

1.2 根据这n个用户对目标物品的评分情况来猜测出目标用户对目标物品的评分。如果评分较高,就推荐给目标用户。

方式一:评分等于相似度和评分的加权和除以相似度的和

方式二:只使用针对平均评分的偏置分数进行方式一的计算,再加上用户对物品的平均值

  1. ItemCF:给用户推荐喜欢的物品相似的物品

    计算物品之间的相似度

image.png 具体步骤: 2.1 计算物品之间的相似度 2.2 根据皮尔逊相关系数,可以找到与目标物品最相似的k个物品得到最终得分。

  1. 手写部分:

  2. 协同过滤算法改进:(wij)

4.1 对热门物品进行惩罚 4.2 对活跃用户进行惩罚

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

思考: 1️⃣ UserCF和ItemCF比较: UserCF基于用户相似度进行推荐,适用于用户少,物品多,时效性强的场合。 ItemCF基于物品相似度进行推荐,适用于物品少,用户多,用户兴趣比较固定,物品更新速度不是太快的场合。 2️⃣ 协同过滤的缺陷和解决思路 没有使用更丰富的用户和物品特征信息,导致协同过滤算法的模型表达能力有限; 其实逻辑回归模型(LR)可以更好地在推荐模型中引入更多特征信息。

  1. 矩阵分解

协同过滤算法的特点:完全没有利用到物品本身或者用户自身的属性,仅仅利用了用户与物品的交互信息就可以实现推荐,但是处理稀疏矩阵能力比较弱。

增强泛化能力,从协同过滤衍生出矩阵分解模型(隐语义模型):

  • 使用更加稠密的隐向量表示用户和物品

6.1 隐语义模型

核心思想:通过隐含特征(latent factor)联系用户兴趣和物品(item),基于用户的行为找出潜在的主题和分类,然后对物品进行自动聚类,划分到不同类别/主题。

隐语义模型,会先通过一些角度把用户兴趣和这些书归类,当来了用户之后,首先得到他的兴趣分类,然后从这个分类中挑选他可能喜欢的书籍。比协同过滤多出隐含特征,比如书籍内容,作者,年份等。

6.2 音乐评分实例(手写)【待补充】

给出用户对某分类,某作者,某歌手的喜爱程度向量,然后给出某音乐关于此分类,此作者,此歌手的相关度向量,再进行内积就可得到分数值。

6.3 共现矩阵(用户-物品矩阵) -> 用户和物品的隐向量

image.png

6.4 矩阵分解求解方式

6.4.1 特征值分解(EVD) 使用矩阵的方法求特征值,但是大部分矩阵都不能满足这个约束。

6.4.2 奇异值分解(SVD) 传统SVD分解,要求原始矩阵是稠密的。但是现实中用户的评分矩阵是非常稀疏的。会进行缺失元素填充,并且计算复杂度非常高,而用户-用户评分矩阵很大。

  • FunkSVD

核心思想:把求解上面两个矩阵的参数问题转换成一个最优化问题,可以通过训练集里面的观察值利用最小化来学习用户矩阵和物品矩阵。

步骤: 随机初始化隐向量矩阵,求此时预测评分,再和真实的评分进行平方差累加,再加上系数1/2;依此来优化用户矩阵和物品矩阵,分别求取梯度,计算得到, 再加上正则项防止过拟合得到RSVD。(模型参数过大时,得到参数不稳定)【q表示物品-隐向量矩阵,q表示隐向量-物品矩阵】

image.png

  • BiasSVD

用户的评分有不同基准,所以每个人有自己的bias;物品也有自己的bias,有的平均得分高,有的平均得分低。

所以由此,预测值应该等于(所有样本评分均值)+(该用户评价均值)+(物品收到所有评分均值)+用户矩阵*物品矩阵, 这样更能反映不同用户对不同物品的评分态度,更容易得到有价值的信息。

6.5 编程实现流程

  • 首先初始化用户矩阵[user_num, k], 物品矩阵[item_num, k]
  • F表示隐向量维度,根据经验随机数和1/sqrt(F) 成正比(random生成0-1的值再乘1/sqrt(F))
  • 根据梯度进行训练
  • 得到矩阵并内积进行评分预测