奇異值分解(Singular Value Decomposition)是線性代數中一種重要的矩陣分解(Matrix Decomposition),奇異值分解則是特徵分解在任意矩陣上的推廣。在信號處理、統計學等領域有重要應用。這篇文章主要說下奇異值分解,這個方法在機器學習的一些算法裏佔有重要地位。
一、相關概念
1.1、正交矩陣
如果一個矩陣滿足以下幾個條件,則此矩陣就是正交矩陣:
- 是一個方陣
- 和自己的轉置矩陣的矩陣乘積 = 單位矩陣E,即是:AAT=ATA=E ,其中E爲單位矩陣。
如果A爲一個正交矩陣,則A滿足以下條件:
- A的轉置矩陣也是正交矩陣
- AAT=ATA=E(其中E爲單位矩陣)
- A的各行是單位向量且兩兩正交
- A的各列是單位向量且兩兩正交
- ∣A∣=1或−1
- AT=A−1,A的轉置矩陣等於A的逆矩陣
1.2、正定矩陣
如果對於所有的非零實係數向量z,都有zTAz>0,則稱矩陣 A是正定的。正定矩陣的行列式必然大於 0, 所有特徵值也必然 大於0。相對應的,半正定矩陣的行列式必然 大於等於0。對於n階實對稱矩陣A,下列條件是等價的:
- A是正定矩陣;
- A的一切順序主子式均爲正;
- A的一切主子式均爲正;
- A的特徵值均爲正;
- 存在實可逆矩陣C,使A=C′C;
- 存在秩爲n的m×n實矩陣B,使A=B′B;
- 存在主對角線元素全爲正的實三角矩陣R,使A=R′R
根據正定矩陣的定義及性質,判別對稱矩陣A的正定性有兩種方法:
- 求出A的所有特徵值。若A的特徵值均爲正數,則A是正定的;若A的特徵值均爲負數,則A爲負定的。
- 計算A的各階順序主子式。若A的各階順序主子式均大於零,則A是正定的;若A的各階順序主子式中,奇數階主子式爲負,偶數階爲正,則A爲負定的。
例: 判斷矩陣是否正定
Q=⎩⎨⎧6−31−320104⎭⎬⎫
解:對稱矩陣Q的三個順序主子式依次爲 :
∣6∣=6>0∣∣∣∣6−3−32∣∣∣∣=3>0∣∣∣∣∣∣6−31−320004∣∣∣∣∣∣=10>0
矩陣Q是正定的
二、特徵值分解(EVD)
- 實對稱矩陣
在理角奇異值分解之前,需要先回顧一下特徵值分解,如果矩陣A是一個m×m的實對稱矩陣(即A=AT),那麼它可以被分解成如下的形式。
A=QΣQT=Q⎣⎢⎢⎡λ1⋯…⋯⋯λ2…⋯⋯⋯⋱⋯⋯⋯…λm⎦⎥⎥⎤QT(1)
其中Q爲標準正交陣,即有QQT=E,Σ爲對角矩陣,且上面的矩陣的維度均爲m×m。λi稱爲特徵值,qi是Q(特徵矩陣)中的列向量,稱爲特徵向量。
注意:E在這裏表示單位陣,式(1−1)的具體求解過程就不多敘述了,可以回憶一下大學時的線性代數。簡單地有如下關係:Aqi=λiqi,qiTqj=1(i̸=j)。
上面的特徵值分解,對矩陣有着較高的要求,它需要被分解的矩陣A爲實對稱矩陣,但是現實中,我們所遇到的問題一般不是實對稱矩陣。那麼當我們碰到一般性的矩陣,即有一個m×n的矩陣A,它是否能被分解成上面的式(1)的形式呢?當然是可以的,這就是我們下面要討論的內容。
三、奇異值分解(SVD)
3.1、奇異值分解定義
有一個m×n的實數矩陣A,我們想要把它分解成如下的形式
A=UΣVT(2)
其中U和V均爲單位正交陣,即有UUT=E和VVT=E, U稱爲左奇異矩陣,V稱爲右奇異矩陣,Σ僅在主對角線上有值,我們稱它爲奇異值。其它元素均爲0。上面矩陣的維度分別爲 U∈Rm×m, Σ∈Rm×n, V∈Rn×n。一般地Σ有如下形式:
Σ=⎣⎢⎢⎡σ10000σ20000⋱0000⋱0000⎦⎥⎥⎤m×n
對於奇異值分解,我們可以利用上面的圖形象表示,圖中方塊的顏色表示值的大小,顏色越淺,值越大。對於奇異值矩陣Σ,只有其主對角線有奇異值,其餘均爲0。
3.2、奇異值求解
正常求上面的 U,V,Σ 不便於求,我們可以利用如下性質:
AAT ATA=UΣVTVΣTUT=UΣΣTUT=VΣTUTUΣVT=VΣTΣVT(3,4)
注意:需要指出的是,這裏ΣΣT與ΣTΣ 在矩陣的角度上來講,它們是不相等的,因爲它們的維數不同ΣΣT∈Rm×m,而ΣTΣ∈Rn×n,但是它們在主對角線的奇異值是相等的,即有:
ΣΣT=⎣⎢⎢⎡σ120000σ220000⋱0000⋱⎦⎥⎥⎤mxmΣTΣ=⎣⎢⎢⎡σ120000σ220000⋱0000⋱⎦⎥⎥⎤n×n
可以看到式(3)與式(1)的形式非常相同,進一步分析,我們可以發現AAT和ATA也是對稱矩陣,那麼可以利用式(1),做特徵值分解。利用式(3)特徵值分解,得到的特徵矩陣即爲U;利用式(4)特徵值分解,得到的特徵矩陣即爲V;對ΣΣT或ΣTΣ中的特徵值開方,可以得到所有的奇異值。
四、奇異值分解應用
4.1、純數學例子
假設我們現在有矩陣A,需要對其做奇異值分解,已知:
A=⎝⎜⎜⎛21004300⎠⎟⎟⎞
那麼可以求出AAT,如下:
AAT=⎝⎜⎜⎛20140014100000000000⎠⎟⎟⎞(5)
接下來就是求這個矩陣的特徵值和特徵向量了:
AATx=λx(AAT−λE)x=0(6)
要想該方程組有非零解(即非零特徵值),那麼係數矩陣AAT−λE的行列式必須爲0
∣∣∣∣∣∣∣∣20−λ14001410−λ0000−λ0000−λ∣∣∣∣∣∣∣∣=0(7)
求解這個行列式我就不再贅述了,這個直接使用行列式展開定理就可以了,可以得到 λ1≈29.86606875,λ2≈0.13393125,λ3=λ4=0;有 4 個特徵值,因爲特徵多項式∣AAT−λE∣是一個 4 次多項式。對應的單位化過的特徵向量爲
⎝⎜⎜⎛0.817415560.5760484400−0.576048440.817415560000100001⎠⎟⎟⎞(8)
這就是矩陣 U 了。 同樣的過程求解ATA 的特徵值和特徵向量,求得λ1≈0.13393125,λ2≈29.86606875,將特徵值降序排列後對應的單位化過的特徵向量爲:
(0.40453580.9145143−0.91451430.40455358)(9)
這就是矩陣V了。 而矩陣 Σ 根據上面說的爲特徵值的平方根構成的對角矩陣:
⎝⎜⎜⎛5.464985700000.3659661900⎠⎟⎟⎞(10)
到此,SVD 分解就結束了,原來的矩陣 A 就被分解成了 3 個矩陣的乘積。
A4×2=U4×4Σ4×2V2×2T(11)
⎝⎜⎜⎛21004300⎠⎟⎟⎞=⎝⎜⎜⎛0.817415560.5760484400−0.576048440.817415560000100001⎠⎟⎟⎞⎝⎜⎜⎛5.464985700000.3659661900⎠⎟⎟⎞(0.404533580.9145143−0.91451430.40455358)T(12)
4.2、Numpy 實現
使用pyhon中的numpy 包的 linalg.svd() 來求解 SVD。分別對上面做特徵值分解,得到如下結果:
import numpy as np
A = np.array([[2, 4], [1, 3], [0, 0], [0, 0]])
print(np.linalg.svd(A))
zhangkf@john:~$ python svd.py
(array([[-0.81741556, -0.57604844, 0. , 0. ],
[-0.57604844, 0.81741556, 0. , 0. ],
[ 0. , 0. , 1. , 0. ],
[ 0. , 0. , 0. , 1. ]]),
array([5.4649857 , 0.36596619]),
array([[-0.40455358, -0.9145143 ],
[-0.9145143 , 0.40455358]]))
最後感謝以下作者的博客:
- https://www.cnblogs.com/endlesscoding/p/10033527.html
- https://blog.csdn.net/u010099080/article/details/68060274
- https://blog.csdn.net/asd136912/article/details/79146151
- https://blog.csdn.net/u012421852/article/details/80475497