奇异值分解(singular value decomposition, SVD)是一种矩阵因子分解方法,是线性代数的概念,它在优化问题、最小二乘问题、广义逆矩阵及统计学习中被广泛使用,成为其重要工具。
1 定义与性质
- 奇异值分解是指任意一个mxn矩阵,都可以表示为三个矩阵的乘积(因子分解)形式,分别是m阶正交矩阵、由降序排列的非负的对角线元素组成的mxn矩形对角矩阵和n阶正交矩阵。
- 奇异值:设A∈
C
r
m
∗
n
C^{m*n}_r
Crm∗n(r>0),求出
A
A
T
AA^T
AAT或
A
T
A
A^TA
ATA的特征值,
λ
1
≥
λ
2
≥
λ
3
≥
.
.
.
≥
λ
r
>
0
,
λ
r
+
1
=
λ
r
+
2
=
.
.
.
λ
n
=
0
λ_1≥λ_2≥λ_3≥...≥λ_r>0,λ_{r+1}=λ_{r+2}=...λ_n=0
λ1≥λ2≥λ3≥...≥λr>0,λr+1=λr+2=...λn=0,则称σ=
λ
i
\sqrtλ_i
λi(i=1,2,3…n)为A的奇异值,σ=
λ
i
\sqrtλ_i
λi(i=1,2,3…r)为A的非零奇异值。
注: A A T AA^T AAT和 A T A A^TA ATA有相同的非零奇异值。 - 矩阵奇异值分解将矩阵分解为三个矩阵的乘积:
A
=
U
Σ
V
T
A=UΣV^T
A=UΣVT
其中:
U和V是正交单位矩阵(酉矩阵),Σ为对角矩阵(不一定是方阵)。
矩阵U称为左奇异矩阵,U的列向量称为左奇异向量,V为右奇异矩阵,V的列向量称为右奇异向量。
Σ=diag( σ 1 , σ 2 , . . . σ n σ_1,σ_2,...σ_n σ1,σ2,...σn),只有其主对角线有奇异值,其余均为0。
将上诉公式 A = U Σ V T A=UΣV^T A=UΣVT改为A=U ( Σ 1 O O O ) V T \begin{pmatrix} Σ_1&O\\O&O\end{pmatrix}V^T (Σ1OOO)VT,其中 Σ 1 Σ_1 Σ1=diag( σ 1 , σ 2 , . . . σ r σ_1,σ_2,...σ_r σ1,σ2,...σr)
2 奇异值分解算法
例题:求矩阵A= ( 1 2 0 0 0 0 ) \begin{pmatrix} 1&2\\0&0\\0&0\end{pmatrix} ⎝⎛100200⎠⎞的奇异值分解。
2.1 算法一
(1)求正交矩阵V
可求得矩阵
A
T
A
=
A^TA=
ATA=
(
1
0
0
2
0
0
)
\begin{pmatrix}1&0&0\\2&0&0\end{pmatrix}
(120000)
(
1
2
0
0
0
0
)
\begin{pmatrix}1&2\\0&0\\0&0\end{pmatrix}
⎝⎛100200⎠⎞=
(
1
2
2
4
)
\begin{pmatrix}1&2\\2&4\end{pmatrix}
(1224)的特征值为
λ
1
=
5
,
λ
2
=
0
λ_1=5,λ_2=0
λ1=5,λ2=0,
对应特征向量为
a
1
=
(
1
,
2
)
T
a_1=(1,2)^T
a1=(1,2)T,
a
2
=
(
2
,
−
1
)
T
a_2=(2,-1)^T
a2=(2,−1)T
非零奇异值为
σ
=
5
σ=\sqrt5
σ=5,所以
Σ
1
Σ_1
Σ1=(
5
\sqrt5
5)
使得
V
T
(
A
T
A
)
V
V^T(A^TA)V
VT(ATA)V=
(
5
0
0
0
)
\begin{pmatrix}5&0\\0&0\end{pmatrix}
(5000)成立的正交矩阵
V
=
(
V
1
,
V
2
V=(V_1,V_2
V=(V1,V2)=
(
1
5
2
5
2
5
−
1
5
)
\begin{pmatrix}\frac{1}{\sqrt5}&\frac{2}{\sqrt5}\\\frac{2}{\sqrt5}&-\frac{1}{\sqrt5}\end{pmatrix}
(515252−51)
(2)求正交矩阵U
U
1
=
A
V
1
Σ
1
−
1
U_1=AV_1Σ_1^{-1}
U1=AV1Σ1−1=
(
1
2
0
0
0
0
)
\begin{pmatrix}1&2\\0&0\\0&0\end{pmatrix}
⎝⎛100200⎠⎞
(
1
5
2
5
)
\begin{pmatrix}\frac{1}{\sqrt5}\\\frac{2}{\sqrt5}\end{pmatrix}
(5152)
(
1
5
)
\begin{pmatrix}\frac{1}{\sqrt5}\end{pmatrix}
(51)=
(
1
0
0
)
\begin{pmatrix}1\\0\\0\end{pmatrix}
⎝⎛100⎠⎞
取
U
2
=
(
0
0
1
0
0
1
)
U_2=\begin{pmatrix}0&0\\1&0\\0&1\end{pmatrix}
U2=⎝⎛010001⎠⎞ ,将
U
1
U_1
U1扩张成
R
3
R^3
R3的标准正交基
U
=
(
U
1
,
U
2
)
U=(U_1,U_2)
U=(U1,U2)=
(
1
0
0
0
1
0
0
0
1
)
\begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}
⎝⎛100010001⎠⎞
(3)分解
则A的奇异值分解为A=U
(
Σ
1
O
O
O
)
V
T
\begin{pmatrix} Σ_1&O\\O&O\end{pmatrix}V^T
(Σ1OOO)VT=
(
1
0
0
0
1
0
0
0
1
)
\begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}
⎝⎛100010001⎠⎞
(
5
0
0
0
0
0
)
\begin{pmatrix}\sqrt5&0\\0&0\\0&0\end{pmatrix}
⎝⎛500000⎠⎞
(
1
5
2
5
2
5
−
1
5
)
\begin{pmatrix}\frac{1}{\sqrt5}&\frac{2}{\sqrt5}\\\frac{2}{\sqrt5}&-\frac{1}{\sqrt5}\end{pmatrix}
(515252−51)
2.2 算法二
(1)求正交矩阵U
可求得矩阵
A
A
T
=
AA^T=
AAT=
(
1
2
0
0
0
0
)
\begin{pmatrix}1&2\\0&0\\0&0\end{pmatrix}
⎝⎛100200⎠⎞
(
1
0
0
2
0
0
)
\begin{pmatrix}1&0&0\\2&0&0\end{pmatrix}
(120000)=
(
5
0
0
0
0
0
0
0
0
)
\begin{pmatrix}5&0&0\\0&0&0\\0&0&0\end{pmatrix}
⎝⎛500000000⎠⎞的特征值为
λ
1
=
5
,
λ
2
=
λ
3
=
0
λ_1=5,λ_2=λ_3=0
λ1=5,λ2=λ3=0,非零奇异值为
σ
=
5
σ=\sqrt5
σ=5,所以
Σ
1
=
(
5
Σ_1=(\sqrt5
Σ1=(5)
求得特征向量
a
1
=
(
1
,
0
,
0
)
T
a_1=(1,0,0)^T
a1=(1,0,0)T,
a
2
=
(
0
,
1
,
0
)
T
a_2=(0,1,0)^T
a2=(0,1,0)T,
a
3
=
(
0
,
0
,
1
)
T
a_3=(0,0,1)^T
a3=(0,0,1)T
则
U
=
(
1
0
0
0
1
0
0
0
1
)
U=\begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}
U=⎝⎛100010001⎠⎞
(2)求正交矩阵V
可求得矩阵
A
T
A
=
A^TA=
ATA=
(
1
0
0
2
0
0
)
\begin{pmatrix}1&0&0\\2&0&0\end{pmatrix}
(120000)
(
1
2
0
0
0
0
)
\begin{pmatrix}1&2\\0&0\\0&0\end{pmatrix}
⎝⎛100200⎠⎞=
(
1
2
2
4
)
\begin{pmatrix}1&2\\2&4\end{pmatrix}
(1224)的特征值为
λ
1
=
5
,
λ
2
=
0
λ_1=5,λ_2=0
λ1=5,λ2=0,
对应特征向量为
a
1
=
(
1
,
2
)
T
a_1=(1,2)^T
a1=(1,2)T,
a
2
=
(
2
,
−
1
)
T
a_2=(2,-1)^T
a2=(2,−1)T
使得
V
T
(
A
T
A
)
V
V^T(A^TA)V
VT(ATA)V=
(
5
0
0
0
)
\begin{pmatrix}5&0\\0&0\end{pmatrix}
(5000)成立的正交矩阵
V
=
(
V
1
,
V
2
V=(V_1,V_2
V=(V1,V2)=
(
1
5
2
5
2
5
−
1
5
)
\begin{pmatrix}\frac{1}{\sqrt5}&\frac{2}{\sqrt5}\\\frac{2}{\sqrt5}&-\frac{1}{\sqrt5}\end{pmatrix}
(515252−51)
(3)分解
则A的奇异值分解为A=U
(
Σ
1
O
O
O
)
V
T
\begin{pmatrix} Σ_1&O\\O&O\end{pmatrix}V^T
(Σ1OOO)VT=
(
1
0
0
0
1
0
0
0
1
)
\begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix}
⎝⎛100010001⎠⎞
(
5
0
0
0
0
0
)
\begin{pmatrix}\sqrt5&0\\0&0\\0&0\end{pmatrix}
⎝⎛500000⎠⎞
(
1
5
2
5
2
5
−
1
5
)
\begin{pmatrix}\frac{1}{\sqrt5}&\frac{2}{\sqrt5}\\\frac{2}{\sqrt5}&-\frac{1}{\sqrt5}\end{pmatrix}
(515252−51)
我觉得算法二套路简单,没有算法一那么花里胡哨,但所得结果需要检验。
3 奇异值分解代码
python代码:直接调用numpy的svd()
import numpy as np
A = np.array([[1,2],[0,0],[0,0]])
U,S,VT = np.linalg.svd(A)
print("返回结果:",np.linalg.svd(A))
print("U=",U)
print("S=",S)
print("V^T=",VT)
输出
这时我们发现矩阵S只显示对角元素的值,而矩阵中其它元素因为是0而被省略了。所以返回的时候,作为一维矩阵返回。如果我们想让矩阵S完整显示出来,可以添加以下代码进行处理
S2 = np.zeros(A.shape,S.dtype)
np.fill_diagonal(S2,S)
print("处理后的S=")
print(S2)
输出:
说明:
np.fill_diagonal(S2, S)的作用是将矩阵S2的对角元素设置为S的元素
np.zeros(A.shape,S.dtype)的作用是返回来一个和矩阵A形状相同的、和矩阵S数据类型相同的、用0填充的数组。