2021人工智能领域新星创作者,带你从入门到精通,该博客每天更新,逐渐完善机器学习各个知识体系的文章,帮助大家更高效学习。
一、概述
之前讲了一种方法叫做特征值分解,它是将我们的协方差矩阵进行分解,但是这时会有一定的约束条件才可以进行分解
- 必须是方阵
- 能够被对角化
这两个要求是相对来说较高的,对于协方差矩阵是方阵,而且是对称矩阵,实对称矩阵一定可以对角化,但是如果对于一般形状的矩阵能不能仍对其进行分解呢?
答案是肯定的,本文将讲解如何使用大杀器SVD对一般形式的矩阵进行分解。
对于之前讲的特征值分解,我们的目标就是找到一个映射矩阵P,然后将其与原数据A进行相乘,从而实现降维的效果,其实SVD也是这样,也是要找到一个映射矩阵,只不过是这两种方法找这个映射矩阵的方式不同,特征值分解是将协方差矩阵C进行分解,而我们的奇异值分解是直接分解原数据样本A。
接下来就具体讲解一下SVD是如何分解矩阵的。
二、SVD奇异值分解
1.A v = σ u Av=\sigma uAv=σu 公式
该公式非常重要,第一眼看起来它是不是有点像特征方程 A x = λ x Ax=\lambda xAx=λx ,其实特征多项式知识该式子的特殊情况,当 v = u v=uv=u 时,就变成了特征多项式。
为了讲述方便,这里先做一些约定:
- 假设A的形状为(m,n)
- 矩阵的秩为r
- r<=n<=m
如果是这样,我们一定可以找到n组等式符合 A v = σ u Av=\sigma uAv=σu ,我们的矩阵A为m行n列,而且行数大于列数,所以矩阵A的作用就是将一个向量从n维映射到更高的m维度,为什么呢?
A为(m,n),如果此时向量x为(n,1),将Ax做乘法,得到的结果就是(m,1),这样x经过矩阵A的作用就从原来的n维升到了m维。
那么对应 A v = σ u Av=\sigma uAv=σu 这个式子,也就是经过A的作用,我们将n维向量v映射到了m维向量u,那么也就是说我一定可以在原来的n维空间内找到一组标准正交向量 v 1 , v 2 , . . . , v n v_1,v_2,...,v_nv1,v2,...,vn ,和在映射后的m维空间内找到一组标准正交向量 u 1 , u 2 , . . . , u m u_1,u_2,...,u_mu1,u2,...,um 使之满足 A v i = σ i u i Av_i=\sigma_i u_iAvi=σiui ,(其中i=1,2,…,n),共有n组方程。
那么这n组线性变换的结果就是将m维空间中的基向量 u i u_iui ,沿着自身的方向延长 σ i \sigma_iσi 倍。
我们可以将上面得到的结果写成:
A V = σ U A [ v 1 v 2 v 3 ⋯ v n ] = [ u 1 u 2 u 3 ⋯ u n ] [ σ 1 0 ⋯ 0 σ 2 ⋮ ⋯ σ n ] AV=\sigma U\\ A
[v1v2v3⋯vn][v1v2v3⋯vn]
=
[u1u2u3⋯un][u1u2u3⋯un]
⎡⎣⎢⎢σ10⋮0σ2⋯⋯σn⎤⎦⎥⎥[σ10⋯0σ2⋮⋯σn]
AV=σUA[v1v2v3⋯vn]=[u1u2u3⋯un]⎣⎢⎡σ10⋮0σ2⋯⋯σn⎦⎥⎤
但是我们上面说到m是大于n的,所以说 u n + 1 , . . . u m u_{n+1},...u_mun+1,...um 这些还没有添加进去,所以将这些添加到矩阵U的右侧,然后再 σ \sigmaσ 矩阵的下面全部补0,使维度符合要求,那么此时的 σ \sigmaσ 矩阵就变成了m*n,我们最终得到的就是:
A V = U Σ AV=U\SigmaAV=UΣ
因为我们之前讲过由于矩阵V的各列是标准正交的特征向量,所以满足等式 V − 1 = V T V^{-1}=V^TV−1=VT ,所以上面的式子可以变成 :
A = U Σ V T A=U\Sigma V^TA=UΣVT
这就是我们最终需要的分解式子,任何形状的矩阵A都可以利用该式子进行分解。
- A:m*n
- U:m*m
- Σ \SigmaΣ :m*n
- V T V^TVT :n*n
其中U矩阵是对应m个m维的标准正交向量,而 V T V^TVT 则对应着 n个n维的标准正交向量,Σ \SigmaΣ 是一个m行n列的对角矩阵。
此时的问题就是,我们已经找到了一种方程形式进行矩阵A的分解,那么我们 U 、 V 、 Σ U、V、\SigmaU、V、Σ 分别对应什么呢?
接下来就讲讲如果获得等式右边的内容。
2.矩阵分解
对于该式子的结论非常好,同时也给我们指明了如何寻找其解,就是原n维空间找到n组标准正交向量,和目标m维空间找到m组标准正交向量,那具体怎么找呢?接下来进行讲解
A = U Σ V T A=U\Sigma V^TA=UΣVT
我们利用矩阵转置这条性质,将矩阵A进行转置,得到:
A T = ( U Σ V T ) T = V Σ T U T A^T=(U\Sigma V^T)^T=V\Sigma^TU^TAT=(UΣVT)T=VΣTUT
我们此时将两个矩阵进行乘法操作,会得到两个式子:
A A T = U Σ V T ( V Σ T U T ) = U Σ 2 U T AA^T=U\Sigma V^T(V\Sigma^TU^T)=U\Sigma^2U^TAAT=UΣVT(VΣTUT)=UΣ2UT
A T A = ( V Σ T U T ) U Σ V T = V Σ 2 V T A^TA=(V\Sigma^TU^T)U\Sigma V^T=V\Sigma^2V^TATA=(VΣTUT)UΣVT=VΣ2VT
由于任何矩阵乘以自身的转置之后得到的都是对称矩阵,所以可以对角化进行分解,那么就可以轻松的获得矩阵 U 和 V U和VU和V ,它们分别对应着两个对称矩阵的分解特征向量,而且 Σ \SigmaΣ 对角线上的元素就是我们对应特征值的开根号,由于矩阵的秩为r,所以 Σ \SigmaΣ 对角线上的非0特征值分别为:λ 1 , λ 2 , . . . , λ r \sqrt{\lambda_1},\sqrt{\lambda_2},...,\sqrt{\lambda_r}λ1,λ2,...,λr
3.将结果进行降维
我们现在已经可以将原来的矩阵进行分解,那么如果进行降维操作呢?
SVD对应的降维方式主要有三种:
- 行压缩数据降维
- 列压缩数据降维
- 矩阵整体压缩数据降维
下面分别讲述下三种降维方式:
3.1 行压缩数据降维
从矩阵分解的式子出发,将式子两端分别左乘 U T U^TUT ,就变成了 U T A = Σ V T U^TA=\Sigma V^TUTA=ΣVT,那么就会得到下方的式子:
我们之前讲过特征值分解,是将原矩阵A左乘P,得到了行之间线性无关的特征,那么此时的U和当时的P的求法是一样的,所以我们此时的行与行之间也是线性无关的。
那么此时如果将行看作特征,列看作样本,那么就可以从矩阵U中按照要求提取k个特征向量,变成k行m列,然后做成原数据Am行n列,就会得到结果k行n列,从而实现降维的效果,这里m代表特征,n代表样本数。
3.2 列压缩数据降维
其实列压缩和行数据压缩同理,将上式右乘矩阵V得到:A V = U Σ AV=U\SigmaAV=UΣ ,进而得到下式:
它与行压缩相反,此时得到的是列与列线性无关,此时的m代表样本数,n代表特征,那么我们将V矩阵提取k个向量,形成k行n列,左乘原数据样本n行m列,得到结果k行m列,进而达到降维效果。
3.3 矩阵整体压缩数据降维
对数据总体进行压缩,是从一个新的角度去看待,可以理解为贡献率的问题,我们可以将原来的A分解为多个相同形状的矩阵,然后进行按照权重进行叠加。
将其进行展开获得:
A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + . . . + σ r u r v r T A=\sigma_1u_1v_1^T+\sigma_2u_2v_2^T+...+\sigma_ru_rv_r^TA=σ1u1v1T+σ2u2v2T+...+σrurvrT
其中 σ 1 u 1 v 1 T \sigma_1u_1v_1^Tσ1u1v1T 为一个m行n列的矩阵,前面的 σ \sigmaσ 代表每个矩阵的权重,我们会从r个这样的矩阵中挑去权重大的矩阵进行叠加。
这样就可以理解为每个矩阵片段的重要性,按照 σ 1 > σ 2 > σ 3 \sigma_1>\sigma_2>\sigma_3σ1>σ2>σ3 的方式选取对应权重大的矩阵片段。
那么A就可以近似为:
A ≈ σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + . . . + σ k u k v k T A\approx\sigma_1u_1v_1^T+\sigma_2u_2v_2^T+...+\sigma_ku_kv_k^TA≈σ1u1v1T+σ2u2v2T+...+σkukvkT