文章目录

  • 1. 隐语义模型与矩阵分解
  • 2. 隐语义模型
  • 3. 矩阵分解算法的原理
  • 4. 矩阵分解算法的求解
  • 5. Basic SVD

1. 隐语义模型与矩阵分解

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

第一个就是处理稀疏矩阵的能力比较弱, 所以为了使得协同过滤更好处理稀疏矩阵问题, 增强泛化能力, 从协同过滤中衍生出矩阵分解模型(Matrix Factorization,MF)或者叫隐语义模型, 两者差不多说的一个意思, 就是在协同过滤共现矩阵的基础上, 使用更稠密的隐向量表示用户和物品, 挖掘用户和物品的隐含兴趣和隐含特征, 在一定程度上弥补协同过滤模型处理稀疏矩阵能力不足的问题。

2. 隐语义模型

隐语义模型最早在文本领域被提出,用于找到文本的隐含语义。在2006年, 被用于推荐中, 它的核心思想是通过隐含特征(latent factor)联系用户兴趣和物品(item), 基于用户的行为找出潜在的主题和分类, 然后对item进行自动聚类,划分到不同类别/主题(用户的兴趣)

  1. 潜在因子—— 用户矩阵Q
    这个矩阵表示不同用户对于不同元素的偏好程度, 1代表很喜欢, 0代表不喜欢, 比如下面这样:
  1. 潜在因子——音乐矩阵P
    表示每种音乐含有各种元素的成分, 比如下表中, 音乐A是一个偏小清新的音乐, 含有小清新的Latent Factor的成分是0.9, 重口味的成分是0.1, 优雅成分0.2…

利用上面的这两个矩阵, 我们就能得出张三对音乐A的喜欢程度:

张三对小清新的偏好 * 音乐A含有小清新的成分 + 张三对重口味的偏好 * 音乐A含有重口味的成分 + 张三对优雅的偏好 * 音乐A含有优雅的成分…,

下面是对应的两个隐向量:

根据隐向量其实就可以得到张三对音乐A的打分,即: 0.6∗0.9+0.8∗0.1+0.1∗0.2+0.1∗0.4+0.7∗0=0.690.6 * 0.9 + 0.8 * 0.1 + 0.1 * 0.2 + 0.1 * 0.4 + 0.7 * 0 = 0.690.60.9+0.80.1+0.10.2+0.10.4+0.70=0.69
按照这个计算方式, 每个用户对每首歌其实都可以得到这样的分数, 最后就得到了我们的评分矩阵:

这里的红色表示用户没有打分,我们通过隐向量计算得到的。

上面例子中的小清晰, 重口味, 优雅这些就可以看做是隐含特征, 而通过这个隐含特征就可以把用户的兴趣和音乐的进行一个分类, 其实就是找到了每个用户每个音乐的一个隐向量表达形式(embedding的原理其实也是这样, 那里是找到每个词的隐向量表达), 这个隐向量就可以反映出用户的兴趣和物品的风格,并能将相似的物品推荐给相似的用户等。 有没有感觉到是把协同过滤算法进行了一种延伸, 把用户的相似性和物品的相似性通过了一个叫做隐向量的方式进行表达

但是, 真实的情况下我们其实是没有上面那两个矩阵的, 音乐那么多, 用户那么多, 我们没有办法去找一些隐特征去表示出这些东西, 另外一个问题就是即使能表示也不一定准, 对于每个用户或者每个物品的风格,我们每个人都有不同的看法。 所以事实上, 我们有的只有用户的评分矩阵, 也就是最后的结果, 并且一般这种矩阵长这样:

这种矩阵非常的稀疏,如果直接基于用户相似性或者物品相似性去填充这个矩阵是不太容易的, 并且很容易出现长尾问题, 所以矩阵分解就可以比较容易的解决这个问题。

