SVD简单讲解(易懂)

转载有乱码,,附上原文链接:https://blog.youkuaiyun.com/u010099080/article/details/68060274

 

假设有 m×nm×n 的矩阵 AA ,那么 SVD 就是要找到如下式的这么一个分解,将 AA 分解为 3 个矩阵的乘积:

 

Am×n=Um×mΣm×nVTn×nAm×n=Um×mΣm×nVn×nT

 

其中,UU 和 VV 都是正交矩阵 (Orthogonal Matrix),在复数域内的话就是酉矩阵(Unitary Matrix),即

 

UTU=Em×mUTU=Em×m

 

 

VTV=En×nVTV=En×n

 

换句话说,就是说 UU 的转置等于 UU 的逆,VV 的转置等于 VV 的逆:

 

UT=U−1UT=U−1

 

 

VT=V−1VT=V−1

 

而 ΣΣ 就是一个非负实对角矩阵。

那么 UU 和 VV 以及 ΣΣ 是如何构成的呢?


求解

UU 和 VV 的列分别叫做 AA 的 左奇异向量(left-singular vectors)和 右奇异向量(right-singular vectors),ΣΣ 的对角线上的值叫做 AA 的奇异值(singular values)。

其实整个求解 SVD 的过程就是求解这 3 个矩阵的过程,而求解这 3 个矩阵的过程就是求解特征值和特征向量的过程,问题就在于 求谁的特征值和特征向量

  • UU 的列由 AATAAT 的单位化过的特征向量构成
  • VV 的列由 ATAATA 的单位化过的特征向量构成
  • ΣΣ 的对角元素来源于 AATAAT 或 ATAATA 的特征值的平方根,并且是按从大到小的顺序排列的

知道了这些,那么求解 SVD 的步骤就显而易见了:

  1. 求 AATAAT 的特征值和特征向量,用单位化的特征向量构成 UU
  2. 求 ATAATA 的特征值和特征向量,用单位化的特征向量构成 VV
  3. 将 AATAAT 或者 ATAATA 的特征值求平方根,然后构成 ΣΣ

举例

假设

 

A=⎛⎝⎜⎜⎜21004300⎞⎠⎟⎟⎟A=(24130000)

 

那么可以计算得到

 

AAT=⎛⎝⎜⎜⎜20140014100000000000⎞⎠⎟⎟⎟AAT=(20140014100000000000)

 

接下来就是求这个矩阵的特征值和特征向量了

 

AATx=λxAATx=λx

 

 

(AAT−λE)x=0(AAT−λE)x=0

 

要想该方程组有非零解(即非零特征值),那么系数矩阵 AAT−λEAAT−λE 的行列式必须为 0

 

∣∣∣∣∣∣20−λ14001410−λ0000−λ0000−λ∣∣∣∣∣∣=0|20−λ14001410−λ0000−λ0000−λ|=0

 

求解这个行列式我就不再赘述了,这个直接使用行列式展开定理就可以了,可以得到 λ1≈29.86606875,λ2≈0.13393125,λ3=λ4=0λ1≈29.86606875,λ2≈0.13393125,λ3=λ4=0,有 4 个特征值,因为特征多项式 |AAT−λE||AAT−λE| 是一个 4 次多项式。对应的单位化过的特征向量为

 

⎛⎝⎜⎜⎜0.817415560.5760484400−0.576048440.817415560000100001⎞⎠⎟⎟⎟(0.81741556−0.57604844000.576048440.817415560000100001)

 

这就是矩阵 UU 了。

同样的过程求解 ATAATA 的特征值和特征向量,求得 λ1≈0.13393125,λ2≈29.86606875λ1≈0.13393125,λ2≈29.86606875,将特征值降序排列后对应的单位化过的特征向量为

 

(0.404553580.9145143−0.91451430.40455358)(0.40455358−0.91451430.91451430.40455358)

 

这就是矩阵 VV 了。

而矩阵 ΣΣ 根据上面说的为特征值的平方根构成的对角矩阵

 

⎛⎝⎜⎜⎜5.464985700000.3659661900⎞⎠⎟⎟⎟(5.4649857000.365966190000)

 

到此,SVD 分解就结束了,原来的矩阵 AA 就被分解成了 3 个矩阵的乘积。

 

A4×2=U4×4Σ4×2VT2×2A4×2=U4×4Σ4×2V2×2T

 

 

⎛⎝⎜⎜⎜21004300⎞⎠⎟⎟⎟=⎛⎝⎜⎜⎜0.817415560.5760484400−0.576048440.817415560000100001⎞⎠⎟⎟⎟⎛⎝⎜⎜⎜5.464985700000.3659661900⎞⎠⎟⎟⎟(0.404553580.9145143−0.91451430.40455358)T(24130000)=(0.81741556−0.57604844000.576048440.817415560000100001)(5.4649857000.365966190000)(0.40455358−0.91451430.91451430.40455358)T

 


Numpy 实现

Python 中可以使用 numpy 包的 linalg.svd() 来求解 SVD。

import numpy as np

A = np.array([[2, 4], [1, 3], [0, 0], [0, 0]])
print(np.linalg.svd(A))
  • 1
  • 2
  • 3
  • 4

输出

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

--------------------- 本文来自 secondsilverman 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/u010099080/article/details/68060274?utm_source=copy

《工程矩阵理论》是张明淳教授编写的一本矩阵理论的工程应用教材,该PDF版本是该书的电子版。这本教材主要介绍了矩阵理论在工程领域中的应用,包括线性方程组的求解、矩阵特征值问题、矩阵的分解与逆等内容。该书内容丰富、系统,适合工程、数学等专业的学生从事相关研究的人员学习参考。 《工程矩阵理论》的内容主要分为七个章节。第一章介绍了矩阵的基本概念性质,包括矩阵运算、矩阵的秩行列式等。第二章讲解了线性方程组的求解方法,包括高斯消元法、LU分解等。第三章介绍了矩阵的特征特征向量,以及特征值与特征向量的性质应用。第四章涉及了矩阵的二次型正定性问题。第五章解释了矩阵的分解,包括QR分解、SVD分解等。第六章探讨了矩阵的逆的求解方法。第七章介绍了矩阵的广义逆正规矩阵等内容。 这本教材通过理论分析实际案例的结合,将矩阵理论与工程实践相结合,旨在帮助读者更好地理解应用矩阵理论。该教材的特点是简明扼要,逻辑清晰,力求用通俗易懂的语言讲解抽象的数学理论,使读者能够轻松掌握矩阵理论的基本知识。 总之,《工程矩阵理论》是一本对于学习应用矩阵理论的人来说具有重要价值的教材。无论是从事工程专业的学生还是从事相关研究的人员,都可以通过阅读该书,系统地了解掌握矩阵理论在工程中的应用,进一步提高自己的专业水平解决实际问题的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值