矩陣論筆記:奇異值分解SVD(Singular Value Decomposition)總結


奇異值分解(Singular Value Decomposition)是線性代數中一種重要的矩陣分解(Matrix Decomposition),奇異值分解則是特徵分解在任意矩陣上的推廣。在信號處理、統計學等領域有重要應用。這篇文章主要說下奇異值分解,這個方法在機器學習的一些算法裏佔有重要地位。

一、相關概念

1.1、正交矩陣

如果一個矩陣滿足以下幾個條件,則此矩陣就是正交矩陣:

  • 是一個方陣
  • 和自己的轉置矩陣的矩陣乘積 = 單位矩陣EE,即是:AAT=ATA=EA A ^ { T } = A ^ { T } A = E ,其中EE爲單位矩陣。

如果A爲一個正交矩陣,則A滿足以下條件:

  • AA的轉置矩陣也是正交矩陣
  • AAT=ATA=EA A ^ { T } = A ^ { T } A = E(其中EE爲單位矩陣)
  • AA的各行是單位向量且兩兩正交
  • AA的各列是單位向量且兩兩正交
  • A=1|A| = 11-1
  • AT=A1A ^ { T } = A ^ { - 1 },A的轉置矩陣等於A的逆矩陣

1.2、正定矩陣

如果對於所有的非零實係數向量zz,都有zTAz>0z ^ { T } A z > 0,則稱矩陣 AA是正定的。正定矩陣的行列式必然大於 0, 所有特徵值也必然 大於0。相對應的,半正定矩陣的行列式必然 大於等於0。對於nn階實對稱矩陣AA,下列條件是等價的:

  • AA是正定矩陣;
  • AA的一切順序主子式均爲正;
  • AA的一切主子式均爲正;
  • AA的特徵值均爲正;
  • 存在實可逆矩陣CC,使A=CCA=C'C
  • 存在秩爲nnm×nm×n實矩陣BB,使A=BBA=B'B
  • 存在主對角線元素全爲正的實三角矩陣RR,使A=RRA=R'R

根據正定矩陣的定義及性質,判別對稱矩陣A的正定性有兩種方法:

  • 求出AA的所有特徵值。若AA的特徵值均爲正數,則AA是正定的;若AA的特徵值均爲負數,則AA爲負定的。
  • 計算AA的各階順序主子式。若AA的各階順序主子式均大於零,則A是正定的;若AA的各階順序主子式中,奇數階主子式爲負,偶數階爲正,則A爲負定的。

例: 判斷矩陣是否正定

Q={631320104}Q=\left\{\begin{array}{ccc}{6} & {-3} & {1} \\ {-3} & {2} & {0} \\ {1} & {0} & {4}\end{array}\right\}
解:對稱矩陣QQ的三個順序主子式依次爲 :
6=6>06332=3>0630320104=10>0\begin{array}{c}{|6|=6>0} \\ {\left| \begin{array}{ccc}{6} & {-3} \\ {-3} & {2}\end{array}\right|=3>0} \\ {\left| \begin{array}{ccc}{6} & {-3} & {0} \\ {-3} & {2} & {0} \\ {1} & {0} & {4}\end{array}\right|=10>0}\end{array}
矩陣QQ是正定的

二、特徵值分解(EVD)

  • 實對稱矩陣
    在理角奇異值分解之前,需要先回顧一下特徵值分解,如果矩陣AA是一個m×mm×m的實對稱矩陣(即A=ATA = A^T),那麼它可以被分解成如下的形式。
    (1)A=QΣQT=Q[λ1λ2λm]QTA=Q \Sigma Q^{T}=Q \left[ \begin{array}{cccc}{\lambda_{1}} & {\cdots} & {\cdots} & {\cdots} \\ {\cdots} & {\lambda_{2}} & {\cdots} & {\cdots} \\ {\ldots} & {\ldots} & {\ddots} & {\ldots} \\ {\cdots} & {\cdots} & {\cdots} & {\lambda_{m}}\end{array}\right] Q^{T} \tag{1}
    其中QQ爲標準正交陣,即有QQT=EQQ^T = EΣΣ爲對角矩陣,且上面的矩陣的維度均爲m×mm×mλi\lambda_i稱爲特徵值,qiq_iQQ(特徵矩陣)中的列向量,稱爲特徵向量。