矩阵分解模型其实就是在想办法基于这个评分矩阵去找到上面例子中的那两个矩阵, 也就是用户兴趣和物品的隐向量表达, 然后就把这个评分矩阵分解成Q和P两个矩阵乘积的形式, 这时候就可以基于这两个矩阵去预测某个用户对某个物品的评分了。 然后基于这个评分去进行推荐。这就是矩阵分解算法的原理。

3. 矩阵分解算法的原理

在矩阵分解的算法框架下, 我们就可以通过分解协同过滤的共现矩阵来得到用户和物品的隐向量, 就是上面的用户矩阵Q和物品矩阵P, 这也是“矩阵分解”名字的由来。

矩阵分解算法将m×nm\times nm×n维的共享矩阵RRR分解成m×km \times km×k维的用户矩阵UUUk×nk \times nk×n维的物品矩阵VVV相乘的形式。 其中mmm是用户数量, nnn是物品数量, kkk是隐向量维度, 也就是隐含特征个数, 只不过这里的隐含特征变得不可解释了, 即我们不知道具体含义了, 要模型自己去学。kkk的大小决定了隐向量表达能力的强弱, kkk越大, 表达信息就越强, 理解起来就是把用户的兴趣和物品的分类划分的越具体。

那么如果有了用户矩阵和物品矩阵的话, 我们就知道了如果想计算用户uuu对物品iii的评分, 只需要
Preference⁡(u,i)=rui=puTqi=∑f=1Fpu,kqk,i\operatorname{Preference}(u, i)=r_{u i}=p_{u}^{T} q_{i}=\sum_{f=1}^{F} p_{u, k} q_{k,i} Preference(u,i)=rui=puTqi=f=1Fpu,kqk,i
这里的pup_upu就是用户uuu的隐向量, 就类似与上面的张三向量, 注意这是列向量, qiq_iqi是物品iii的隐向量, 就类似于上面的音乐A向量, 这个也是列向量, 所以才用了puTqip_{u}^{T} q_{i}puTqi得到了一个数, 也就是用户的最终评分, 计算过程其实和上面例子中一样。 这里的pu,kp_{u,k}pu,kqi,kq_{i,k}qi,k是模型的参数, 也正是我们想办法要计算的, pu,kp_{u,k}pu,k度量的是用户uuu的兴趣和第kkk个隐类的关系, 而qi,kq_{i,k}qi,k度量了第kkk个隐类和物品iii之间的关系。

4. 矩阵分解算法的求解

谈到矩阵分解, 最常用的方法是特征值分解(EVD)或者奇异值分解(SVD), 关于这两个的具体原理可以参考下面的链接奇异值分解(SVD)的原理详解及推导,但是这两种方式在这里不适用。

首先是EVD, 它要求分解的矩阵是方阵, 显然用户-物品矩阵不满足这个要求, 而传统的SVD分解, 会要求原始矩阵是稠密的, 而我们这里的这种矩阵一般情况下是非常稀疏的, 如果想用奇异值分解, 就必须对缺失的元素进行填充, 而一旦补全, 空间复杂度就会非常高, 且补的不一定对。 然后就是SVD分解计算复杂度非常高, 而我们的用户-物品矩阵非常大, 所以基本上无法使用。

5. Basic SVD

2006年的Netflix Prize之后, Simon Funk公布了一个矩阵分解算法叫做Funk-SVD, 后来被Netflix Prize的冠军Koren称为Latent Factor Model(LFM)。 Funk-SVD的思想很简单: 把求解上面两个矩阵的参数问题转换成一个最优化问题, 可以通过训练集里面的观察值利用最小化来学习用户矩阵和物品矩阵

