LU分解
LU分解(LU Factorization)是矩阵分解的一种,可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。
实际上很简单,以二阶为例,设
A
=
[
a
11
a
12
a
21
a
22
]
,
L
=
[
1
0
l
21
1
]
,
U
=
[
u
11
u
12
0
u
22
]
A=\left[ \begin{matrix} a_{11}& a_{12}\\ a_{21}& a_{22}\\ \end{matrix} \right] , L=\left[ \begin{matrix} 1& 0\\ l_{21}& 1\\ \end{matrix} \right] , U=\,\,\left[ \begin{matrix} u_{11}& u_{12}\\ 0& u_{22}\\ \end{matrix} \right]
A=[a11a21a12a22],L=[1l2101],U=[u110u12u22]
由于 A = LU,如下式
[
a
11
a
12
a
21
a
22
]
=
[
1
0
l
21
1
]
[
u
11
u
12
0
u
22
]
=
[
u
11
u
12
l
21
u
11
l
21
u
12
+
u
22
]
\left[ \begin{matrix} a_{11}& a_{12}\\ a_{21}& a_{22}\\ \end{matrix} \right] =\left[ \begin{matrix} 1& 0\\ l_{21}& 1\\ \end{matrix} \right] \left[ \begin{matrix} u_{11}& u_{12}\\ 0& u_{22}\\ \end{matrix} \right] \\ =\left[ \begin{matrix} u_{11}& u_{12}\\ l_{21}u_{11}& l_{21}u_{12}+u_{22}\\ \end{matrix} \right]
[a11a21a12a22]=[1l2101][u110u12u22]=[u11l21u11u12l21u12+u22]
即可求出 L 和 U
# # LU分解
from scipy.linalg import lu
"""
LU分解,矩阵分解的一种,将系数矩阵A转为等价的两个矩阵L、U的乘积,L为单位下三角,U为上三角,是高斯消元法的一种表达式。
在线性代数中已经证明,如果方阵是非奇异的,即的行列式不为0,LU分解总是存在的。
LU分解函数:linalg.lu()
作用:LU分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式。
"""
A = np.arange(1, 17).reshape(4, 4)
p, l, u = lu(a=A, permute_l=False, overwrite_a=False, check_finite=True)
"""
a: 分解矩阵
permute_l:False,执行p*l,返回p、l、u;True,返回pl、u
overwrite_a:是否覆盖a中的数据
check_finite:检查输入矩阵是否具有有限数,有限数可能导致程序崩溃
返回值分析:
permute_l=False时:
p: 置换矩阵(M,M);
l: 具有单位对角线的下三角矩阵(M,K)或梯形矩阵K=min(M,N)
u: 上三角矩阵(K,N)或梯形矩阵
permute_l=True时:
pl: 为(M,K)数组形的置换矩阵K=min(M,N);
u: 上三角矩阵(K,N)或梯形矩阵
"""
print('原矩阵\n', A)
print('p矩阵\n', p)
print('l矩阵\n', l)
print('u矩阵\n', u)
# 原矩阵
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]
# [13 14 15 16]]
# p矩阵
# [[0. 1. 0. 0.]
# [0. 0. 0. 1.]
# [0. 0. 1. 0.]
# [1. 0. 0. 0.]]
# l矩阵
# [[ 1. 0. 0. 0. ]
# [ 0.07692308 1. 0. 0. ]
# [ 0.69230769 0.33333333 1. 0. ]
# [ 0.38461538 0.66666667 -0.64 1. ]]
# u矩阵
# [[ 1.30000000e+01 1.40000000e+01 1.50000000e+01 1.60000000e+01]
# [ 0.00000000e+00 9.23076923e-01 1.84615385e+00 2.76923077e+00]
# [ 0.00000000e+00 0.00000000e+00 -2.84672570e-16 -5.75038592e-16]
# [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.32907052e-17]]
特征分解
链接: 特征值和特征向量
A
x
=
λ
x
(
A
−
λ
I
)
x
=
0
det
(
A
−
λ
I
)
=
0
Ax\,\,=\,\,\lambda x \\ \left( A-\lambda I \right) x=0 \\ \det \left( A-\lambda I \right) =0
Ax=λx(A−λI)x=0det(A−λI)=0
即可计算出
λ
\lambda
λ 的取值。再根据
λ
\lambda
λ 计算出特征向量。
Q
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
Λ
=
[
λ
1
λ
2
⋱
λ
n
]
A
Q
=
Q
Λ
A
=
Q
Λ
Q
−
1
Q=\left[ x_1,x_2,...,x_n \right] \\ \varLambda =\left[ \begin{matrix}{} \lambda _1& & & \\ & \lambda _2& & \\ & & \ddots& \\ & & & \lambda _n\\ \end{matrix} \right] \\ AQ=Q\varLambda \\ A=Q\varLambda Q^{-1}
Q=[x1,x2,...,xn]Λ=⎣
⎡λ1λ2⋱λn⎦
⎤AQ=QΛA=QΛQ−1
有上式即可特征分解。
奇异值分解
分解成如下所示,其中 nxn 的 U 和 mxm 的 V 为正交矩阵,
Σ
\varSigma
Σ 为 nxm 维的对角矩阵。
A
=
U
Σ
V
T
A=U \varSigma V^T
A=UΣVT
A
A
T
=
U
Σ
V
T
(
U
Σ
V
T
)
T
=
U
Σ
n
×
n
2
U
T
AA^T=U\varSigma V^T\left( U\varSigma V^T \right) ^T=U\varSigma _{n\times n}^{2}U^T
AAT=UΣVT(UΣVT)T=UΣn×n2UT
Σ
n
×
n
2
\varSigma _{n\times n}^{2}
Σn×n2 是个对角矩阵,把对角矩阵的元素都看作特征值,可以进行特征分解。
同理,再利用
A
T
A
\\A^TA
ATA
可以求出 U,V,
Σ
\varSigma
Σ。