矩阵分解 - 奇异值分解SVD(计算)

本篇介绍矩阵分解中最重要的分解方式
奇异值分解 - 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σ2200000000n×nΣΣT=σ120000σ2200000000m×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)

  1. 先计算B:
    B = W T W = ( 41 25 41 25 ) B = W^{T}W = \begin{pmatrix} 41 & 25 \\ 41 & 25 \end{pmatrix} B=WTW=(41412525)
  2. 对B进行EVD:
    B = U D U T = ( 0.81 − 0.59 0.59 0.81 ) ( 59.2 0 0 6.75 ) ( 0.81 0.59 − 0.59 0.81 ) B = UDU^{T} = \begin{pmatrix} 0.81 & -0.59 \\ 0.59 & 0.81 \end{pmatrix} \begin{pmatrix} 59.2 & 0 \\ 0 & 6.75 \end{pmatrix} \begin{pmatrix} 0.81 & 0.59 \\ -0.59 & 0.81 \end{pmatrix} B=UDUT=(0.810.590.590.81)(59.2006.75)(0.810.590.590.81)
  3. 可以知道U和\Sigma了,由于C是个33的方阵,B是一个22的方阵,最终的奇异值矩阵要符合乘法规律,所以要适当的添0.
    U = ( 0.81 − 0.59 0.59 0.81 ) U = \begin{pmatrix} 0.81 & -0.59 \\ 0.59 & 0.81 \end{pmatrix} U=(0.810.590.590.81)
    Σ = D 1 / 2 = ( 7.70 0 0 0 2.60 0 ) \Sigma = D^{1/2} = \begin{pmatrix} 7.70 & 0 & 0\\ 0 & 2.60 & 0 \end{pmatrix} Σ=D1/2=(7.70002.6000)
  4. 同理计算C的特征值分解,并得到V:
    C = V D V T = ( 0.42 − 0.91 0 0 0 1 0.91 0.42 0 ) ( 59.2 0 0 0 6.75 0 0 0 0 ) ( 0.42 − 0 0.91 − 0.91 0 0.42 0 1 0 ) C = VDV^{T} = \begin{pmatrix} 0.42 & -0.91 & 0 \\ 0 & 0 & 1 \\ 0.91 & 0.42 & 0\end{pmatrix} \begin{pmatrix} 59.2 & 0 &0\\ 0 & 6.75 & 0\\ 0 & 0 & 0\end{pmatrix} \begin{pmatrix} 0.42 & -0 & 0.91 \\ -0.91 & 0 & 0.42 \\ 0 & 1 & 0\end{pmatrix} C=VDVT=0.4200.910.9100.4201059.20006.7500000.420.9100010.910.420
    V = ( 0.42 − 0.91 0 0 0 1 0.91 0.42 0 ) V =\begin{pmatrix} 0.42 & -0.91 & 0 \\ 0 & 0 & 1 \\ 0.91 & 0.42 & 0\end{pmatrix} V=0.4200.910.9100.42010
  5. 最终
    W = ( 4 0 5 0 0 5 ) = ( 0.81 − 0.59 0.59 0.81 ) ( 7.70 0 0 0 2.60 0 ) ( 0.42 − 0.91 0 0 0 1 0.91 0.42 0 ) W = \begin{pmatrix} 4 & 0 & 5 \\ 0 & 0 & 5 \end{pmatrix} = \begin{pmatrix} 0.81 & -0.59 \\ 0.59 & 0.81 \end{pmatrix} \begin{pmatrix} 7.70 & 0 & 0\\ 0 & 2.60 & 0 \end{pmatrix} \begin{pmatrix} 0.42 & -0.91 & 0 \\ 0 & 0 & 1 \\ 0.91 & 0.42 & 0\end{pmatrix} W=(400055)=(0.810.590.590.81)(7.70002.6000)0.4200.910.9100.42010

四 也可以把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)

矩阵分解 - 奇异值分解SVD(计算)_第1张图片

注意matlab中的svd和python还是有区别的,如果不仔细看文档说明容易出错:
Python: M = U S V M = USV M=USV
Matlab: M = U S V T M = USV^T M=USVT

矩阵分解 - 奇异值分解SVD(计算)_第2张图片
矩阵分解 - 奇异值分解SVD(计算)_第3张图片

你可能感兴趣的:(数学-算法)