我们上面已经知道了, 如果有了用户矩阵和物品矩阵的话, 我们就知道了如果想计算用户uuu对物品iii的评分, 只需要
Preference⁡(u,i)=rui=puTqi=∑f=1Fpu,kqk,i\operatorname{Preference}(u, i)=r_{u i}=p_{u}^{T} q_{i}=\sum_{f=1}^{F} p_{u, k} q_{k,i} Preference(u,i)=rui=puTqi=f=1Fpu,kqk,i
而现在, 我们有真实的ru,ir_{u,i}ru,i, 但是没有puTqip_{u}^{T} q_{i}puTqi, 那么我们可以初始化一个啊, 随机初始化一个用户矩阵UUU和一个物品矩阵VVV, 然后不就有puTqip_{u}^{T} q_{i}puTqi了? 当然你说, 随机初始化的肯定不准啊, 但是, 有了puTqip_{u}^{T} q_{i}puTqi之后, 我们就可以计算一个猜测的r^ui\hat{r}_{u i}r^ui, 即
r^ui=puTqi\hat{r}_{u i}=p_{u}^{T} q_{i} r^ui=puTqi

这时候, 肯定是不准, 那么这个猜测的和真实值之间就会有一个误差:
eui=rui−r^uie_{u i}=r_{u i}-\hat{r}_{u i} eui=ruir^ui

有了误差, 我们就可以计算出总的误差平方和:
SSE⁡=∑u,ieui2=∑u,i(rui−∑k=1Kpu,kqk,i)2\operatorname{SSE}=\sum_{u, i} e_{u i}^{2}=\sum_{u, i}\left(r_{u i}-\sum_{k=1}^{K} p_{u,k} q_{k, i}\right)^{2} SSE=u,ieui2=u,i(ruik=1Kpu,kqk,i)2
有了损失, 我们就可以想办法进行训练, 把SSE降到最小, 那么我们的两个矩阵参数就可以算出来。所以就把这个问题转成了最优化的的问题, 而我们的目标函数就是:

min⁡q∗,p∗∑(u,i)∈K(rui−puTqi)2\min _{\boldsymbol{q}^{*}, \boldsymbol{p}^{*}} \sum_{(u, i) \in K}\left(\boldsymbol{r}_{\mathrm{ui}}-p_{u}^{T} q_{i}\right)^{2} q,pmin(u,i)K(ruipuTqi)2

这里的KKK表示所有用户评分样本的集合。

有了目标函数, 那么我们就可以使用梯度下降算法来降低损失。 那么我们需要对目标函数求偏导, 得到梯度。 我们的目标函数如果是上面的SSE, 我们下面来推导一下最后的导数:

SSE⁡=∑u,ieui2=∑u,i(rui−∑k=1Kpu,kqk,i)2\operatorname{SSE}=\sum_{u, i} e_{u i}^{2}=\sum_{u, i}\left(r_{u i}-\sum_{k=1}^{K} p_{u,k} q_{k,i}\right)^{2} SSE=u,ieui2=u,i(ruik=1Kpu,kqk,i)2
首先我们求SSE在pu,kp_{u,k}pu,k(也就是Q矩阵的第uuukkk列)的梯度:
∂∂pu,kSSE=∂∂pu,k(eui2)=2eui∂∂pu,keui=2eui∂∂pu,k(rui−∑k=1Kpu,kqk,i)=−2euiqk,i\frac{\partial}{\partial p_{u,k}} S S E=\frac{\partial}{\partial p_{u,k}}\left(e_{u i}^{2}\right) =2e_{u i} \frac{\partial}{\partial p_{u,k}} e_{u i}=2e_{u i} \frac{\partial}{\partial p_{u,k}}\left(r_{u i}-\sum_{k=1}^{K} p_{u,k} q_{k,i}\right)=-2e_{u i} q_{k,i} pu,kSSE=pu,k(eui2)=2euipu,keui=2euipu,k(ruik=1Kpu,kqk,i)=2euiqk,i
然后求SSE在qk,iq_{k,i}qk,i处(也就是V矩阵的第kkkiii列)的梯度:

