以下内容参考于知乎奇异值分解(SVD)学习笔记以及矩阵分析之奇异值分解(SVD),总结如下:
奇异值分解(Singular Value Decomposition,以下简称SVD) 是在机器学习领域广泛应用的算法, 是一种提取信息的强大工具,它提供了一种非常便捷的矩阵分解的方式,能够发现数据中十分有意思的潜在模式。本文就对SVD的原理做一个介绍,并给出实际的使用案例。
在做 SVD 推导之前,先了解一下特征值和特征向量的定义:
A x = λ x Ax=\lambda x Ax=λx
其中 A 是一个 n × n n\times n n×n 的矩阵, x x x 是一个 n 维向量,则 λ \lambda λ 是矩阵 A 的一个特征值,而 x x x 是矩阵 A 的特征值 λ \lambda λ 所对应的特征向量。
求出特征值和特征向量有什么好处呢? 就是我们可以将矩阵A特征分解。
也就是说矩阵A的信息可以由其特征值和特征向量表示。
如果我们求出了矩阵A的n个特征值 λ 1 ≤ λ 2 ≤ . . . ≤ λ n \lambda_{1}\leq \lambda_{2}\leq... \leq \lambda_{n} λ1≤λ2≤...≤λn ,以及这 n 个特征值所对应的特征向量 w 1 , w 2 , . . . , w n {{ w_{1},w_{2}},...,w_{n}} w1,w2,...,wn ,
那么矩阵 A 就可以用下式的特征分解表示:
其中 W 是这 n 个特征向量所张成的 n × n n\times n n×n 维矩阵,而 Σ 为这 n 个特征值为主对角线的 n × n n\times n n×n 维矩阵。
一般我们会把W的这n个特征向量标准化,即满足 ∣ ∣ w i ∣ ∣ 2 = 1 \left| \left| w_{i} \right| \right|_{2}=1 ∣∣wi∣∣2=1 ,或者 w i T w i = 1 w_{i}^{T}w_{i}=1 wiTwi=1 ,此时W的 n个特征向量为标准正交基,满足 W T W = I W^{T}W=I WTW=I ,即 W T = W − 1 W^{T}=W^{-1} WT=W−1 ,也就是说W为酉矩阵。
正交矩阵(Orthogonal Matrix)是指其转置等于其逆的矩阵 A T = A − 1 A^T=A^{-1} AT=A−1
酉矩阵是正交矩阵往复数域上的推广
这样我们的特征分解表达式可以写成
总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。
特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有M个学生,每个学生有N科成绩,这样形成的一个 M* N 的矩阵 A 就不可能是方阵,我们怎样才能描述这样普通的矩阵的重要特征呢?奇异值分解是一个能适用于任意的矩阵的一种分解的方法:
其中 U 是一个 m × m m\times m m×m 的矩阵, Σ \Sigma Σ 是一个 m × n m\times n m×n 的矩阵,除了主对角线上的元素以外全为 0,主对角线上的每个元素都称为奇异值, V 是一个 n × n n\times n n×n 的矩阵。 U 和 V 都是酉矩阵,即满足:
U T U = I , V T V = I U^{T}U=I,V^{T}V=I UTU=I,VTV=I
下图可以很形象的看出上面SVD的定义:
那么我们如何求出SVD分解后的U,Σ,V这三个矩阵呢?
如果我们将A的转置和A做矩阵乘法,那么会得到 n × n n×n n×n 的一个方阵 A T A A^{T}A ATA 。既然 A T A A^{T}A ATA 是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:
这样我们就可以得到矩阵 A T A A^{T}A ATA 的 n 个特征值和对应的n个特征向量v了。将 A T A A^{T}A ATA 的所有特征向量张成一个 n × n n×n n×n的矩阵V,就是我们SVD公式里面的V矩阵了。一般我们将V中的每个特征向量叫做A的右奇异向量。
如果我们将A和A的转置做矩阵乘法,那么会得到 m × m m×m m×m 的一个方阵 A A T AA^{T} AAT 。既然 A A T AA^{T} AAT 是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:
这样我们就可以得到矩阵 A A T AA^{T} AAT 的m个特征值和对应的m个特征向量u了。将 A A T AA^{T} AAT 的所有特征向量张成一个 m × m m×m m×m的矩阵U,就是我们SVD公式里面的U矩阵了。一般我们将U中的每个特征向量叫做A的左奇异向量。
U和V我们都求出来了,现在就剩下奇异值矩阵 Σ 没有求出了,由于 Σ 除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值 σ 就可以了。
我们注意到:
这样我们可以求出我们的每个奇异值,进而求出奇异值矩阵 Σ。
上面还有一个问题没有讲,就是我们说 A T A A^{T}A ATA 的特征向量组成的就是我们SVD中的V矩阵,而 A A T AA^{T} AAT 的特征向量组成的就是我们SVD中的U矩阵,这有什么根据吗?这个其实很容易证明,我们以V矩阵的证明为例。
上式证明使用了 U U = I , Σ T = Σ U^{U}=I,\Sigma^{T}= \Sigma UU=I,ΣT=Σ 。可以看出 A T A A^{T}A ATA 的特征向量组成的的确就是我们SVD中的V矩阵。类似的方法可以得到 A A T AA^{T} AAT 的特征向量组成的就是我们SVD中的U矩阵。
进一步我们还可以看出我们的特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:
这样也就是说,我们可以不用 σ i = A v i u i \sigma_{i}=\frac{Av_{i}}{u_{i}} σi=uiAvi 来计算奇异值,也可以通过求出 A T A A^{T}A ATA 的特征值取平方根来求奇异值。
对于矩阵A的奇异值,我们可以先通过 wolframalpha 计算出来:
手工计算步骤:
矩阵分析之奇异值分解(SVD)
https://www.bilibili.com/video/av15971352/?p=5
如上图,我们可以看出SVD可以把矩阵分割成不同的矩阵相加,而分割后前面的系数就是SVD值,对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。
由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪,也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。
PCA降维,需要找到样本协方差矩阵 X T X X^{T}X XTX 的最大的 d 个特征向量,然后用这最大的d个特征向量张成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵 X T X X^{T}X XTX ,当样本数多样本特征数也多的时候,这个计算量是很大的。
注意到我们的SVD也可以得到协方差矩阵 X T X X^{T}X XTX 最大的d个特征向量张成的矩阵,但是SVD有个好处,有一些SVD的实现算法可以不求先求出协方差矩阵 X T X X^{T}X XTX ,也能求出我们的右奇异矩阵V。
也就是说,我们的PCA算法可以不用做特征分解,而是做SVD来完成,这个方法在样本量很大的时候很有效。
实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是我们我们认为的暴力特征分解。
另一方面,注意到PCA仅仅使用了我们SVD的右奇异矩阵,没有使用左奇异矩阵,那么左奇异矩阵有什么用呢?
假设我们的样本是 m × n m×n m×n 的矩阵X,如果我们通过SVD找到了矩阵 X X T XX^{T} XXT 最大的d个特征向量张成的 m × d m×d m×d 维矩阵U,则我们如果进行如下处理:
可以得到一个 d × n d×n d×n 的矩阵X‘, 这个矩阵和我们原来的 m × n m×n m×n 维样本矩阵X相比,行数从m减到了k,可见对行数进行了压缩。
左奇异矩阵可以用于行数的压缩。
右奇异矩阵可以用于列数即特征维度的压缩,也就是我们的PCA降维。
1.SVD分解是将一个矩阵分解为它的左特征空间矩阵和右特征空间矩阵,而中间的特征值矩阵则是代表着权值,因此我们每次只要选取那些重要的特征留存下来,就可以几乎没有损耗的还原原矩阵;
2.SVD分解可以看成是原矩阵的一种低秩表达;
3.SVD可以用于数据的去噪;
4.SVD可以用于特征维度的压缩;