矩陣的SVD分解及其實現

一、完美的對稱矩陣

\quad滿足A=ATA=A^T的矩陣爲對稱矩陣。有如下性質:

  • 對稱矩陣的特徵值一定是實數
  • 對稱矩陣的幾何重數等於代數重數
  • 對稱矩陣一定有n個線性無關的特徵向量
  • 對稱矩陣一定可以對角化
  • 對稱矩陣可以正交對角化

證明:對稱矩陣可以正交對角化

  • 對稱矩陣所有不同的特徵值所對應的特徵向量相互垂直。
  • 假設矩陣AA的兩個特徵向量V1,V2V_1,V_2對應不同的特徵值λ1,λ2\lambda_1,\lambda_2,證明:V1V2=0V_1\cdot V_2=0
    (λ1V1)V2=(λ1V1)TV2=(AV1)TV2=V1TATV2=V1TAV2=V1Tλ2V2=λ2V1TV2=λ2V1V2(\lambda_1V_1)\cdot V_2=(\lambda_1V_1)^TV_2=(AV_1)^TV_2=V_1^TA^TV_2=V_1^TAV_2=V_1^T\lambda_2V_2=\lambda_2V_1^TV_2=\lambda_2V_1\cdot V_2,故(λ1λ2)(V1V2)=0(\lambda_1-\lambda_2)(V_1 \cdot V_2)=0,故V1V2=0V_1 \cdot V_2=0
  • 如果有相同的特徵值,則因爲對稱矩陣的幾何重數等於代數重數,因此也能找到互相垂直的特徵向量。進而得到對稱矩陣一定有n個線性無關的特徵向量的結論。
  • 對稱矩陣一定可以被對角化A=PDP1A=PDP^{-1},而且因爲其特徵向量相互垂直,因此能找到標準正交矩陣QQ,使得A=QDQ1=QDQTA=QDQ^{-1}=QDQ^T(對於標準正交矩陣而言Q1=QTQ^{-1}=Q^T)。

證明:如果一個矩陣能被正交對角化則該矩陣一定是對稱矩陣

  • A=QDQT,AT=(QDQT)T=QDQT=AA=QDQ^T,A^T=(QDQ^T)^T=QDQ^T=A,故AA是對稱矩陣

二、奇異值

\quad因爲對稱矩陣是完美的,具有上述如此多優美的性質,因爲我們想:能不能將一個普通的矩陣也轉化爲對稱矩陣呢?答案很簡單,構造一下即可:假設AA是一個mnm*n的矩陣,則ATAA^TA是一個nnn*n的方陣,且是個對陣矩陣。故ATAA^TA具有如下性質:

  • 對稱矩陣的特徵值一定是實數
  • 對稱矩陣一定有n個線性無關的特徵向量
  • 對稱矩陣可以正交對角化

證明:ATAA^TA的特徵值全部非負

  • 假設ATAA^TA的特徵值爲λ1,,λn\lambda_1,\cdots,\lambda_n,特徵向量爲V1,,VnV_1,\cdots,V_n
  • AVi2=(AVi)(AVi)=(Avi)T(Avi)=viTATAvi=viT(ATAvi)=viT(λivi)=λiviTvi=λiVi2=λi||AV_i||^2=(AV_i)\cdot (AV_i)=(Av_i)^T\cdot (Av_i)=v_i^TA^TAv_i=v_i^T(A^TAv_i)=v_i^T(\lambda_iv_i)=\lambda_iv_i^Tv_i =\lambda_i||V_i||^2=\lambda_i,因此AVi2==λi||AV_i||^2==\lambda_i,故而λi0\lambda_i \ge 0
  • σi=λi\sigma_i=\sqrt\lambda_iσi\sigma_i稱爲AA的奇異值。AA的奇異值爲ATAA^TA的特徵值開根號後的結果。
  • σi\sigma_i是向量AViAV_i的長度

三、矩陣的SVD分解

\quadSVD爲Singular Value Decomposition,即矩陣的奇異值分解。任意矩陣均有SVD分解。若AAmnm*n的矩陣,則可以分解爲A=UΣVTA=U\Sigma V^T,其中U=mm,Σ=mn,V=nnU=m*m,\Sigma=m*n,V=n*n

  • VVATAA^TA的特徵向量進行標準化後的結果,故VV是標準正交矩陣
  • UU是標準正交矩陣
  • Σ\Sigma是奇異值矩陣

\quadpython的scipy庫封裝好了矩陣的SVD分解,調用方法如下:

import numpy as np
from scipy.linalg import svd

if __name__ == '__main__':
    A = np.array([[1, 2],
                  [3, 4],
                  [5, 6]])
    U, s, VT = svd(A)  # 返回U和VT兩個正交矩陣,s爲奇異值向量
    print U
    print s
    print VT
    Sigma = np.zeros(A.shape)
    for i in range(len(s)):
        Sigma[i][i] = s[i]  # 將奇異值向量轉化爲奇異值矩陣Sigma
    print U.dot(Sigma).dot(VT)  # 驗證SVD分解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章