1.谱分解
谱分解又称为特征值分解,只有方阵才能进行谱分解。
(1)特征值和特征向量
方阵
A
\mathbf{A}
A,如果存在非零向量
x
\mathbf{x}
x和实数
λ
\lambda
λ,满足:
A
x
=
λ
x
\mathbf{Ax}=\lambda \textbf{x}
Ax=λx
则称
λ
\lambda
λ为
A
\mathbf{A}
A的特征值,
x
\mathbf{x}
x为
λ
\lambda
λ对应
A
\mathbf{A}
A的特征向量。
(2)特征值分解
方阵
A
\mathbf{A}
A可以分解为:
A
=
W
Σ
W
−
1
\mathbf{A}=\mathbf{W}\Sigma \mathbf{W}^{-1}
A=WΣW−1
其中,
W
\mathbf{W}
W为特征值对应的特征向量组成的矩阵,
Σ
\Sigma
Σ为特征值组成的对角矩阵。
当特征向量为单位正交向量,即:
w
i
T
w
i
=
1
,
w
i
T
w
j
=
0
\mathbf{w}_{i}^{T}\mathbf{w}_{i}=1,\mathbf{w}_{i}^{T}\mathbf{w}_{j}=0
wiTwi=1,wiTwj=0
则特征向量组成的矩阵
W
\mathbf{W}
W满足:
W
T
W
=
E
,
W
T
=
W
−
1
\mathbf{W}^{T}\mathbf{W}=E,\mathbf{W}^{T}=\mathbf{W}^{-1}
WTW=E,WT=W−1
此时,方阵
A
\mathbf{A}
A的特征值分解可以写为:
A
=
W
Σ
W
T
\mathbf{A}=\mathbf{W}\Sigma \mathbf{W}^{T}
A=WΣWT
(3)numpy实现特征值分解
生成3*3矩阵
import numpy as np
a = np.random.randn(3,3)
print(a)
输出:
[[-0.55834527 -0.43532198 -1.7491549 ]
[-0.77599428 0.31747145 -0.14348623]
[ 0.82501312 -0.42363183 -0.24466913]]
求出特征值和特征向量
e_vals,e_vecs = np.linalg.eig(a)
print('特征值:')
print(e_vals)
print('特征向量矩阵:')
print(e_vecs)
输出:
特征值:
[-0.29093722+0.94740018j -0.29093722-0.94740018j 0.09633149+0.j ]
特征向量矩阵:
[[-0.71600646+0.j -0.71600646-0.j 0.31525619+0.j ]
[-0.30514196-0.3624265j -0.30514196+0.3624265j 0.88653391+0.j ]
[ 0.18540433+0.47801191j 0.18540433-0.47801191j -0.3386313 +0.j ]]
特征值组成对角矩阵
e_vals_matrix = np.diag(e_vals)
print(e_vals_matrix )
输出:
[[-0.29093722+0.94740018j 0. +0.j 0. +0.j ]
[ 0. +0.j -0.29093722-0.94740018j 0. +0.j ]
[ 0. +0.j 0. +0.j 0.09633149+0.j ]]
求特征向量组成的矩阵的逆矩阵
e_vecs_inv = np.linalg.inv(e_vecs)
print(e_vecs_inv)
输出:
[[-0.78910799-1.59991045e-01j 0.39500959-4.82338840e-01j
0.29949451-1.41170619e+00j]
[-0.78910799+1.59991045e-01j 0.39500959+4.82338840e-01j
0.29949451+1.41170619e+00j]
[-0.41240378+0.00000000e+00j 1.79428304+0.00000000e+00j
1.36041741-6.46882927e-17j]]
验证矩阵分解是否成功
np.allclose( a, np.dot(e_vecs, np.dot(e_vals_matrix, np.linalg.inv(e_vecs))))
输出:
True
2.奇异值分解(SVD)
(1)简介
奇异值分解可以对任意形状的矩阵进行。
对矩阵
A
∈
R
m
×
n
\textbf{A}\in R^{m\times n}
A∈Rm×n进行奇异值分解:
A
=
U
Σ
V
−
1
\textbf{A}=\mathbf{U\Sigma V^{-1}}
A=UΣV−1
其中,
U
∈
R
m
×
m
\mathbf{U}\in R^{m\times m}
U∈Rm×m为左奇异矩阵,是由
A
A
T
\mathbf{AA^{T}}
AAT的
m
m
m个特征向量组成的矩阵;
V
∈
R
n
×
n
\mathbf{V}\in R^{n\times n}
V∈Rn×n为右奇异矩阵,是由
A
T
A
\mathbf{A^{T}A}
ATA的
n
n
n个特征向量组成的矩阵;
Σ
∈
R
m
×
n
\mathbf{\Sigma }\in R^{m\times n}
Σ∈Rm×n是由奇异值
σ
\sigma
σ组成的对角矩阵,奇异值和特征值的关系为
σ
=
λ
\sigma=\sqrt{\lambda }
σ=λ。
(2)SVD和PCA
PCA需要求协方差矩阵
X
T
X
\mathbf{X^{T}X}
XTX,计算量大。而有些求SVD的方法可以不通过协方差矩阵直接求出左奇异矩阵和右奇异矩阵。
左奇异矩阵可以对矩阵进行行压缩,右奇异矩阵可以进行列压缩。
(3)numpy实现SVD
生成3*4矩阵
import numpy as np
a = np.random.randn(3,4)
print(a)
输出:
[[ 0.62792926 -0.37274349 0.07758746 0.48700254]
[-0.42410401 1.77721975 2.52468661 1.41474801]
[ 1.91585643 -0.6565746 0.7721693 -0.54750592]]
奇异值分解
u,s,v = np.linalg.svd(a)
print('左奇异矩阵')
print(u)
print('奇异值向量')
print(s)
print('右奇异矩阵')
print(v)
输出:
左奇异矩阵
[[-0.01748221 -0.26483323 0.96413574]
[ 0.9925762 -0.12067706 -0.01515022]
[-0.12036135 -0.95671334 -0.26497687]]
奇异值向量
[3.4368963 2.28903121 0.66033099]
右奇异矩阵
[[-0.19276933 0.53815084 0.70169359 0.42527611]
[-0.85103353 0.22384967 -0.46480981 0.09790348]
[ 0.15776433 -0.32154103 -0.25449617 0.89830589]
[ 0.46226868 0.74625489 -0.47624536 0.0510065 ]]