∂∂qk,iSSE=∂∂pk,i(eui2)=2eui∂∂pk,ieui=2eui∂∂pk,i(rui−∑k=1Kpu,kqk,i)=−2euipu,k\frac{\partial}{\partial q_{k,i}} S S E=\frac{\partial}{\partial p_{k,i}}\left(e_{u i}^{2}\right) =2e_{u i} \frac{\partial}{\partial p_{k,i}} e_{u i}=2e_{u i} \frac{\partial}{\partial p_{k,i}}\left(r_{u i}-\sum_{k=1}^{K} p_{u,k} q_{k,i}\right)=-2e_{u i} p_{u,k} qk,iSSE=pk,i(eui2)=2euipk,ieui=2euipk,i(ruik=1Kpu,kqk,i)=2euipu,k
为了让公式更为简单, 把前面的2给他越掉, 即可以令SSE等于:
SSE⁡=12∑u,ieui2=12∑u,i(rui−∑k=1Kpukqki)2\operatorname{SSE}=\frac{1}{2} \sum_{u, i} e_{u i}^{2}=\frac{1}{2} \sum_{u, i}\left(r_{u i}-\sum_{k=1}^{K} p_{u k} q_{k i}\right)^{2} SSE=21u,ieui2=21u,i(ruik=1Kpukqki)2

这时候, 梯度就没有前面的系数了, 有了梯度, 接下来我们就可以用梯度下降算法更新梯度了:
pu,k=pu,k−η(−euiqk,i)=pu,k+ηeuiqk,iqk,i=qk,i−η(−euipu,k)=qk,i+ηeuipu,kp_{u, k}=p_{u,k}-\eta (-e_{ui}q_{k,i})=p_{u,k}+\eta e_{ui}q_{k,i} \\ q_{k, i}=q_{k, i}-\eta (-e_{ui}p_{u,k})=q_{k, i}+\eta e_{ui}p_{u,k} pu,k=pu,kη(euiqk,i)=pu,k+ηeuiqk,iqk,i=qk,iη(euipu,k)=qk,i+ηeuipu,k

这里的η\etaη是学习率, 控制步长用的, 但上面这个有个问题就是当参数很多的时候, 就是两个矩阵很大的时候, 往往容易陷入过拟合的困境, 这时候, 就需要在目标函数上面加上正则化的损失, 就变成了RSVD, 关于RSVD的详细内容, 可以参考下面给出的链接, 由于篇幅原因, 这里不再过多的赘述。

但在实际中, 单纯的r^ui=puTqi\hat{r}_{u i}=p_{u}^{T} q_{i}r^ui=puTqi也是不够的, 还要考虑其他的一些因素, 比如一个评分系统, 有些固有的属性和用户物品无关, 而用户也有些属性和物品无关, 物品也有些属性和用户无关。 因此, Netfix Prize中提出了另一种LFM, 在原来的基础上加了偏置项, 来消除用户和物品打分的偏差, 即预测公式如下:
r^ui=μ+bu+bi+puT⋅qi\hat{r}_{u i}=\mu+b_{u}+b_{i}+p_{u}^{T} \cdot q_{i} r^ui=μ+bu+bi+puTqi
这个预测公式加入了3项偏置μ,bu,bi\mu,b_u,b_iμ,bu,bi, 作用如下:

  • μ\muμ: 训练集中所有记录的评分的全局平均数。 在不同网站中, 因为网站定位和销售物品不同, 网站的整体评分分布也会显示差异。 比如有的网站中用户就喜欢打高分, 有的网站中用户就喜欢打低分。 而全局平均数可以表示网站本身对用户评分的影响。
  • bub_ubu: 用户偏差系数, 可以使用用户uuu给出的所有评分的均值, 也可以当做训练参数。 这一项表示了用户的评分习惯中和物品没有关系的那种因素。 比如有些用户比较苛刻, 对什么东西要求很高, 那么他评分就会偏低, 而有些用户比较宽容, 对什么东西都觉得不错, 那么评分就偏高
  • bib_ibi: 物品偏差系数, 可以使用物品iii收到的所有评分的均值, 也可以当做训练参数。 这一项表示了物品接受的评分中和用户没有关系的因素。 比如有些物品本身质量就很高, 因此获得的评分相对比较高, 有的物品本身质量很差, 因此获得的评分相对较低。

加了用户和物品的打分偏差之后, 矩阵分解得到的隐向量更能反映不同用户对不同物品的“真实”态度差异, 也就更容易捕捉评价数据中有价值的信息, 从而避免推荐结果有偏。 注意此时的SSESSESSE会发生变化:
SSE⁡=12∑u,ieui2+12λ∑u∣pu∣2+12λ∑i∣qi∣2+12λ∑ubu2+12λ∑ubi2=12∑u,i(rui−μ−bu−bi−∑k=1Kpukqki)2+12λ∑u∣pu∣2+12λ∑i∣qi∣2+12λ∑ubu2+12λ∑ubi2\begin{array}{l} \operatorname{SSE}=\frac{1}{2} \sum_{u, i} e_{u i}^{2}+\frac{1}{2} \lambda \sum_{u}\left|\boldsymbol{p}_{u}\right|^{2}+\frac{1}{2} \lambda \sum_{i}\left|\boldsymbol{q}_{i}\right|^{2}+\frac{1}{2} \lambda \sum_{u} \boldsymbol{b}_{u}^{2}+\frac{1}{2} \lambda \sum_{u} \boldsymbol{b}_{i}^{2} \\ =\frac{1}{2} \sum_{u, i}\left(\boldsymbol{r}_{u i}-\boldsymbol{\mu}-\boldsymbol{b}_{u}-\boldsymbol{b}_{i}-\sum_{k=1}^{K} \boldsymbol{p}_{u k} \boldsymbol{q}_{k i}\right)^{2}+\frac{1}{2} \lambda \sum_{u}\left|\boldsymbol{p}_{u}\right|^{2}+\frac{1}{2} \lambda \sum_{i}\left|\boldsymbol{q}_{i}\right|^{2}+\frac{\mathbf{1}}{2} \lambda \sum_{u} \boldsymbol{b}_{u}^{2}+\frac{1}{2} \lambda \sum_{u} \boldsymbol{b}_{i}^{2} \end{array} SSE=21u,ieui2+21λupu2+21λiqi2+21λubu2+21λubi2=21u,i(ruiμbubik=1Kpukqki)2+21λupu2+21λiqi2+21λubu2+21λubi2
此时如果把bub_ububib_ibi当做训练参数的话, 那么它俩的梯度是:

∂∂buSSE=−eui+λbu∂∂biSSE=−eui+λbi\frac{\partial}{\partial b_{u}} S S E=-e_{u i}+\lambda b_{u} \\ \frac{\partial}{\partial b_{i}} S S E=-e_{u i}+\lambda b_{i} buSSE=eui+λbubiSSE=eui+λbi
更新公式为:
bu=bu+η(eui−λbu)bi=bi+η(eui−λbi)\begin{aligned} \boldsymbol{b}_{u}&=\boldsymbol{b}_{\boldsymbol{u}}+\boldsymbol{\eta}\left(\boldsymbol{e}_{u i}-\lambda \boldsymbol{b}_{\boldsymbol{u}}\right) \\ \boldsymbol{b}_{\boldsymbol{i}} &=\boldsymbol{b}_{\boldsymbol{i}}+\boldsymbol{\eta}\left(\boldsymbol{e}_{\boldsymbol{u} i}-\lambda \boldsymbol{b}_{\boldsymbol{i}}\right) \end{aligned} bubi=bu+η(euiλbu)=bi+η(euiλbi)
而对于pu,kp_{u,k}pu,kpk,ip_{k,i}pk,i, 导数没有变化, 更新公式也没有变化。

