您当前的位置: 首页 >  matlab

wendy_ya

暂无认证

  • 3浏览

    0关注

    342博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

奇异值分解(SVD)基础概念及MATLAB仿真

wendy_ya 发布时间:2020-10-01 16:31:43 ,浏览量:3

奇异值分解(singular value decomposition,简称SVD)不仅广泛应用于机器学习领域,也在控制理论中有着广泛的应用。本文主要介绍SVD的基本原理。

文章目录
    • 一、预备知识
      • 1.1 特征值与特征向量
      • 1.2 幺正矩阵(酉矩阵)(Unitary Matrix)
          • 酉矩阵的性质:
      • 1.3 特征分解
    • 二、SVD定义
      • 2.1 求矩阵V
      • 2.2 求矩阵U
      • 2.3 求矩阵Σ
      • 2.4 奇异值
    • 三、SVD计算举例
    • 四、MATLAB仿真训练
    • 五、SVD应用
      • 5.1 奇异值分解可以降维
      • 5.2 奇异值对矩阵的扰动不敏感
    • 六、SVD优势
    • 七、小结

一、预备知识 1.1 特征值与特征向量

设 A 是n阶方阵,如果存在数λ和非零n维列向量 x,使得 A α = λ α Aα=λα Aα=λα 成立,则称 λ 是矩阵A的一个特征值(characteristic value),而α是矩阵A对应于特征值λ的特征向量(Eigenvector)。

1.2 幺正矩阵(酉矩阵)(Unitary Matrix)

泛泛来讲,如果一个n阶方阵,它的列向量构成一组标准正交基,那么这个矩阵就是幺正矩阵,或称酉矩阵。

一个简单的充分必要判别准则是:方阵U的共扼转置乘以U等于单位阵,则U是酉矩阵。即酉矩阵的逆矩阵与其伴随矩阵相等。

对于实数矩阵而言,共轭转置等于其转置。

酉矩阵的性质:

① 矩阵U为酉矩阵的充要条件是它的共轭转置矩阵等于其逆矩阵, 即 U ∗ = U − 1 U^{*}=U^{-1} U∗=U−1 或 U ∗ U = U U ∗ = I U^{*}U=UU^{*}=I U∗U=UU∗=I

② 若酉矩阵的元素全是实数,则其为正交矩阵; 正交矩阵的性质:转置等于伴随,即 U T = U ∗ U^{T}=U^{*} UT=U∗

③ 酉矩阵的行列式的绝对值为1; ④ U=VΣV* 其中V是酉矩阵,Σ 是主对角线上元素绝对值为1的对角阵。

在查找相关文献时,遇到了一个问题:共轭转置矩阵与伴随矩阵为什么都用A*表示? 关于详细解答,请参考:https://zhuanlan.zhihu.com/p/87330558

这里只总结一句:当A为酉矩阵时,伴随矩阵等于其共轭转置矩阵。

1.3 特征分解

求出特征值和特征向量之后,就可以对方阵A进行特征分解。

A = W Σ W − 1 A=WΣW^{-1} A=WΣW−1

其中W是这n个特征向量所张成的n x n维酉矩阵( W T = W − 1 W^{T}=W^{-1} WT=W−1),Σ 是主对角线上每个元素就是一个特征值的对角阵。

因此也可以写成: A = W Σ W T A=WΣW^{T} A=WΣWT

分解得到的 Σ 矩阵是一个对角阵, 里面的特征值是由大到小排列的, 这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。

【总结】: 特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要, 而特征向量表示这个特征是什么。不过, 特征值分解也有很多的局限, 比如说要进行特征分解,矩阵A必须是方阵。如果A不是方阵,即行和列不相同时,就不能用这种方法对矩阵进行分解,由此引入SVD的概念。

二、SVD定义

SVD也是对矩阵进行分解,但是与特征分解不同,SVD并不要求分解的矩阵为方阵。 定义矩阵A的SVD为:

A = U Σ V T A=UΣV^{T} A=UΣVT

其中U是一个m * m的矩阵,Σ是一个m * n的矩阵,除了对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n * n的矩阵。U和V都是酉矩阵,即满足 U T U = I U^{T}U=I UTU=I, V T V = I V^{T}V=I VTV=I

在这里插入图片描述

那么我们如何求出SVD分解后的U,Σ,V这三个矩阵呢?

2.1 求矩阵V

将矩阵A的转置与A作矩阵乘法,得到一个n x n的方阵 A T A A^{T}A ATA。由于 A T A A^{T}A ATA是方阵,因此可以进行特征分解,而且得到特征值λi与特征向量vi。将该方阵的所有特征向量张成一个n x n的矩阵V,这就是SVD中的矩阵V了。

一般,将V中的每个特征向量叫做A的右特征向量。

2.2 求矩阵U

相反,将矩阵A与A的转置作矩阵乘法,得到一个m x m的方阵 A A T AA^{T} AAT。由于 A A T AA^{T} AAT是方阵,因此可以进行特征分解,而且得到特征值λi与特征向量ui。将该方阵的所有特征向量张成一个n x n的矩阵U,这就是SVD中的矩阵U了。

一般,将U中的每个特征向量叫做A的左特征向量。

2.3 求矩阵Σ

A = U Σ V T ⇒ A V = U Σ V T V ⇒ A V = U Σ ⇒ A v i = σ i u i ⇒ σ i = A v i / u i A=UΣV^{T} ⇒ AV=UΣV^{T}V ⇒ AV=UΣ ⇒Av_i=σ_iu_i⇒σ_i=Av_i/u_i A=UΣVT⇒AV=UΣVTV⇒AV=UΣ⇒Avi​=σi​ui​⇒σi​=Avi​/ui​

或 A = λ 1 u 1 ( v 1 ) T + λ 2 u 2 ( v 2 ) T + . . . A=λ_1u_1(v_1)^T+λ_2u_2(v_2)^T+... A=λ1​u1​(v1​)T+λ2​u2​(v2​)T+...

通过上式就可以求出每个奇异值σi,进而求出奇异值矩阵Σ。

【证明】: 因为: U T U = I U^{T}U=I UTU=I, Σ T Σ = Σ 2 Σ^{T}Σ=Σ^2 ΣTΣ=Σ2 故 A = U Σ V T ⇒ A T = V Σ T U T ⇒ A T A = V Σ T U T U Σ V T = V Σ 2 V T A=UΣV^{T} ⇒ AT=VΣ^{T}U^{T} ⇒ A^TA=VΣ^TU^TUΣV^T=VΣ^2V^T A=UΣVT⇒AT=VΣTUT⇒ATA=VΣTUTUΣVT=VΣ2VT

由此可以看出,ATA的特征向量组成的的确是V矩阵,同理也可证明U矩阵。 同时,我们发现,特征值矩阵等于奇异值矩阵的平方,也可以说:

σ i = λ i σ_i=\sqrt{λ_i} σi​=λi​ ​

这也是一个十分有用的公式。

2.4 奇异值

A的正奇异值个数等于rank(A), 并且A与AH有相同的奇异值。

奇异值 σ σ σ跟特征值类似,在矩阵 Σ Σ Σ中也是从大到小排列,而且 σ σ σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r(r远远小于m、n)个的奇异值来近似描述矩阵,即部分奇异值分解: A m × n = U m × r Σ r × r V r × n T A_{m×n}=U_{m×r}Σ_{r×r}V^{T}_{r×n} Am×n​=Um×r​Σr×r​Vr×nT​ 在这里插入图片描述 右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,当r越接近于n,则相乘的结果越接近于A。

三、SVD计算举例

例:求矩阵A= ( 1 0 0 2 0 0 ) \left( \begin{array}{lcr} 1 & 0 & 0 \\ 2 & 0 & 0 \end{array} \right) (12​00​00​) 的奇异值分解。

解:我们首先求出ATA和AAT: A T A = ( 1 2 0 0 0 0 ) ( 1 0 0 2 0 0 ) = ( 5 0 0 0 0 0 0 0 0 ) A^TA=\left( \begin{array}{lcr} 1 & 2 \\ 0 & 0 \\ 0 & 0 \end{array} \right) \left( \begin{array}{lcr} 1 & 0 & 0 \\ 2 & 0 & 0 \end{array} \right)= \left( \begin{array}{lcr} 5 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{array} \right) ATA=⎝⎛​100​200​⎠⎞​(12​00​00​)=⎝⎛​500​000​000​⎠⎞​,

A A T = ( 1 0 0 2 0 0 ) ( 1 2 0 0 0 0 ) = ( 1 2 2 4 ) AA^T= \left( \begin{array}{lcr} 1 & 0 & 0 \\ 2 & 0 & 0 \end{array} \right) \left( \begin{array}{lcr} 1 & 2 \\ 0 & 0 \\ 0 & 0 \end{array} \right)= \left( \begin{array}{lcr} 1 & 2 \\ 2 & 4 \\ \end{array} \right) AAT=(12​00​00​)⎝⎛​100​200​⎠⎞​=(12​24​),

根据特征值:λ1=5,λ2=λ3=0对应的特征向量为: v1=[1,0,0]T,v2=[0,1,0]T,v3=[0,0,1]T 从而 V = ( 1 0 0 0 1 0 0 0 1 ) V=\left( \begin{array}{lcr} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array} \right) V=⎝⎛​100​010​001​⎠⎞​,

根据特征值:λ1=5,λ2=0对应的特征向量为: u1=[ 1 / 5 , 2 / 5 1/\sqrt5,2/\sqrt5 1/5 ​,2/5 ​]T,u2=[ − 2 / 5 , 1 / 5 -2/\sqrt5,1/\sqrt5 −2/5 ​,1/5 ​]T

从而 U = ( 1 / 5 − 2 / 5 2 / 5 1 / 5 ) U=\left( \begin{array}{lcr} 1/\sqrt5 & -2/\sqrt5 \\ 2/\sqrt5 & 1/\sqrt5 \\ \end{array} \right) U=(1/5 ​2/5 ​​−2/5 ​1/5 ​​)。

根据非零特征值λ1=5,则A的奇异值为σ1= 5 \sqrt5 5 ​,故D= 5 \sqrt5 5 ​。 最终得到A的奇异值分解: A = U Σ V T = U ( 5 0 0 0 0 0 ) V T = ( 1 / 5 − 2 / 5 2 / 5 1 / 5 ) ( 5 0 0 0 0 0 ) ( 1 0 0 0 1 0 0 0 1 ) A=UΣV^{T}=U\left( \begin{array}{lcr} \sqrt5 & 0 & 0\\ 0 & 0 & 0 \\ \end{array} \right)V^T= \left( \begin{array}{lcr} 1/\sqrt5 & -2/\sqrt5 \\ 2/\sqrt5 & 1/\sqrt5 \\ \end{array} \right)\left( \begin{array}{lcr} \sqrt5 & 0 & 0\\ 0 & 0 & 0 \\ \end{array} \right) \left( \begin{array}{lcr} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array} \right) A=UΣVT=U(5 ​0​00​00​)VT=(1/5 ​2/5 ​​−2/5 ​1/5 ​​)(5 ​0​00​00​)⎝⎛​100​010​001​⎠⎞​

四、MATLAB仿真训练

MATLAB提供了svd函数用于奇异值分解,其代码如下:

A=[1,0,0;2,0,0];
[U,S,V]=svd(A)

输出结果: 在这里插入图片描述

五、SVD应用 5.1 奇异值分解可以降维

M表示n个n维向量,可以通过奇异值分解表示成m+n个r维向量,若A的秩r远远小于m和n,则通过奇异值分解可以降低A的维数。可以计算出,当 r < m n m + n + 1 r

关注
打赏
1659256378
查看更多评论
立即登录/注册

微信扫码登录

0.0504s