本文用一个实例来说明特征值和特征向量的起因和实际意义,然后给出定义,计算方法,python代码以及其他解释。
特征值分解
实例
某城市有10000名女性,其中8000名已婚,2000名未婚。每年有30%的已婚女性离婚,有20%的未婚女性结婚。计算若干年后该城市已婚女性和未婚女性的数量。
10000名女性可以用一个向量来表示,即
w
0
=
[
8000
,
2000
]
T
w_0 = [8000,2000]^T
w0=[8000,2000]T,每年的婚姻情况变化可以用矩阵来表示。
[
0.7
0.2
0.3
0.8
]
\left[ \begin{matrix} 0.7 & 0.2 \\ 0.3 & 0.8 \\ \end{matrix} \right]
[0.70.30.20.8]
这样,一年后已婚人数和未婚人数可以表示为
w
1
=
A
∗
w
0
=
[
0.7
0.2
0.3
0.8
]
∗
[
8000
2000
]
=
[
6000
4000
]
w_1 = A * w_0 = \left[ \begin{matrix} 0.7 & 0.2 \\ 0.3 & 0.8 \\ \end{matrix} \right]* \left[ \begin{matrix} 8000 \\ 2000 \\ \end{matrix} \right] = \left[ \begin{matrix} 6000 \\ 4000 \\ \end{matrix} \right]
w1=A∗w0=[0.70.30.20.8]∗[80002000]=[60004000]
一直这么变化下去,从第12年开始已婚未婚人数就稳定下来,到达一个稳态(steady state)。
w
12
=
A
12
∗
w
0
=
[
0.7
0.2
0.3
0.8
]
12
∗
[
8000
2000
]
=
[
0.4
0.4
0.6
0.6
]
12
∗
[
8000
2000
]
=
[
4000
6000
]
w_{12} = A^{12} * w_0 = \left[\begin{matrix} 0.7 & 0.2 \\ 0.3 & 0.8 \\ \end{matrix}\right]^{12} *\left[\begin{matrix} 8000 \\ 2000 \end{matrix}\right] = \left[\begin{matrix} 0.4 & 0.4 \\ 0.6 & 0.6 \\ \end{matrix}\right]^{12} *\left[\begin{matrix} 8000 \\ 2000 \end{matrix}\right]= \left[ \begin{matrix} 4000 \\ 6000 \\ \end{matrix} \right]
w12=A12∗w0=[0.70.30.20.8]12∗[80002000]=[0.40.60.40.6]12∗[80002000]=[40006000]
这里会提出一个疑问,如果一开始已婚和未婚人数不是
w
0
=
[
8000
,
2000
]
T
w_0 = [8000,2000]^T
w0=[8000,2000]T,结果还会是
w
12
=
[
4000
,
6000
]
T
w_{12} = [4000,6000]^T
w12=[4000,6000]T吗?从上式可以看出,只要
A
n
A^{n}
An收敛到等式中的值,不管初值是多少,结果总会是
[
4000
,
6000
]
T
[4000,6000]^T
[4000,6000]T。
根据这一点我们可以得到以下等式,设置向量
x
1
=
[
2
,
3
]
T
x_1 = [2,3]^T
x1=[2,3]T
A
∗
x
1
=
A
∗
[
2
3
]
=
1
∗
[
2
3
]
A * x_1 = A * \left[\begin{matrix}2\\3 \end{matrix}\right] = 1 *\left[\begin{matrix}2\\3 \end{matrix}\right]
A∗x1=A∗[23]=1∗[23]
接下来看另一个等式,设置向量
x
2
=
[
−
1
,
1
]
T
x_2 = [-1,1]^T
x2=[−1,1]T
A
∗
x
2
=
A
∗
[
−
1
1
]
=
1
/
2
∗
[
−
1
1
]
A * x_2 = A * \left[\begin{matrix}-1\\1 \end{matrix}\right] = 1/2 *\left[\begin{matrix}-1\\1 \end{matrix}\right]
A∗x2=A∗[−11]=1/2∗[−11]
假设初始状态,未婚女性人数为
p
p
p,已婚女性人数为
10000
−
p
10000-p
10000−p,即
w
0
=
[
p
,
10000
−
p
]
T
w_0 = [p,10000-p]^T
w0=[p,10000−p]T使用向量
x
1
,
x
2
x_1,x_2
x1,x2来表示,引入两个变量
c
1
,
c
2
c_1,c_2
c1,c2,则有
w
0
=
c
1
∗
x
1
+
c
2
∗
x
2
w_0 = c_1* x_1 + c_2 * x_2
w0=c1∗x1+c2∗x2
w
1
=
A
∗
w
0
=
c
1
∗
x
1
+
(
1
2
)
∗
c
2
∗
x
2
w_1 = A * w_0 = c_1* x_1 + (\frac{1}{2})* c_2 * x_2
w1=A∗w0=c1∗x1+(21)∗c2∗x2
w
n
=
A
n
∗
w
0
=
c
1
∗
x
1
+
(
1
2
)
n
∗
c
2
∗
x
2
w_n = A^n * w_0 = c_1* x_1 + (\frac{1}{2})^n* c_2 * x_2
wn=An∗w0=c1∗x1+(21)n∗c2∗x2
展开
x
1
,
x
2
x_1,x_2
x1,x2得到以下方程,可以解得
c
1
=
2000
c_1 = 2000
c1=2000。
2
c
1
−
c
2
=
p
2c_1 - c_2 = p
2c1−c2=p
3
c
1
+
c
2
=
10000
−
p
3c_1 + c_2 = 10000-p
3c1+c2=10000−p
这样,
w
n
w_n
wn可以得到以下分解
w
n
=
A
n
∗
w
0
=
2000
∗
[
2
3
]
+
(
1
2
)
n
∗
(
4000
−
p
)
∗
[
−
1
1
]
w_n= A^n * w_0 = 2000*\left [\begin{matrix} 2 \\ 3 \\ \end{matrix}\right] + (\frac{1}{2})^n *(4000-p)* \left[\begin{matrix} -1 \\ 1 \\ \end{matrix}\right]
wn=An∗w0=2000∗[23]+(21)n∗(4000−p)∗[−11]
w
n
w_n
wn由两部分组成,第一部分是稳态部分,变换
A
A
A对其不会造成影响。第二部分是瞬态部分,变换
A
A
A会对其造成衰减。这样,变换
A
A
A对
w
0
w_0
w0的作用就可以分解成两个部分,分别由特征向量
x
1
,
x
2
x_1,x_2
x1,x2,和特征值
λ
1
,
λ
2
\lambda_1,\lambda_2
λ1,λ2来表示。
定义
如果说一个向量
v
v
v是方阵
A
A
A的特征向量,将一定可以表示成下面的形式:
A
v
=
λ
v
Av = \lambda v
Av=λv
这时候
λ
λ
λ就被称为特征向量
v
v
v对应的特征值,矩阵的特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:
A
=
Q
Σ
Q
−
1
A = Q\Sigma Q^{-1}
A=QΣQ−1
其中
Q
Q
Q是这个矩阵
A
A
A的特征向量组成的矩阵,
Σ
\Sigma
Σ是一个对角阵,每一个对角线上的元素就是一个特征值。求特征值和特征向量分别使用以下方程
d
e
t
(
A
−
λ
I
)
=
0
(1)
det(A -\lambda I) = 0\tag{1}
det(A−λI)=0(1)
(
A
−
λ
I
)
∗
x
=
0
(2)
(A- \lambda I) *x = 0\tag{2}
(A−λI)∗x=0(2)
计算
计算过程是先求解行列式
(
1
)
(1)
(1),得到特征值
λ
\lambda
λ,然后分别将特征值代入方程
(
2
)
(2)
(2)求得对应的特征向量
x
x
x。
[
0.7
−
λ
0.2
0.3
0.8
−
λ
]
=
0
\left[\begin{matrix} 0.7-\lambda & 0.2 \\ 0.3 & 0.8-\lambda \\ \end{matrix}\right] = 0
[0.7−λ0.30.20.8−λ]=0
解方程得到
λ
=
[
0.5
,
1
]
\lambda = [0.5,1]
λ=[0.5,1]。
当
λ
=
0.5
\lambda = 0.5
λ=0.5时,有
[
0.2
0.2
0.3
0.3
]
[
x
1
x
2
]
=
0
\left[\begin{matrix} 0.2 & 0.2 \\ 0.3 & 0.3 \\ \end{matrix}\right]\left[\begin{matrix} x1 \\ x2 \end{matrix}\right] = 0
[0.20.30.20.3][x1x2]=0
解得
x
1
=
−
x
2
x_1 = -x_2
x1=−x2,即属于特征值
λ
1
=
0.5
\lambda_1=0.5
λ1=0.5有特征向量
[
0.707
,
−
0.707
]
T
[0.707,-0.707]^T
[0.707,−0.707]T,这里做了归一化,要求
∣
∣
x
∣
∣
=
1
||x|| = 1
∣∣x∣∣=1。同理可以求得属于特征值
λ
2
=
1
\lambda_2 = 1
λ2=1的特征向量
[
−
0.5547
,
−
0.832
]
T
[-0.5547,-0.832]^T
[−0.5547,−0.832]T。
代码
python 代码和输出结果如下
import numpy as np
A = np.array([[0.7, 0.2],[0.3, 0.8]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print('eigenvlues are', eigenvalues)
print('eigenvectors are \n',eigenvectors)
eigenvlues are [0.5 1. ]
eigenvectors are
[[-0.70710678 -0.5547002 ]
[ 0.70710678 -0.83205029]]
其他解释
(以下部分来自其他人的博客)
首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵:
M
=
[
3
0
0
1
]
M = \left [\begin{matrix} 3 & 0 \\ 0 & 1 \\ \end{matrix}\right]
M=[3001]
它其实对应的线性变换是下面的形式:
因为这个矩阵
M
M
M乘以一个向量
[
x
,
y
]
T
[x,y]^T
[x,y]T的结果是:
[
3
0
0
1
]
∗
[
x
y
]
=
[
3
x
y
]
\left [\begin{matrix} 3 & 0\\ 0 & 1 \\ \end{matrix}\right] * \left[\begin{matrix} x\\ y\\ \end{matrix}\right] = \left[\begin{matrix} 3x\\y\end{matrix}\right]
[3001]∗[xy]=[3xy]
上面的矩阵是对称的,所以这个变换是一个对
x
,
y
x,y
x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值
>
1
>1
>1时拉长,当值
<
1
<1
<1时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子:
M
=
[
1
1
0
1
]
M =\left [\begin{matrix} 1 & 1 \\ 0 & 1 \\ \end{matrix}\right]
M=[1011]
它所描述的变换是下面的样子:
这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)
当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。