Task3 矩阵分解相关推荐

  1. 矩阵奇异值分解特征值分解_推荐系统中的奇异值分解与矩阵分解

    矩阵奇异值分解特征值分解 Recently, after watching the Recommender Systems class of Prof. Andrew Ng's Machine Lea ...

  2. 【MATLAB】矩阵运算之矩阵分解

    矩阵分解:把一个矩阵分解成为矩阵连乘的形式. 矩阵的分解函数 chol Cholesky分解 cholinc 稀疏矩阵的不完全Cholesky分解 lu 矩阵LU分解 luinc 稀疏矩阵的不完全LU ...

  3. 从原理到落地,七大维度详解矩阵分解推荐算法

    作者 | gongyouliu 编辑丨Zandy 来源 |  大数据与人工智能 ( ID: ai-big-data) 导语:作者在<协同过滤推荐算法>这篇文章中介绍了 user-based ...

  4. 一文帮你梳理清楚:奇异值分解和矩阵分解 | 技术头条

    作者 | K. Delphino 译者 | Linstancy 编辑 | Rachel 出品 | AI科技大本营(id:rgznai100) [导读]在推荐系统的相关研究中,我们常常用到两个相关概念: ...

  5. 精简易懂,30 分钟学会 SVD 矩阵分解,很强!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 SVD(Singular Value Decomposition) ...

  6. MF+Matrix Factorization+矩阵分解

    MF+Matrix Factorization+矩阵分解 Matrix Factorization Matrix Decompostion LU分解,QR分解,SVD分解,,,, 非负矩阵分解 概念: ...

  7. 3.推荐系统(矩阵分解)

    思维导图: 推荐系统中的经典问题:评分预测(实际应用中,评分数据很难搜集到,属于典型的精英问题),与之相对的问题是行为预测,处处可见. 矩阵分解 矩阵分解确实可以解决一些近邻模型无法解决的问题,近邻模 ...

  8. mf模型 svd++_算法小板报(六)——初探MF(矩阵分解)和FM模型

    一.简介 矩阵分解(Matrix Factorization,MF)是推荐系统中非常经典的一个算法,虽然现今工业界直接使用的较少,但其背后蕴含的编码降维思想,得以广泛应用于推荐领域之中.本文则主要来梳 ...

  9. 基于矩阵分解的推荐算法

    https://www.toutiao.com/a6656899746516435469/ 2019-02-12 08:10:52 1.算法介绍 在推荐算法中,主要解决的问题是找到用户对物品的偏好得分 ...

最新文章

  1. Vue实现仿音乐播放器10-更多按钮实现下拉刷新
  2. mysql之存储引擎和文件配置
  3. 面经——嵌入式软件工程师ARM体系与架构相关
  4. firefox input file宽度失效
  5. matlab拉普拉斯算子边缘提取_【图像处理】OpenCV系列十 --- 边缘检测之Laplacian算子...
  6. python分页PDF
  7. 【量化笔记】时间序列--ARCH模型及GARCH模型
  8. 小程序webview内嵌h5链接第二次打开空白
  9. HTML中的元素分类
  10. 谈谈我对服务网格的理解
  11. 基于Android开发的仿网易云播放器
  12. Python3基础--18--数据库编程(上)
  13. 你应该要懂的宇宙真相——《给忙碌者的天体物理学 》下篇
  14. 有哪些非常好的前端网站或个人博客?
  15. JavaScript闭包实现计数器
  16. 简单的VGA字符模式驱动(一)
  17. ARouter原理分析
  18. 斑马打印机ZT230踩坑记
  19. word中显示删除内容
  20. 360、腾讯管家安装蓝屏问题解决方案

热门文章

  1. 亚马逊主图视频时长多少合适
  2. 泛海微FS68001 SOP8封装 无线充单片机IC领夹式麦克风加充电方案芯片
  3. python期中考试知识点_自述:FRM和CFA总共有五次考试,我未有失手
  4. 最牛小强病毒网上作乱 主使网站获利惊人
  5. 管道设计软件:PIPEDATA-PRO
  6. springboot中使用freemarker生成word文档并打包成zip下载(简历)
  7. Softmax 函数和它的误解
  8. Makefile实现子目录编译
  9. 什么是虚拟现实vr技术?vr技术可以用那几个行业?
  10. easyui datagrid数据加载缓慢问题,优化方法