前言
之前的博客:特徵值和特徵向量,討論了矩陣的特徵分解相關的概念。公式如下所示:
A=WΣWT(1)
但是特徵分解有一個限制條件,即A 必須是方陣,如果不是方陣則上式就不能使用了。爲了在A 矩陣不是方陣時,即行列數不等時,也能分解矩陣的特徵,就要用到SVD了。
定義
SVD的作用也是對矩陣進行分解,但是與特徵分解不同,SVD 不要求待分解的矩陣必須是方陣。
假設給定了某一個矩陣A ,其維度是m×n 。那麼,定義SVD爲如下式:
A=UΣVT(2)
其中,U 是一個m×m 的矩陣,Σ 是一個m×n 的矩陣,V 是一個n×n 的矩陣。Σ 中,除了對角線上的元素之外,其餘元素的值都爲0,主對角線上的每個元素都被稱爲奇異值。另外,U 和V 都是經過標準化之後的,即滿足:UTU=I 、VTV=I 。
求解SVD過程
求解SVD的過程可以分解爲,分別求解U,Σ,V 的過程。
將A 的轉置與A 作矩陣乘法,那麼會得到n×n 的方陣ATA 。這樣就可以對ATA 作特徵分解了,求得的特徵值與特徵向量滿足下式:
(ATA)vj=λjvj(3)
得到了ATA 的n 個特徵值λj 以及對應的n 個特徵向量vj 。將這n 個特徵向量vj 組合成一個n×n 的矩陣V ,就得到了SVD公式裏面的矩陣V 了。通常,稱V 中的特徵向量vj 爲右奇異向量。
將A 與A 的轉置作矩陣乘法,則會得到m×m 的方陣AAT 。接着可以對AAT 作特徵分解,求出特徵值與特徵向量滿足下式:
(AAT)ui=λui(4)
得到了AAT 的n 個特徵值λi 以及對應的n 個特徵向量ui 。將這n 個特徵向量ui 組合成一個m×m 的矩陣U ,就得到了SVD公式裏面的矩陣U 了。通常,稱U 中的特徵向量ui 爲左奇異向量。
已經求到了U 和V 了,還剩下Σ 。注意到,Σ 除了對角線上是奇異值之外,其餘位置都是0,那麼只需要求出每個奇異值σi 就k了。
注意到:
A=UΣVT⇒AV=UΣVTV⇒AV=UΣ⇒Avk=σkuk⇒σk=Avkuk(5)
套用上式,即可求出每個奇異值σk ,得到奇異值矩陣Σ 。
再簡要證明一下,方陣A A^T的特徵向量組成的矩陣就是SVD中的U 矩陣,而方陣A A^T的特徵向量組成的矩陣就是SVD中的V 矩陣。
{A=UΣVTAT=VΣTUT⇒{ATA=VΣTUTUΣVT=VΣTΣVTAAT=UΣVTVΣTUT=UΣΣTUT(6)
推導時用到了UTU=I 、VTV=I 。注意到ΣTΣ 的維數爲n×n ,ΣΣT 的維數爲m×m ,由於奇異值矩陣Σ 只有對角線上有元素,其餘位置都是0,所以很容易證明ΣTΣ 和ΣΣT 也是奇異值矩陣。不難看出AAT 和ATA 的特徵向量組成的矩陣分別是SVD中U 和V 矩陣了吧!
不難看出ΣTΣ 和ΣΣT 的特徵值矩陣等於奇異值矩陣Σ 的平方。即有下式關係:
σk=λk−−√(7)
我們可以通過求解σij=Avjui 來計算奇異值,也可以通過求出AAT 或的ATA 特徵值開平方根得到奇異值。
計算舉例
對矩陣A 作奇異值分解:
A=⎡⎣⎢110011⎤⎦⎥
求出AT :
AT=[101101]
接着可以求出AAT 和ATA :
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪AAT=⎡⎣⎢110121011⎤⎦⎥ATA=[2112]
先求出AAT 的特徵值和特徵向量:(注,將λ 按照從大到小的順序標號)
手算是套用公式Det(AAT−λI)=0 求出特徵值與特徵矩陣,這裏直接用matlab的eig函數求出結果了。
λ1=3 ;u1=⎡⎣⎢0.40820.81650.4082⎤⎦⎥ ;λ2=1 ;u2=⎡⎣⎢−0.707100.7071⎤⎦⎥ ;λ3=0 ;u3=⎡⎣⎢0.5774−0.57740.5774⎤⎦⎥ ;
再求出ATA 的特徵值和特徵向量:(求解方法同上,省略)
λ1=3 ;v1=[0.70710.7071] ;λ2=1 ;v2=[−0.70710.7071] ;
套用公式σk=Avkuk,k=1,2 求解奇異值:
σ1⎡⎣⎢0.40820.81650.4082⎤⎦⎥=⎡⎣⎢110011⎤⎦⎥[0.70710.7071]⇒σ1=1.732
σ2=⎡⎣⎢−0.707100.7071⎤⎦⎥=⎡⎣⎢110011⎤⎦⎥[−0.70710.7071]⇒σ2=1
當然也可以直接使用σk=λk−−√ 求出奇異值,AAT 和ATA 的特徵值都爲3 和1 (0 沒有意義,所以不討論),所以奇異值分別爲3–√ 和1 ,這樣計算更簡單。
最終得到的奇異值分解爲:
A=UΣVT=⎡⎣⎢0.40820.81650.4082−0.707100.70710.5774−0.57740.5774⎤⎦⎥⎡⎣⎢1.73200010⎤⎦⎥[0.70710.7071−0.70710.7071]
SVD的性質
對於奇異值,它與特徵分解中的特徵值類似。在奇異值矩陣Σ 中,奇異值是按照從大到小排列,而奇異值減小的也十分快,通常前面的10%的奇異值就佔掉了所有奇異值之和的90%以上。因此,我們可以使用最大的k 個奇異值和對應的左右奇異向量來近似表示矩陣,如下式所示:
A(m×n)=U(m×m)Σ(m×n)VT(n×n)≃U(m×k)Σ(k×k)VT(k×n)(8)
上式中的下標表示那個矩陣的維數。
如果k 是一個較小的數,而n 是一個較大的數,SVD的作用就體現出來了,因爲一個較大的矩陣A 可以用三個較小的矩陣U(m×k),Σ(k×k),VT(k×n) 來表示。
由於這個特殊的性質,SVD可以用於PCA降維等,來壓縮數據和去噪。
參考資料:
1、https://www.cnblogs.com/pinard/p/6251584.html