推荐系统通常分析过去的事务以建立用户和产品之间的联系,这种方法叫做协同过滤

协同过滤有两种形式:隐语义模型(LFM),基于邻域的模型(Neighborhood models)。

本篇文章大部分内容为大神Koren的Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model ,这篇文章发表时我还在上初中。文章内容并未过时,主要介绍SVD,SVD++,以及SVD与基于邻域模型的融合。


一、Basic

基于邻域的模型:计算item与item(或者user与user)之间的联系。用户对于一个物品的评分预测主要基于该用户对其他相似物品的评价。这个方法只用到了一个维度,要么item to item,要么user to user。

隐语义模型,例如SVD,用到了item和user两个维度,使他们直接进行比较。隐语义模型尝试解释一些物品的特征,具体可见从SVD到推荐系统

基于邻域的模型对于检测局部化关系的数据很有效,因为它只依赖于小部分很重要的关系数据,且通常将大部分的用户数据丢掉。相反的是,隐语义模型对于评估整体更有效,它会用到全部的数据,但是这个模型对于预测有强烈联系的小集合数据很不好。

1.1 Baseline

我们把用户符号记为u、v,物品符号为i、j,则\(r_{ui}\)表示用户u对物品i的真实评分。 \(\hat r_{ui}\) 表示用户u对物品i评分的预测值。

很多因素影响着用户的评分,以下三点需要考虑:

  • 对于不同平台来说,有的平台评分高,有的平台评分低(如猫眼和豆瓣)
  • 在同一个平台上,不同人的评分标准不一样,有的人很严格,有的人很宽容
  • 在同一个平台上,不同item的评分平均也不一样,有大众一致认为的好片,也有大众一致认为的渣片(如《肖申克的救赎》和《小时代》)

根据以上三点,一个对用户评分的预测的baseline可以用下式表示:

\(b_{ui}=\mu+b_{u}+b_{i}\)

参数\(\mu\)表示平台的分数平均,参数\(b_{u}\)\(b_{i}\)分别表示用户与物品的平均程度。举个例子,在某个电影评分平台上,所有电影的评分为3.7,则\(\mu\)为3.7。《泰坦尼克号》比平均电影评分要好,且高了0.5分。Joe是一个不苟言笑的人,俗称critical user,他的所有评分比大众的平均要低0.3。所以Joe对《泰坦尼克号》的评分使用baseline可以预测为3.9分(3.7-0.3+0.5)。为了得到\(b_{u}\)\(b_{i}\),我们可以尝试解决一下优化问题:

\(min\sum_{(u,i)\in\kappa}(r_{ui}-\mu-b_{u}-b_{i})^2+\lambda_{1}(\sum_{u} b_{u}^2+ \sum_{i} b_{i}^2)\tag{1}\)

这是一个典型问题,第一项为均方误差,第二项为正则化项。

1.2 基于邻域的模型(Basic Neighborhood models)

基于邻域的模型分为两种,一种以用户user为导向,评分预测基于识别与该用户相类似的其他用户。另一种以物品item为导向,评分预测基于物品之间的相似度。相似度的相关计算可以看我的这篇博客推荐系统中物品相似度计算。在文章中,我们关注以item为导向的预测模型。

我们通常来 统计喜欢两个不同物品的人数交集 计算物品的相似度,如pearson相似度,用\(\rho_{ij}\)表示。但是有一些统计的计算只依赖于一小部分数据集合(如两个很冷门的电影,只被小部分专业人士同时看过),那么,这样的统计就不具有代表性了。这时,我们可以添加一个惩罚,即:

\(s_{ij}=\frac{n_{ij}}{n_{ij}+\lambda_{2}}\rho_{ij}\tag{2}\)

参数\(n_{ij}\)表示同时喜欢物品i和j的人数。可以看到,当n小的时候,与\(\lambda_{2}\)(通常为100)同数量级或小于它,相似度会收到缩减的惩罚。如果n非常大,则没有惩罚。

我们的目标是预测\(r_{ui}\),即用户u没有评分过的物品i。根据物品相似度,我们提取与物品i最相似的k个的物品(用户u有过评分的),并将这k个物品的集合表示为\(S^{k}(i;u)\)。那么我们的预测\(\hat r_{ui}\)则为在baseline的基础上,加上k个物品的加权平均,即:

\(\hat r_{ui}=b_{ui}+\frac {\sum_{j\in S^{k}(i;u)}s_{ij}(r_{uj}-b_{uj})}{\sum_{j\in S^{k}(i;u)}s_{ij}}\tag{3}\)

但是,(3)式的方法存在几个问题:

  1. 这个方法不能被正式的模型证明
  2. 两个物品之间的相似度的衡量在没有考虑整个邻域集的相互作用下是否适合
  3. (3)式中权重的计算方法太依赖于邻域集,但是有的物品可能邻域集为空(如用户u没有对与物品i相似的任何物品有过评分)。

所以,为了克服以上三点,我们采用的以下学习方法:

\(\hat r_{ui}=b_{ui}+\sum_{j\in S^{k}(i;u)}\theta_{ij}^u(r_{uj}-b_{uj})\)

这里的插入权重\(\theta_{ij}^u\)不是一个个单独计算的,而是依赖于许多邻项的交叉,这是一个统计数,而不是学习得到的。(By globally solving a suitable optimization problem, this simultaneous interpolation accounts for the many interactions between neighbors leading to improved accuracy.)

详见:Scalable Collaborative Filtering with Jointly Derived Neighborhood Interpolation Weights

1.3 隐语义模型(Latent factor models)

如果说前面的基于邻域的模型是统计方法,那么隐语义模型就是机器学习方法了,它有一个学习过程。例子很多,SVD,NMF,pLSA,以至于神经网络都可以算作隐语义模型。

对于基于SVD的隐语义模型具体介绍可见:从SVD到推荐系统

这里说一点:对于推荐系统来说,评分矩阵是稀疏的。然而传统的SVD分解并没有告诉我们矩阵不完整的情况。对此,可以选择将稀疏的矩阵进行填充,使之变的dense后进行分解学习。但是,这无疑产生了很多无意义的数据和额外计算。而且,数据可能变得畸形。所以,对此,我们可以只选择有数据的评分进行分解,即:

\(min\sum_{(u,i)\in \mathcal{k}}(r_{ui}-\mu – b_i – b_u – \mathbf{q}_i^T\mathbf{p}_u)^2 + \lambda_{3} (\lVert p_u \rVert^2 + \lVert q_i \rVert^2 + b_u^2 + b_i^2)\tag{5}\)

以上为最小化损失函数,\(\mathcal{k}\)为用户u所有评分过的集合。

解决(5)式,一个简单的梯度下降就可以!

版权声明:本文为bjwu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/bjwu/p/9588047.html