SVD

"推荐"

Posted by zwt on September 1, 2020

基本概念

特征值特征向量:\(Ax = \lambda x\)。其中A为n*n的矩阵,x为n维向量,\(\lambda\)为矩阵A的一个特征值,而x为A的特征值对应的特征性向量。

特征值分解:如果一个矩阵A是一个mm的实对称矩阵\(A = A^T\),那么它可以拆分为如下的形式: \(A=Q \Sigma Q^{T}=Q\left[\begin{array}{cccc} \lambda_{1} & \cdots & \cdots & \cdots \\ \cdots & \lambda_{2} & \cdots & \cdots \\ \cdots & \cdots & \ddots & \cdots \\ \cdots & \cdots & \cdots & \lambda_{m} \end{array}\right] Q^{T}\) 其中Q为标准正交阵,也就是\(QQ^T=I, \Sigma\)为对角矩阵,且上面的矩阵的维度均为mm,\(\lambda_i\)为特征值,\(q_i\)是Q的列向量,称为特征向量。这种分解对矩阵有着严格的要求:

1
被分解的矩阵必须是实对称矩阵

奇异值分解:对一个m*n的矩阵,A,想要对其进行分解\(A = U \Sigma V^T\),其中U和V均为单位正交阵。U称为左奇异阵,\(\Sigma\)仅在对角线上有值,称为奇异值,其他元素为0,V称为左奇异阵。通常\(\Sigma\)为: \(\Sigma=\left[\begin{array}{ccccc} \sigma_{1} & 0 & 0 & 0 & 0 \\ 0 & \sigma_{2} & 0 & 0 & 0 \\ 0 & 0 & \ddots & 0 & 0 \\ 0 & 0 & 0 & \ddots & 0 \end{array}\right]_{m \times n}\)

求解

实对称矩阵:通常\(Ax = \lambda x -> Ax = \lambda Ex\)其中E为单位矩阵。则可以得到\((\lambda E - A)x = 0\)。 \(|\lambda E-A|=\left|\begin{array}{cccc} \lambda-a_{11} & -a_{12} & \ldots & -a_{1 n} \\ -a_{21} & \lambda-a_{22} & \ldots & -a_{2 n} \\ \ldots & \ldots & \ldots & \ldots \\ -a_{m 1} & -a_{11} & \ldots & \lambda-a_{m n} \end{array}\right|=0\) 所以在一只矩阵A的情况下,代入可得特征值,将特征值再回代回去,就可以得到对应的特征向量。

一般矩阵:对mn的矩阵A,得到矩阵\(A^TA\),则A是一个nn的方阵,则可以通过实对称矩阵的方式计算其特征值特征向量,将其特征向量组成矩阵V称为A的右奇异矩阵。同样\(AA^T\)是m*m的方阵,也可以计算其特征值特征向量,将特征向量组成矩阵得到A的左奇异矩阵。奇异值为特征值的开方。 \(A=U \Sigma V^{T} \Rightarrow A^{T}=V \Sigma U^{T} \Rightarrow A^{T} A=V \Sigma U^{T} U \Sigma V^{T}=V \Sigma^{2} V^{T}\)

SVD与推荐系统

首先SVD用于推荐系统,可以以降低维度的作用应用于推荐系统,将用户项目矩阵进行奇异值分解,截取其中奇异值比较大一部分,将整个矩阵进行降维,可以大大的简化后续的计算过程,因为通常在实际中用户项目的矩阵非常大。

基于SVD分解后,利用降维后的U,S,V对矩阵进行还原,原先矩阵中空缺的部分就可以得到填充值。

但是在具体使用时会有很多问题:

1
2
3
4
1. 矩阵很稀疏,随意的填充会造成失真
2. 同时也会增大计算量
3. 内存消耗问题
4. svd分解方式单一,获取特征的方式不够灵活

基于以上问题,在实际使用的时候通常使用的为伪SVD,也就是针对稀疏矩阵的SVD。 \(arg min_{U, \Sigma , V} (Y - U\Sigma V^T)^2 = arg min_{U, \Sigma , V} \sum_{i=1}^M \sum_{j=1}^n (y_{ij} - (U\Sigma V^T)_{ij})^2\)

但是这个伪SVD也有问题,由于数据过于稀疏,而参数量又很大,所以模型的效果不好,要保证效果就需要数据多,同时矩阵还不能过于稀疏。针对这个问题,提出了Funk-SVD也就是LFM隐语义模型。

LFM将伪SVD中的奇异值融合到U和V中得到: \((u^*, v^*) = argmin_{u,v} \sum_{a_{ij}} (a_{ij} - \sum_{k=1}^K u_{ik}v_{ik})^2\) 这样得到的用户和物品隐特征矩阵虽然不一定具备经典奇异值分解的正交矩阵性质,但是用来作为用户和物品的特征表达(隐因子)也足够了。 最后的得分计算: \(\operatorname{Preference}(u, i)=r_{u i}=p_{u}^{T} q_{i}=\sum_{k=1}^{K} p_{u, k} q_{i, k}\)

参考

  1. 知乎1
  2. 知乎2
  3. 知乎3