SVD奇異值分解

前言

之前的博客:特徵值和特徵向量,討論了矩陣的特徵分解相關的概念。公式如下所示:

(1)A=WΣWT

但是特徵分解有一個限制條件,即A 必須是方陣,如果不是方陣則上式就不能使用了。爲了在A 矩陣不是方陣時,即行列數不等時,也能分解矩陣的特徵,就要用到SVD了。

定義

SVD的作用也是對矩陣進行分解,但是與特徵分解不同,SVD 不要求待分解的矩陣必須是方陣。

假設給定了某一個矩陣A ,其維度是m×n 。那麼,定義SVD爲如下式:

(2)A=UΣVT

其中,U 是一個m×m 的矩陣,Σ 是一個m×n 的矩陣,V 是一個n×n 的矩陣。Σ 中,除了對角線上的元素之外,其餘元素的值都爲0,主對角線上的每個元素都被稱爲奇異值。另外,UV 都是經過標準化之後的,即滿足:UTU=IVTV=I

求解SVD過程

求解SVD的過程可以分解爲,分別求解U,Σ,V 的過程。

A 的轉置與A 作矩陣乘法,那麼會得到n×n 的方陣ATA 。這樣就可以對ATA 作特徵分解了,求得的特徵值與特徵向量滿足下式:

(3)(ATA)vj=λjvj

得到了ATAn 個特徵值λj 以及對應的n 個特徵向量vj 。將這n 個特徵向量vj 組合成一個n×n 的矩陣V ,就得到了SVD公式裏面的矩陣V 了。通常,稱V 中的特徵向量vj 爲右奇異向量。

AA 的轉置作矩陣乘法,則會得到m×m 的方陣AAT 。接着可以對AAT 作特徵分解,求出特徵值與特徵向量滿足下式:

(4)(AAT)ui=λui

得到了AATn 個特徵值λi 以及對應的n 個特徵向量ui 。將這n 個特徵向量ui 組合成一個m×m 的矩陣U ,就得到了SVD公式裏面的矩陣U 了。通常,稱U 中的特徵向量ui 爲左奇異向量。

已經求到了UV 了,還剩下Σ 。注意到,Σ 除了對角線上是奇異值之外,其餘位置都是0,那麼只需要求出每個奇異值σi 就k了。

注意到:

(5)A=UΣVTAV=UΣVTVAV=UΣAvk=σkukσk=Avkuk

套用上式,即可求出每個奇異值σk ,得到奇異值矩陣Σ

再簡要證明一下,方陣A A^T的特徵向量組成的矩陣就是SVD中的U 矩陣,而方陣A A^T的特徵向量組成的矩陣就是SVD中的V 矩陣。

(6){A=UΣVTAT=VΣTUT{ATA=VΣTUTUΣVT=VΣTΣVTAAT=UΣVTVΣTUT=UΣΣTUT

推導時用到了UTU=IVTV=I 。注意到ΣTΣ 的維數爲n×nΣΣT 的維數爲m×m ,由於奇異值矩陣Σ 只有對角線上有元素,其餘位置都是0,所以很容易證明ΣTΣΣΣT 也是奇異值矩陣。不難看出AATATA 的特徵向量組成的矩陣分別是SVD中UV 矩陣了吧!

不難看出ΣTΣΣΣT 的特徵值矩陣等於奇異值矩陣Σ 的平方。即有下式關係:

(7)σk=λk

我們可以通過求解σij=Avjui 來計算奇異值,也可以通過求出AAT 或的ATA 特徵值開平方根得到奇異值。

計算舉例

對矩陣A 作奇異值分解:

A=[101101]

求出AT

AT=[110011]

接着可以求出AATATA

{AAT=[110121011]ATA=[2112]

先求出AAT 的特徵值和特徵向量:(注,將λ 按照從大到小的順序標號)

手算是套用公式Det(AATλI)=0 求出特徵值與特徵矩陣,這裏直接用matlab的eig函數求出結果了。

png

λ1=3u1=[0.40820.81650.4082]λ2=1u2=[0.707100.7071]λ3=0u3=[0.57740.57740.5774]

再求出ATA 的特徵值和特徵向量:(求解方法同上,省略)

λ1=3v1=[0.70710.7071]λ2=1v2=[0.70710.7071]

套用公式σk=Avkuk,k=1,2 求解奇異值:

σ1[0.40820.81650.4082]=[101101][0.70710.7071]σ1=1.732

σ2=[0.707100.7071]=[101101][0.70710.7071]σ2=1

當然也可以直接使用σk=λk 求出奇異值,AATATA 的特徵值都爲310 沒有意義,所以不討論),所以奇異值分別爲31 ,這樣計算更簡單。

最終得到的奇異值分解爲:

A=UΣVT=[0.40820.70710.57740.816500.57740.40820.70710.5774][1.73200100][0.70710.70710.70710.7071]

SVD的性質

對於奇異值,它與特徵分解中的特徵值類似。在奇異值矩陣Σ 中,奇異值是按照從大到小排列,而奇異值減小的也十分快,通常前面的10%的奇異值就佔掉了所有奇異值之和的90%以上。因此,我們可以使用最大的k 個奇異值和對應的左右奇異向量來近似表示矩陣,如下式所示:

(8)A(m×n)=U(m×m)Σ(m×n)V(n×n)TU(m×k)Σ(k×k)V(k×n)T

上式中的下標表示那個矩陣的維數。

如果k 是一個較小的數,而n 是一個較大的數,SVD的作用就體現出來了,因爲一個較大的矩陣A 可以用三個較小的矩陣U(m×k),Σ(k×k),V(k×n)T 來表示。

由於這個特殊的性質,SVD可以用於PCA降維等,來壓縮數據和去噪。

參考資料:

1、https://www.cnblogs.com/pinard/p/6251584.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章