前言
之前的博客:特征值和特征向量,讨论了矩阵的特征分解相关的概念。公式如下所示:
但是特征分解有一个限制条件,即 A A 必须是方阵,如果不是方阵则上式就不能使用了。为了在矩阵不是方阵时,即行列数不等时,也能分解矩阵的特征,就要用到SVD了。
定义
SVD的作用也是对矩阵进行分解,但是与特征分解不同,SVD 不要求待分解的矩阵必须是方阵。
假设给定了某一个矩阵 A A ,其维度是。那么,定义SVD为如下式:
其中, U U 是一个的矩阵, Σ Σ 是一个 m×n m × n 的矩阵, V V 是一个的矩阵。 Σ Σ 中,除了对角线上的元素之外,其余元素的值都为0,主对角线上的每个元素都被称为奇异值。另外, U U 和都是经过标准化之后的,即满足: UTU=I U T U = I 、 VTV=I V T V = I 。
求解SVD过程
求解SVD的过程可以分解为,分别求解 U,Σ,V U , Σ , V 的过程。
将 A A 的转置与作矩阵乘法,那么会得到 n×n n × n 的方阵 ATA A T A 。这样就可以对 ATA A T A 作特征分解了,求得的特征值与特征向量满足下式:
得到了 ATA A T A 的 n n 个特征值以及对应的 n n 个特征向量。将这 n n 个特征向量组合成一个 n×n n × n 的矩阵 V V ,就得到了SVD公式里面的矩阵了。通常,称 V V 中的特征向量为右奇异向量。
将 A A 与的转置作矩阵乘法,则会得到 m×m m × m 的方阵 AAT A A T 。接着可以对 AAT A A T 作特征分解,求出特征值与特征向量满足下式:
得到了 AAT A A T 的 n n 个特征值以及对应的 n n 个特征向量。将这 n n 个特征向量组合成一个 m×m m × m 的矩阵 U U ,就得到了SVD公式里面的矩阵了。通常,称 U U 中的特征向量为左奇异向量。
已经求到了 U U 和了,还剩下 Σ Σ 。注意到, Σ Σ 除了对角线上是奇异值之外,其余位置都是0,那么只需要求出每个奇异值 σi σ i 就k了。
注意到:
套用上式,即可求出每个奇异值 σk σ k ,得到奇异值矩阵 Σ Σ 。
再简要证明一下,方阵A A^T的特征向量组成的矩阵就是SVD中的 U U 矩阵,而方阵A A^T的特征向量组成的矩阵就是SVD中的矩阵。
推导时用到了 UTU=I U T U = I 、 VTV=I V T V = I 。注意到 ΣTΣ Σ T Σ 的维数为 n×n n × n , ΣΣT Σ Σ T 的维数为 m×m m × m ,由于奇异值矩阵 Σ Σ 只有对角线上有元素,其余位置都是0,所以很容易证明 ΣTΣ Σ T Σ 和 ΣΣT Σ Σ T 也是奇异值矩阵。不难看出 AAT A A T 和 ATA A T A 的特征向量组成的矩阵分别是SVD中 U U 和矩阵了吧!
不难看出 ΣTΣ Σ T Σ 和 ΣΣT Σ Σ T 的特征值矩阵等于奇异值矩阵 Σ Σ 的平方。即有下式关系:
我们可以通过求解 σij=Avjui σ i j = A v j u i 来计算奇异值,也可以通过求出 AAT A A T 或的 ATA A T A 特征值开平方根得到奇异值。
计算举例
对矩阵 A A 作奇异值分解:
求出 AT A T :
接着可以求出 AAT A A T 和 ATA A T A :
先求出 AAT A A T 的特征值和特征向量:(注,将 λ λ 按照从大到小的顺序标号)
手算是套用公式 Det(AAT−λI)=0 D e t ( A A T − λ I ) = 0 求出特征值与特征矩阵,这里直接用matlab的eig函数求出结果了。
λ1=3 λ 1 = 3 ; u1=⎡⎣⎢0.40820.81650.4082⎤⎦⎥ u 1 = [ 0.4082 0.8165 0.4082 ] ; λ2=1 λ 2 = 1 ; u2=⎡⎣⎢−0.707100.7071⎤⎦⎥ u 2 = [ − 0.7071 0 0.7071 ] ; λ3=0 λ 3 = 0 ; u3=⎡⎣⎢0.5774−0.57740.5774⎤⎦⎥ u 3 = [ 0.5774 − 0.5774 0.5774 ] ;
再求出 ATA A T A 的特征值和特征向量:(求解方法同上,省略)
λ1=3 λ 1 = 3 ; v1=[0.70710.7071] v 1 = [ 0.7071 0.7071 ] ; λ2=1 λ 2 = 1 ; v2=[−0.70710.7071] v 2 = [ − 0.7071 0.7071 ] ;
套用公式 σk=Avkuk,k=1,2 σ k = A v k u k , k = 1 , 2 求解奇异值:
当然也可以直接使用 σk=λk−−√ σ k = λ k 求出奇异值, AAT A A T 和 ATA A T A 的特征值都为 3 3 和( 0 0 没有意义,所以不讨论),所以奇异值分别为和 1 1 ,这样计算更简单。
最终得到的奇异值分解为:
SVD的性质
对于奇异值,它与特征分解中的特征值类似。在奇异值矩阵 Σ Σ 中,奇异值是按照从大到小排列,而奇异值减小的也十分快,通常前面的10%的奇异值就占掉了所有奇异值之和的90%以上。因此,我们可以使用最大的 k k 个奇异值和对应的左右奇异向量来近似表示矩阵,如下式所示:
上式中的下标表示那个矩阵的维数。
如果 k k 是一个较小的数,而是一个较大的数,SVD的作用就体现出来了,因为一个较大的矩阵 A A 可以用三个较小的矩阵来表示。
由于这个特殊的性质,SVD可以用于PCA降维等,来压缩数据和去噪。
参考资料: