奇异值分解(SVD)原理及实例分析

【尊重原创,转载请注明出处】https://blog.****.net/zpalyq110/article/details/86751064

1. 简介

奇异值分解(Singular Value Decomposition,简称SVD)是在机器学习领域广泛应用的算法,它不仅可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。本文通过分析原理,推导公式,以及具体实例演示来总结一下SVD。
必备线性代数基础:

  1. 方阵:行数等于列数的矩阵
  2. 对角阵:只有对角线上有非0元素的矩阵
  3. 对称阵:元素以主对角线为对称轴对应相等的矩阵,总能相似对角化,其不同特征值对应的特征向量两两正交
  4. 正交阵:满足AAT=EAA^T=E或者ATA=EA^T A=E的n阶方阵A,其中E为n阶单位阵。满足性质AT=A1A^T = A^{-1},任意两向量点乘等于0,即(xixj)=0(x_i · x_j)=0,同一向量点乘等于1,即(xixi)=xi2=1(x_i·x_i) = |x_i|^2 = 1.
  5. 任意矩阵AAATAA^TA为对称阵

2. 特征值分解(EVD-eigenvalue decomposition)

2.1 特征值和特征向量

AA是n阶矩阵,λ是一个数,若存在n维非零向量x,使得
Ax=λx (x0)Ax = λx (x≠0)则称λ是A的特征值,x是A的对应于λ的特征向量。
一个矩阵通常可以由其特征值和特征向量完全描述,那特征向量是在方向不变的条件下简单地乘以一个缩放因子的非零向量,特征向量对应的特征值是它所乘的那个缩放因子。

2.2 特征值分解

既然我们知道一个矩阵是可以通过特征值和特征向量来表示,那假设存在一个n×n的满秩对称矩阵A,我们便可以通过特征值将A分解。
首先求出A的n个特征值λ1,λ2 ...,λn\lambda_1, \lambda_2 \, ... , \lambda_n以及对应的特征向量(此处指标准化处理后)x1,x2,...xnx_1,x_2,...x_nAx1=λ1x1Ax_1 = \lambda_1x_1Ax2=λ2x2Ax_2 = \lambda_2x_2............Axn=λnxnAx_n = \lambda_nx_n此时我们用UU表示特征向量组成的矩阵AU=UΛAU = U\Lambda U=[x1,x2,...,xn]U=[x_1, x_2,...,x_n]Λ=[λ1λ2λ3]\Lambda=\begin{bmatrix} \lambda_1 & & \\ & \lambda_2 & \\ & & \lambda_3 \end{bmatrix}这里重点说一下UU,因为UU是对称阵的特征向量,所以内部两两向量是正交,并且刚才标准化处理过,此时UU就成了正交阵,根据前面提到的性质,UT=U1U^T=U^{-1},即A=UΛU1=UΛUTA= U\Lambda U^{-1}= U\Lambda U^T
到此,特征值分解过程结束。

3. 奇异值分解(SVD-singular value decomposition)

在特征值分解时,A是n×n的满秩对称矩阵,那如果是一个m×n的普通矩阵呢?这时再想分解矩阵A,就需要SVD了。
此时的A只是一个m×n的普通矩阵,但是ATAA^TA呢?没错ATAA^TA是对称阵!所以我们又可以根据EVD的来分解ATAA^TA了!
(刚刚在第2部分中关于A的强假设是为了在此处伏笔,其实对于特征值分解A没必要是对称阵。)
首先求出ATAA^TA的n个特征值λ1,λ2 ...,λn\lambda_1, \lambda_2 \, ... , \lambda_n以及对应的特征向量(此处指标准化处理后)x1,x2,...xnx_1,x_2,...x_nATAx1=λ1x1A^TAx_1 = \lambda_1x_1ATAx2=λ2x2A^TAx_2 = \lambda_2x_2............ATAxn=λnxnA^TAx_n = \lambda_nx_n此时我们用VV表示特征向量组成的矩阵ATAV=VΛA^TAV = V\Lambda V=[x1,x2,...,xn]V=[x_1, x_2,...,x_n]Λ=[λ1λ2λ3]\Lambda=\begin{bmatrix} \lambda_1 & & \\ & \lambda_2 & \\ & & \lambda_3 \end{bmatrix}ATA=VΛVTA^TA =V\Lambda V^T此时VV是正交阵,任取两个特征向量xi,xjx_i, x_j可得(xixj)=0(x_i·x_j) = 0(xixi)=1(x_i·x_i) = 1
下面我们来探究一下AVAV是不是正交阵?
满足正交阵第一个条件,两两向量正交:
AviAvj=(Avi)TAvj=viTATAvj=viTλjvj=λjvivj=0Av_i·Av_j = (Av_i)^TAv_j=v_i^TA^TAv_j=v_i^T\lambda _jv_j=\lambda _jv_i·v_j=0
第二个条件,各个向量为单位长度:
AviAvi=λivivi=λiAv_i·Av_i = \lambda _iv_i·v_i=\lambda _iAvi2=λi|Av_i|^2 = \lambda _i去单位向量:AviAvi=Avi1λi=ui\frac{Av_i}{|Av_i|}=Av_i \frac{1}{\sqrt{\lambda _i}}=u_iλi=σi\sqrt{\lambda _i}= \sigma_iAvi=uiσiAv_i=u_i\sigma_iii去掉,写成集合此时A的奇异值分解:A=UΣVTA=U\Sigma V^T个人理解:特征值分解是在一个标准正交基里面进行分解,而奇异值分解是通过两个标准正交基进行分解。

4. 实例操作

4.1 计算方法以及证明

首先分析A=UΣVTA=U\Sigma V^T中的结构组成,Am×n,Um×m,Σm×n,Vn×nTA_{m×n},U_{m×m},\Sigma_{m×n},V^T_{n×n}
然后根据上一部分的公式推倒,VV就是ATAA^TA的特征向量,同理UU就是AATAA^T的特征向量,所以想要得到VUV和U就得计算ATAAATA^TA和AA^T的特征向量,而Σ\Sigma通过任意一组计算即可,计算时你会发现两组特征值重叠。
下面证明一下VV就是ATAA^TA的特征向量,UU就是AATAA^T的特征向量。
A=UΣVTA=U\Sigma V^T AT=VΣTUT A^T=V\Sigma^T U^T ATA=VΣTUTUΣVT=VΣ2VT=VΛVT A^TA = V\Sigma^T U^TU\Sigma V^T = V\Sigma^2V^T = V\Lambda V^T可以仔细对比一下第3部分公式的符号,研究下为什么 Σ2=Λ\Sigma^2=\Lambda
此时证明完毕,VV就是ATAA^TA的特征向量,同理UU就是AATAA^T的特征向量。

4. 实例计算

分解矩阵AA,其定义如下:A=(102101)\mathbf{A} = \left( \begin{array}{ccc} 1& 0\\ 2& 1\\ 0& 1 \end{array} \right)首先计算ATAAATA^TA和AA^T ATA=(120011)(102101)=(5222)\mathbf{A^TA} = \left( \begin{array}{ccc} 1& 2 &0\\ 0&1& 1 \end{array} \right) \left( \begin{array}{ccc} 1& 0\\ 2& 1\\ 0& 1 \end{array} \right) = \left( \begin{array}{ccc} 5& 2 \\ 2& 2 \end{array} \right)AAT=(102101)(120011)=(120251011)\mathbf{AA^T} = \left( \begin{array}{ccc} 1& 0\\ 2& 1\\ 0& 1 \end{array} \right) \left( \begin{array}{ccc} 1& 2 &0\\ 0&1& 1 \end{array} \right) = \left( \begin{array}{ccc} 1& 2 & 0\\ 2& 5 & 1\\ 0& 1& 1 \end{array} \right)计算ATAA^TA的特征值和特征向量λ1=6;v1=(2/51/5);λ2=1;v2=(1/52/5)\lambda_1= 6; v_1 = \left( \begin{array}{ccc} 2/\sqrt{5} \\ 1/\sqrt{5} \end{array} \right); \lambda_2= 1; v_2 = \left( \begin{array}{ccc} -1/\sqrt{5} \\ 2/\sqrt{5} \end{array} \right)计算AATAA^T的特征值和特征向量λ1=6;u1=(2/305/301/30);λ2=1;u2=(1/502/5);λ3=0;u3=(2/61/61/6)\lambda_1= 6; u_1 = \left( \begin{array}{ccc} 2/\sqrt{30} \\ 5/\sqrt{30} \\ 1/\sqrt{30} \end{array} \right); \lambda_2= 1; u_2 = \left( \begin{array}{ccc} 1/\sqrt{5} \\ 0 \\ -2/\sqrt{5} \end{array} \right); \lambda_3= 0; u_3 = \left( \begin{array}{ccc} 2/\sqrt{6} \\ 1/\sqrt{6} \\ -1/\sqrt{6} \end{array} \right)计算奇异值:σ1=λ1=6\sigma_1 = \sqrt{\lambda_1}=\sqrt 6σ2=λ2=1\sigma_2 = \sqrt{\lambda_2}=1最终得到A的奇异值分解:A=UΣVT=(2/301/52/65/3001/61/302/51/6)(600100)(2/51/51/52/5)A=U\Sigma V^T = \left( \begin{array}{ccc} 2/\sqrt{30} & 1/\sqrt{5} & 2/\sqrt{6} \\ 5/\sqrt{30} & 0 & 1/\sqrt{6}\\ 1/\sqrt{30} & -2/\sqrt{5} & -1/\sqrt{6} \end{array} \right) \left( \begin{array}{ccc} \sqrt{6} & 0 \\ 0 & 1\\ 0 & 0 \end{array} \right) \left( \begin{array}{ccc} 2/\sqrt{5} & -1/\sqrt{5} \\ 1/\sqrt{5} & 2/\sqrt{5} \end{array} \right)

5. 应用

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:Am×n=Um×mΣm×nVn×nTUm×kΣk×kVk×nTA_{m \times n} = U_{m \times m}\Sigma_{m \times n} V^T_{n \times n} \approx U_{m \times k}\Sigma_{k \times k} V^T_{k \times n}
如图所示:奇异值分解(SVD)原理及实例分析
在矩阵AA非常巨大系数的时候,我们可以利用SVD取前K个终于的特征值进行存储,应用场景:PCA降维,推荐系统,NLP隐含语义分析等等。

推荐资料

  1. SVD paper
  2. 几何角度看SVD