注意EE在這裏表示單位陣,式11(1-1)的具體求解過程就不多敘述了,可以回憶一下大學時的線性代數。簡單地有如下關係:Aqi=λiqi,qiTqj=1(ij)Aq_i = \lambda_i q_i, \quad q_i^T q_j = 1(i \ne j)

  • 一般矩陣

上面的特徵值分解,對矩陣有着較高的要求,它需要被分解的矩陣AA爲實對稱矩陣,但是現實中,我們所遇到的問題一般不是實對稱矩陣。那麼當我們碰到一般性的矩陣,即有一個m×nm×n的矩陣A,它是否能被分解成上面的式1(1)的形式呢?當然是可以的,這就是我們下面要討論的內容。

三、奇異值分解(SVD)

3.1、奇異值分解定義

有一個m×nm×n的實數矩陣AA,我們想要把它分解成如下的形式
(2)A=UΣVTA=U \Sigma V^{T} \tag{2}
其中UUVV均爲單位正交陣,即有UUT=EUU^T=EVVT=EVV^T=E, UU稱爲左奇異矩陣VV稱爲右奇異矩陣ΣΣ僅在主對角線上有值,我們稱它爲奇異值。其它元素均爲0。上面矩陣的維度分別爲 URm×m, ΣRm×n, VRn×nU \in R^{m\times m},\ \Sigma \in R^{m\times n},\ V \in R^{n\times n}。一般地ΣΣ有如下形式:
Σ=[σ100000σ200000000000]m×n\Sigma=\left[ \begin{array}{ccccc}{\sigma_{1}} & {0} & {0} & {0} & {0} \\ {0} & {\sigma_{2}} & {0} & {0} & {0} \\ {0} & {0} & {\ddots} & {0} & {0} \\ {0} & {0} & {0} & {\ddots} & {0}\end{array}\right]_{m \times n}圖:奇異值分解
對於奇異值分解,我們可以利用上面的圖形象表示,圖中方塊的顏色表示值的大小,顏色越淺,值越大。對於奇異值矩陣ΣΣ,只有其主對角線有奇異值,其餘均爲0。

3.2、奇異值求解

正常求上面的 U,V,ΣU,V,\Sigma 不便於求,我們可以利用如下性質:
(3,4)AAT=UΣVTVΣTUT=UΣΣTUT ATA=VΣTUTUΣVT=VΣTΣVT\begin{aligned} A A^{T} &=U \Sigma V^{T} V \Sigma^{T} U^{T}=U \Sigma \Sigma^{T} U^{T} \tag{3,4}\\\ A^{T} A &=V \Sigma^{T} U^{T} U \Sigma V^{T}=V \Sigma^{T} \Sigma V^{T} \end{aligned}

注意:需要指出的是,這裏ΣΣT\Sigma\Sigma^TΣTΣ\Sigma^T\Sigma 在矩陣的角度上來講,它們是不相等的,因爲它們的維數不同ΣΣTRm×m\Sigma\Sigma^T \in R^{m \times m},而ΣTΣRn×n\Sigma^T\Sigma \in R^{n \times n},但是它們在主對角線的奇異值是相等的,即有:

ΣΣT=[σ120000σ2200000000]mxmΣTΣ=[σ120000σ2200000000]n×n \Sigma \Sigma^{T}=\left[ \begin{array}{cccc}{\sigma_{1}^{2}} & {0} & {0} & {0} \\ {0} & {\sigma_{2}^{2}} & {0} & {0} \\ {0} & {0} & {\ddots} & {0} \\ {0} & {0} & {0} & {\ddots}\end{array}\right]_{\operatorname{mxm}} \Sigma^{T} \Sigma=\left[ \begin{array}{cccc}{\sigma_{1}^{2}} & {0} & {0} & {0} \\ {0} & {\sigma_{2}^{2}} & {0} & {0} \\ {0} & {0} & {\ddots} & {0} \\ {0} & {0} & {0} & {\ddots}\end{array}\right]_{n \times n}

可以看到式3(3)與式1(1)的形式非常相同,進一步分析,我們可以發現AATAA^TATAA^TA也是對稱矩陣,那麼可以利用式1(1),做特徵值分解。利用式3(3)特徵值分解,得到的特徵矩陣即爲UU;利用式4(4)特徵值分解,得到的特徵矩陣即爲VV;對ΣΣT\Sigma\Sigma^TΣTΣ\Sigma^T\Sigma中的特徵值開方,可以得到所有的奇異值。

