本篇介绍矩阵分解中最重要的分解方式
奇异值分解 - Singular Value Decomposition (SVD)
一 定义 : 给定一个 m × n m\times n m×n的矩阵M,可以将其作如下形式的分解
W = U Σ V T W = U \Sigma V^{T} W=UΣVT
二 计算过程与说明
构造一个辅助矩阵:
C = W T W = V D 1 V T = V Σ T Σ V T = ( V Σ T U T ) ( U Σ V T ) ‾ C = W^TW = VD_1V^T = V \Sigma^T\Sigma V^T = (V \Sigma^T U^T)\underline{(U \Sigma V^T)} C=WTW=VD1VT=VΣTΣVT=(VΣTUT)(UΣVT)
B = W W T = U D 2 U T = V Σ Σ T U T = ( U Σ T V T ) ( V Σ U T ) B = WW^T = UD_2U^T = V \Sigma\Sigma^T U^T = (U \Sigma^T V^T)(V \Sigma U^T) B=WWT=UD2UT=VΣΣTUT=(UΣTVT)(VΣUT)
此时,划线部分就是我们想要的分解方式.
两个式子基本一样,对第一个式子作一些说明,第二个类似
说明1: 第一个等式是我们构造的矩阵定义
说明2: 第二个等式是矩阵的特征值分解,因为C一定是一个实对称方阵(证明很简单),所以可以进行正交相似变换
说明3: 将特征值对角阵D开方,得到奇异值矩阵 Σ \Sigma Σ
说明4: 因为 U T U = E U^{T}U = E UTU=E(正交相似变换的性质),所以这样添加对等式没影响.
说明5: C C C和 B B B特征值是相同的(记得本科学的矩阵特征值的性质),具体的特征矩阵要跟C和B规模最大的匹配
说明6: C C C和 B B B的规模分别为 n × n n\times n n×n 和 m × m m\times m m×m,但是他们特征值其实是相同的。
Σ T Σ = [ σ 1 2 0 0 0 0 σ 2 2 0 0 0 0 ⋱ 0 0 0 0 ⋱ ] n × n Σ Σ T = [ σ 1 2 0 0 0 0 σ 2 2 0 0 0 0 ⋱ 0 0 0 0 ⋱ ] m × m \Sigma^T\Sigma = \left[ \begin{matrix} \sigma_1^2 & 0 & 0 & 0\\ 0 & \sigma_2^2 & 0 & 0\\ 0 & 0 & \ddots & 0\\ 0 & 0 & 0 & \ddots\\ \end{matrix} \right]_{n\times n} \Sigma\Sigma^T = \left[ \begin{matrix} \sigma_1^2 & 0 & 0 & 0\\ 0 & \sigma_2^2 & 0 & 0\\ 0 & 0 & \ddots & 0 \\ 0 & 0 & 0 & \ddots \\ \end{matrix} \right]_{m\times m}\quad ΣTΣ=⎣⎢⎢⎡σ120000σ220000⋱0000⋱⎦⎥⎥⎤n×nΣΣT=⎣⎢⎢⎡σ120000σ220000⋱0000⋱⎦⎥⎥⎤m×m
这样构造后就可以发现成功了
若 W = ( U Σ V T ) W = (U \Sigma V^{T}) W=(UΣVT)
则 W T = ( U Σ V T ) T = ( V Σ T U T ) W^{T} = (U \Sigma V^{T})^{T} = (V \Sigma^{T} U^{T}) WT=(UΣVT)T=(VΣTUT)
那直接就让 W = ( U Σ V T ) W = (U \Sigma V^{T}) W=(UΣVT) 好了,分解就完了啊.
我们发现 U U U就是 C C C特征值分解后的左奇异矩阵,V就是B特征值分解后的右奇异矩阵, Σ \Sigma Σ 就是 奇异值 对角矩阵.
三 举例说明计算过程:
对下面的矩阵作SVD
W = ( 4 0 5 0 0 5 ) W = \begin{pmatrix} 4 & 0 & 5 \\ 0 & 0 & 5 \end{pmatrix} W=(400055)
四 也可以把SVD看作多个矩阵的叠加.
W = 7.70 ( 0.81 0.59 ) ( 0.42 0 0.91 ) + 2.60 ( 0.59 0.81 ) ( − 0.91 0 0.42 ) W = 7.70\begin{pmatrix} 0.81 \\ 0.59 \end{pmatrix} \begin{pmatrix} 0.42 & 0 & 0.91 \end{pmatrix} + 2.60\begin{pmatrix} 0.59 \\ 0.81 \end{pmatrix} \begin{pmatrix} -0.91 & 0 & 0.42 \end{pmatrix} W=7.70(0.810.59)(0.4200.91)+2.60(0.590.81)(−0.9100.42)
完全的奇异值分解在matlab是svd,而如果把奇异值看作矩阵的权重,把奇异值比较小的部分舍弃而不会造成太大影响,这就是截断式奇异值分解,对应matlab中的svds
矩阵的分解推广到张量上,就是高阶奇异值分解(HOSVD)其具体的形式有很多,比如,CP分解,Tucker分解,HT分解,TT分解.
五 代码实现
可以先看下numpy.linalg中的svd函数,里面有详细的介绍和例子
import numpy as np
m = np.array([[1,2,5],[8,3,4],[0,0,0]])
U, S, V = np.linalg.svd(m)
print("U矩阵是:")
print(U)
print("S矩阵是:")
print(S)
print("V矩阵是:")
print(V)
注意matlab中的svd和python还是有区别的,如果不仔细看文档说明容易出错:
Python: M = U S V M = USV M=USV
Matlab: M = U S V T M = USV^T M=USVT