赞
踩
要学会矩阵的特征分解,可以提前看矩阵的一些基础知识:
https://blog.csdn.net/qq_30232405/article/details/104588293
如果说一个向量
v
v
v是方阵
A
A
A的特征向量,将一定可以表示成下面的形式:
A
v
=
λ
v
(2-1)
Av=\lambda v \tag{2-1}
Av=λv(2-1)
也可以看成矩阵
A
A
A,向量
v
v
v,系数
λ
\lambda
λ这三者建立了一种联系,但显然我们无法通过式(2-1)来用
v
v
v和
λ
\lambda
λ表示
A
A
A,因为这个式子不是完备的,对于一个秩为
m
m
m的矩阵
A
A
A,应该存在
m
m
m个这样的式子,完备式子应该是:
A
(
v
1
,
v
2
,
.
.
.
,
v
m
)
=
(
λ
1
v
1
,
λ
2
v
2
,
.
.
.
,
λ
m
v
m
)
=
(
v
1
,
v
2
,
.
.
.
,
v
m
)
[
λ
1
.
.
.
0
⋮
⋱
⋮
0
.
.
.
λ
m
]
A(v_1,v_2,...,v_m)=(\lambda_1 v_1,\lambda_2 v_2,...,\lambda_m v_m)=(v_1,v_2,...,v_m)
A
V
=
V
Λ
(2-2)
AV=V\Lambda \tag{2-2}
AV=VΛ(2-2)
根据公式(2-2)就可以得到矩阵 A A A的特征分解公式:
A = V Λ V − 1 (2-3) A=V\Lambda V^{-1} \tag{2-3} A=VΛV−1(2-3)
总结:特征分解,可以得到 m m m个特征向量和特征值,利用这 m m m个特征(代表这个矩阵最重要的特征),就可以近似这个矩阵。
一个矩阵和该矩阵的非特征向量相乘是对该向量的旋转变换;一个矩阵和该矩阵的特征向量相乘是对该向量的伸缩变换,其中伸缩程度取决于特征值大小。
矩阵在特征向量所指的方向上具有 增强(或减弱)特征向量 的作用。这也就是说,如果矩阵持续地叠代作用于向量,那么特征向量的就会突显出来,利用python进行计算:
用矩阵 A A A去反复左乘一个向量 V V V,python代码如下:
import numpy as np
import copy
A = np.array([[4, 1, 1], [1, 2, 1], [3, 2, 3]])
V = np.array([[-1], [5], [3]])
dot_nums = [1, 3, 5, 10]
for i in range(len(dot_nums)):
A_ = copy.copy(A)
for _ in range(dot_nums[i] - 1):
A_ = np.dot(A_, A)
B = np.dot(A_, V)
B = np.abs(B)
C = B / np.sum(B)
print("dot number: %d" % dot_nums[i])
print(C)
得到结果:
可以看到不断左乘A后,变换后的归一化向量在(0.33,0.2,0.46)附近徘徊,这与计算出来的最大特征值对应的特征向量归一化后的结果是一致的,这也就佐证了矩阵是具有某种不变的特性的。因此为了提取矩阵这种“不变性”,或者说是为了描述变换(矩阵惩罚是一种线性变换)的主要方向是非常有必要的。
在 (2-1) 式的基础上,进行一些变形 :
A
v
=
λ
v
→
A
v
=
λ
I
v
→
(
λ
I
−
A
)
v
=
0
(2-4)
Av=\lambda v \to Av=\lambda Iv \to (\lambda I-A)v = 0 \tag{2-4}
Av=λv→Av=λIv→(λI−A)v=0(2-4)
根据线性方程组理论,为了使这个方程有非零解,矩阵
(
λ
I
−
A
)
(\lambda I-A)
(λI−A)的行列式必须是零:
d
e
t
(
λ
I
−
A
)
v
=
0
(2-5)
det(\lambda I-A)v = 0 \tag{2-5}
det(λI−A)v=0(2-5)
上式也被称为是
A
A
A的特征方程,计算出所有
λ
\lambda
λ的取值后,再代入
(
λ
I
−
A
)
v
=
0
(\lambda I-A)v = 0
(λI−A)v=0求解对应的
v
v
v
注意:要注意特征值是重根时的情况。。。。
(1)手算
求矩阵
A
A
A的特征值和特征向量:
∣
λ
I
−
A
∣
=
∣
4
1
1
1
2
1
3
2
3
∣
=
(
λ
−
6
)
(
λ
−
2
)
(
λ
−
1
)
|\lambda I-A| =
可以得到结果:
λ
1
=
6
,
λ
2
=
2
,
λ
3
=
1
\lambda_1 = 6, \lambda_2 = 2, \lambda_3=1
λ1=6,λ2=2,λ3=1
当
λ
=
6
\lambda=6
λ=6时,
(
6
I
−
A
)
v
=
0
(6I-A)v=0
(6I−A)v=0:
(
4
1
1
1
2
1
3
2
3
)
(
v
1
v
2
v
3
)
=
0
r
e
s
u
l
t
:
v
1
=
5
,
v
2
=
3
,
v
3
=
7
result: v_1 = 5, v_2=3, v_3=7
result:v1=5,v2=3,v3=7
当
λ
=
2
\lambda=2
λ=2时,
(
2
I
−
A
)
v
=
0
(2I-A)v=0
(2I−A)v=0:
r
e
s
u
l
t
:
v
1
=
1
,
v
2
=
−
1
,
v
3
=
1
result: v_1 = 1, v_2=-1, v_3=1
result:v1=1,v2=−1,v3=1
当
λ
=
1
\lambda=1
λ=1时,
(
I
−
A
)
v
=
0
(I-A)v=0
(I−A)v=0:
r
e
s
u
l
t
:
v
1
=
0
,
v
2
=
1
,
v
3
=
−
1
result: v_1 = 0, v_2=1, v_3=-1
result:v1=0,v2=1,v3=−1
(2)python计算
使用python中自带的库eig,其中 V V V为特征向量矩阵, D D D为特征值。 V V V中的列是对应的每一个特征向量
import numpy as np
import copy
A = np.array([[4, 1, 1], [1, 2, 1], [3, 2, 3]])
D, V = np.linalg.eig(A)
if np.equal(np.dot(A, V), np.dot(V, np.diag(D))):
print(True)
结果为:
发现python计算的和手算的特征向量值不同,但比例是一样的,这是因为特征向量不是唯一的,特征向量来自齐次线性方程组的解,是齐次线性方程组的基础解系的非零线性组合。
定理:假设矩阵 A A A是一个对称矩阵,则其不同特征值对应的特征向量两两正交。
证明:
首先进行特征分解:
A
x
i
=
λ
i
x
i
(2-6)
Ax_i=\lambda_i x_i \tag{2-6}
Axi=λixi(2-6)
A
x
j
=
λ
j
x
j
(2-7)
Ax_j=\lambda_j x_j \tag{2-7}
Axj=λjxj(2-7)
在公式(2-6)左乘
x
j
x_j
xj:
x
j
T
A
x
i
=
λ
i
x
j
T
x
i
(2-8)
x_j^\mathrm{T} Ax_i=\lambda_i x_j^\mathrm{T} x_i \tag{2-8}
xjTAxi=λixjTxi(2-8)
因为矩阵A是一个对称矩阵,可以对式(2-8)的左边做如下变换:
x j T A x i = x j T A T x i = ( A x j ) T x i = ( λ j x j ) T x i = λ i x j T x i (2-9) x_j^\mathrm{T} Ax_i=x_j^\mathrm{T} A^\mathrm{T} x_i = (Ax_j)^\mathrm{T} x_i = (\lambda_j x_j)^\mathrm{T}x_i = \lambda_i x_j^\mathrm{T} x_i \tag{2-9} xjTAxi=xjTATxi=(Axj)Txi=(λjxj)Txi=λixjTxi(2-9)
最后通过(2-9)可以得到:
(
λ
j
x
j
)
T
x
i
=
λ
i
x
j
T
x
i
→
(
λ
j
−
λ
i
)
x
j
T
x
i
=
0
(2-10)
(\lambda_j x_j)^\mathrm{T}x_i = \lambda_i x_j^\mathrm{T} x_i \to (\lambda_j - \lambda_i)x_j^\mathrm{T}x_i = 0 \tag{2-10}
(λjxj)Txi=λixjTxi→(λj−λi)xjTxi=0(2-10)
因为
λ
j
≠
λ
i
\lambda_j \neq \lambda_i
λj=λi,
x
j
T
x
i
x_j^\mathrm{T}x_i
xjTxi必然等于0。
由于
x
j
x_j
xj和
x
i
x_i
xi是矩阵A的任意两个特征向量,所以命题得证。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。