四、奇異值分解應用

4.1、純數學例子

假設我們現在有矩陣AA,需要對其做奇異值分解,已知:
A=(24130000)A=\left( \begin{array}{ll}{2} & {4} \\ {1} & {3} \\ {0} & {0} \\ {0} & {0}\end{array}\right)
那麼可以求出AATAA^T,如下:
(5)AAT=(20140014100000000000)A A^{T}=\left( \begin{array}{cccc}{20} & {14} & {0} & {0} \\ {14} & {10} & {0} & {0} \\ {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0}\end{array}\right) \tag{5}
接下來就是求這個矩陣的特徵值和特徵向量了:
(6)AATx=λx(AATλE)x=0\begin{array}{c}{A A^{T} x=\lambda x} \\ {\left(A A^{T}-\lambda E\right) x=0}\end{array} \tag{6}
要想該方程組有非零解(即非零特徵值),那麼係數矩陣AATλEA A ^ { T } - \lambda E的行列式必須爲00
(7)20λ14001410λ0000λ0000λ=0\left| \begin{array}{cccc}{20-\lambda} & {14} & {0} & {0} \\ {14} & {10-\lambda} & {0} & {0} \\ {0} & {0} & {-\lambda} & {0} \\ {0} & {0} & {0} & {-\lambda}\end{array}\right|=0 \tag{7}
求解這個行列式我就不再贅述了,這個直接使用行列式展開定理就可以了,可以得到 λ129.86606875λ20.13393125λ3=λ4=0λ1≈29.86606875,λ2≈0.13393125,λ3=λ4=0;有 4 個特徵值,因爲特徵多項式AATλE\vert AA^T - \lambda E \vert是一個 4 次多項式。對應的單位化過的特徵向量爲
(8)(0.817415560.57604844000.576048440.817415560000100001)\left( \begin{array}{cccc}{0.81741556} & {-0.57604844} & {0} & {0} \\ {0.57604844} & {0.81741556} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right) \tag{8}
這就是矩陣 UU。 同樣的過程求解ATAA^TA 的特徵值和特徵向量,求得λ10.13393125λ229.86606875λ1≈0.13393125,λ2≈29.86606875,將特徵值降序排列後對應的單位化過的特徵向量爲:
(9)(0.40453580.91451430.91451430.40455358)\left( \begin{array}{cc}{0.4045358} & {-0.9145143} \\ {0.9145143} & {0.40455358}\end{array}\right) \tag{9}
這就是矩陣VV。 而矩陣 Σ 根據上面說的爲特徵值的平方根構成的對角矩陣:
(10)(5.4649857000.365966190000)\left( \begin{array}{cc}{5.4649857} & {0} \\ {0} & {0.36596619} \\ {0} & {0} \\ {0} & {0}\end{array}\right) \tag{10}
到此,SVD 分解就結束了,原來的矩陣 A 就被分解成了 3 個矩陣的乘積。
(11)A4×2=U4×4Σ4×2V2×2TA_{4 \times 2}=U_{4 \times 4} \Sigma_{4 \times 2} V_{2 \times 2}^{T} \tag{11}
(12)(24130000)=(0.817415560.57604844000.576048440.817415560000100001)(5.4649857000.365966190000)(0.404533580.91451430.91451430.40455358)T\left( \begin{array}{cc}{2} & {4} \\ {1} & {3} \\ {0} & {0} \\ {0} & {0}\end{array}\right)=\left( \begin{array}{cccc}{0.81741556} & {-0.57604844} & {0} & {0} \\ {0.57604844} & {0.81741556} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right)\left( \begin{array}{cc}{5.4649857} & {0} \\ {0} & {0.36596619} \\ {0} & {0} \\ {0} & {0}\end{array}\right) \left( \begin{array}{cc}{0.40453358} & {-0.9145143} \\ {0.9145143} \tag{12}& {0.40455358}\end{array}\right)^{T}

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]]))

最後感謝以下作者的博客:

  1. https://www.cnblogs.com/endlesscoding/p/10033527.html
  2. https://blog.csdn.net/u010099080/article/details/68060274
  3. https://blog.csdn.net/asd136912/article/details/79146151
  4. https://blog.csdn.net/u012421852/article/details/80475497
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章