前面咱們講了 QR 分解有一些優良的特性,可是 QR 分解僅僅是對矩陣的行進行操做(左乘一個酉矩陣),能夠獲得列空間。這一小節的 SVD 分解則是將行與列同等看待,既左乘酉矩陣,又右乘酉矩陣,能夠得出更有意思的信息。奇異值分解( SVD, Singular Value Decomposition ) 在計算矩陣的僞逆( pseudoinverse ),最小二乘法最優解,矩陣近似,肯定矩陣的列向量空間,秩以及線性系統的解集空間都有應用。html
對於一個任意的 m×n 的矩陣 A,SVD 將一個矩陣分解爲三個特殊矩陣的乘積, 國外還作了一個視頻——SVD 之歌:python
其中, U 和 是酉矩陣, 是對角線矩陣。注意酉矩陣只是座標的轉換,數據自己分佈的形狀並無改變,而對角矩陣,則是對數據進行了拉伸或者壓縮。因爲 m >=
n,又能夠寫成下面這種 thin SVD 形式:python2.7
考慮 A 是 2×2 的簡單狀況。咱們知道,一個幾何形狀左乘一個矩陣 A 實際上就是將該形狀進行旋轉、對稱、拉伸變換等錯切變換, A 就是所謂的 shear 矩陣。好比能夠將一個圓經過左乘 A 獲得一個旋轉後的橢圓。工具
舉個例子,假設 A 對平面上的一個圓進行變換:spa
若是隻看矩陣 A, 咱們幾乎沒法直觀看到圓是如何變換的。變換前的圓是:3d
C, M, Y, K 分別表示第1、2、3、四象限。左乘 A 矩陣後獲得:code
咱們的問題是,旋轉了多少度?伸縮的方向是多少?最大伸縮比例是多少?視頻
利用這個在線工具對 A 進行 SVD 分解:htm
明顯,咱們看到 A 變換其實是先對圓順時針旋轉 45°(能夠看作是座標軸逆時針宣戰了 45°,主成分方向),再關於 x 軸對稱(第一行乘以 -1), 即左乘 V^T:blog
而後在 x 方向拉伸 3 倍(左乘S):
最後再順時針旋轉 45°,再關於 x 軸對稱(第一行乘以 -1, 兩次對稱操做抵消了), 即左乘 U:
上述繪圖過程的 python 代碼以下:
1 # -*- coding=utf-8 2 #!/usr/bin/python2.7 3 4 from pylab import * 5 6 7 def plotCircle(before, M=matrix([[1, 0], [0, 1]])): 8 '''before: 變換前的矩陣 9 M: 變換矩陣,默認爲單位矩陣 10 返回變換以後的矩陣 11 ''' 12 eclMat = M * before # M 變換 13 eclX = array(eclMat[0]).reshape(-1) 14 eclY = array(eclMat[1]).reshape(-1) 15 axis('equal') 16 axis([-3, 3, -3, 3]) 17 grid(True) 18 plot(eclX[:25], eclY[:25], 'c', linewidth=3) 19 plot(eclX[25:50], eclY[25:50], 'm', linewidth=3) 20 plot(eclX[50:75], eclY[50:75], 'y', linewidth=3) 21 plot(eclX[75:100], eclY[75:100], 'k', linewidth=3) 22 show() 23 return eclMat 24 25 26 ang = linspace(0, 2*pi, 100) 27 28 x = cos(ang) 29 y = sin(ang) 30 cirMat = matrix([x, y]) # 2 × 100 的圓圈矩陣 31 32 # 畫最開始的圖形——圓 33 plotCircle(cirMat) 34 35 # 畫變換以後的橢圓 36 M = matrix([[2, 1], [1, 2]]) # 2 × 2 的變換矩陣 37 clMat = plotCircle(cirMat, M) 38 39 # 將 M 矩陣進行 svd 分解 40 U, s, V = np.linalg.svd(M, full_matrices=True) 41 S = np.diag(s) 42 43 # SVD 矩陣對圓的變換 44 plotCircle(cirMat) 45 Tran1 = plotCircle(cirMat, V) 46 Tran2 = plotCircle(Tran1, S) 47 Tran3 = plotCircle(Tran2, U)
假設矩陣 A 的秩是 r, 那麼對角線矩陣的秩也是 r (乘以酉矩陣不會改變矩陣的秩), 咱們假設:
那麼, Ax = 0 的 null space 也就是解空間是什麼呢?答案以下:
矩陣 A 的線性子空間是啥?設想有一個很高的矩陣 A, 它的列向量頗有可能不是正交的。對於任意一個座標 x,矩陣 A 的線性子空間能夠定義爲:
這就是正定矩陣的對角化。計算過程以下:
Lanczos algorithm 是一種迭代的計算方法,沒來得及細看。
感受 SVD 計算水很深,要用到的時候再看,如今暫不深刻了。
主成分分析常常用於減小數據集的維數,同時保持數據集中的對方差貢獻最大的特徵。假設上面的橢圓中(二維空間,兩個座標值)均勻分佈了很是多的點,如何在一維空間(一個座標值)裏面就能最大程度將這些點區分開來呢?這時候就要用到 PCA:
能夠看到,上圖中將全部的點投影到 +45° 直線上,將二維空間映射到一維空間,能夠最大程度地區分開這些點,即投影后的樣本分佈方差最大,這個方向就是 v1 向量的方向。就上圖來講,假設 100×2 的矩陣 X 表示樣本點在平面上的座標,將這些點投影到 v1 上保留最大的樣本方差:
這樣,就將 100 個 2 維空間的樣本點壓縮爲 100 個 1 維空間的樣本點,這裏的列壓縮其實是對特徵進行了壓縮, 而不是簡單地丟棄。PCA 是否是隻能在樣本點個數大於特徵個數的時候才能壓縮呢?例如,如今 3 個 100 維特徵的樣本用 100×3 的矩陣表示,用 SVD 分解後能夠獲得三個矩陣的乘積,作以下變換:
一樣也最大限度保留了主成分。
總結起來,一個矩陣 A, 若是想對行進行壓縮並保留主成分,那麼左乘 u1', 若是相對列進行壓縮並保留主成分(讓我聯想起了稀疏表示),那麼右乘 v1。
固然,上面是簡單的保留第一個主成分,PCA的所有工做簡單點說,就是對原始的空間中順序地找一組相互正交的座標軸,第一個軸是使得方差最大的,第二個軸是在與第一個軸正交的平面中使得方差最大的,第三個軸是在與第一、2個軸正交的平面中方差最大的,這樣假設在N維空間中,咱們能夠找到N個這樣的座標軸,咱們取前r個去近似這個空間,這樣就從一個N維的空間壓縮到r維的空間了,可是咱們選擇的r個座標軸可以使得空間的壓縮使得數據的損失最小。
想法和 QR 分解的辦法相似,主要是利用酉矩陣變換的長度不變性:
獲得最優解是: