矩阵的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分解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章