1 马尔科夫链
矩阵的特征值,在马尔科夫链中应用非常广泛。什么是马尔科夫链呢?马尔科夫链是一个概率矩阵。所谓的概率矩阵是有N个概率向量组成的。举个例子,假如有一个移民模型,这个模型里,由北京移民到上海的概率为0.3,上海移民到北京的概率为0.4。
那么设初始北京有1000万人,上海有1200万人。
第一次移民后北京的人口为留在北京的
1000
×
0.7
1000\times0.7
1000×0.7 +上海移民过来的
1200
×
0.4
1200 \times 0.4
1200×0.4。
第一次移民后上海的人口为留在上海的
1200
×
0.6
1200\times0.6
1200×0.6 +北京移民过来的
1000
×
0.3
1000\times0.3
1000×0.3 。
这其实就是矩阵乘以向量嘛。
(
0.7
0.4
0.3
0.6
)
×
(
1000
1200
)
\begin{pmatrix} 0.7 &0.4 \\ 0.3 &0.6 \end{pmatrix}\times\begin{pmatrix}1000\\1200\end{pmatrix}
(0.70.30.40.6)×(10001200)
那么概率矩阵为:
(
0.7
0.4
0.3
0.6
)
\begin{pmatrix} 0.7 &0.4 \\ 0.3 &0.6 \end{pmatrix}
(0.70.30.40.6)
因为概率的总和是1,所以概率矩阵的每个概率向量,向量里的数字加起来和为1。初始向量为:
(
1000
1200
)
\begin{pmatrix}1000\\1200\end{pmatrix}
(10001200)
我们可以用python代码试验这个过程。
from com.youngthing.mathalgorithm.matrix import Matrix
if __name__ == '__main__':
probability = Matrix([[0.7, 0.4], [0.3, 0.6]])
vector = Matrix([[1000], [1200]])
for i in range(1, 100):
vector = probability * vector
print(i, "vector=", vector.lines[0][0], vector.lines[1][0])
print("vector=", vector)
在第i=29时,这个向量不再变化,也就是说北京和上海的人口不再变化。python运行结果如下:
29 vector= 1257.1428571428564 942.8571428571427
30 vector= 1257.1428571428564 942.8571428571424
31 vector= 1257.1428571428564 942.8571428571424
这个向量叫做马可夫链的稳态向量。
那么稳态向量怎么求呢?如果用上面的循环代码求,那也太蠢了。
稳态向量的求法是用公式:
A
p
=
p
A
p
−
p
=
0
(
A
−
I
)
p
=
0
Ap=p\\ Ap-p=0\\ (A-I)p=0
Ap=pAp−p=0(A−I)p=0
所以解
(
A
−
I
)
p
=
0
(A-I)p=0
(A−I)p=0这个方程就可以了
但是因为稳态向量有多个,所以最好取一个总和为1的向量。所以python代码如下:
def steady_state_vector(self):
# 首先构造矩阵A-I
size = len(self.__lines)
unit_matrix = Matrix(self.unit_matrix(size))
# A - I = 0
final_matrix = (self - unit_matrix).append(Matrix([[0] for _ in self.__lines]))
# 最后概率总和=1
# 不要第一行
final_matrix.__lines[0] = [1 for _ in final_matrix.lines[0]]
print(final_matrix)
return final_matrix.gaussian_reduction()
这里新加了矩阵的减法:
def __sub__(self, other):
return Matrix([[e - other.__lines[y][x] for x, e in enumerate(line)] for y, line in enumerate(self.__lines)])
2 特征值与特征向量
特征值与特征向量和马尔科夫链的稳态向量概念相似。特征值是这样定义的:
对于矩阵A和一个非零向量v,如果有:
A
v
=
λ
v
Av=\lambda v
Av=λv
那么
λ
\lambda
λ就是A的特征值,v就是A的特征向量。和马尔科夫链的稳态向量对比一下:
A
p
=
p
Ap=p
Ap=p
可见马尔可夫链的稳态向量就是特征值
λ
=
1
\lambda=1
λ=1的特殊场景而已。特征向量有无穷多个,但是特征值的个数是有限的。从特征值的几何意义就是,矩阵不过是把某些向量给延长(或缩短)了而已。
3 行列式法求特征值
求特征值的通用方法,就是大学课本教给我们的方法。
A
v
−
λ
v
=
0
(
A
−
λ
I
)
v
=
0
d
e
t
(
A
−
λ
I
)
=
0
Av-\lambda v=0\\ (A-\lambda I)v=0\\ det(A-\lambda I)=0
Av−λv=0(A−λI)v=0det(A−λI)=0
为什么要取行列式为0呢?因为行列式不为0,只有0解,0向量是不能作为特征向量的。
但是为了避免首项的系数是负数,要把
d
e
t
(
A
−
λ
I
)
=
0
det(A-\lambda I)=0
det(A−λI)=0换成
d
e
t
(
λ
I
−
A
)
=
0
det(\lambda I-A)=0
det(λI−A)=0。
对
d
e
t
(
λ
I
−
A
)
=
0
det(\lambda I-A)=0
det(λI−A)=0的计算,会得到一个多项式方程,这个多项式方程就叫做特征方程。举个例子:
A
=
(
2
1
−
1
1
2
−
1
−
1
−
1
2
)
λ
I
−
A
=
(
λ
−
2
1
−
1
1
λ
−
2
−
1
−
1
−
1
λ
−
2
)
d
e
t
(
λ
I
−
A
)
=
λ
3
−
6
λ
2
+
9
λ
−
4
=
(
λ
−
1
)
2
(
λ
−
4
)
=
0
λ
1
=
λ
2
=
1
,
λ
3
=
4
A=\begin{pmatrix} 2& 1& -1\\ 1& 2& -1\\ -1& -1& 2 \end{pmatrix}\\ \lambda I-A=\begin{pmatrix} \lambda-2& 1& -1\\ 1& \lambda-2& -1\\ -1& -1& \lambda-2 \end{pmatrix}\\ det(\lambda I-A)=\lambda^3 - 6\lambda^2 + 9\lambda - 4\\ =(\lambda-1)^2(\lambda-4)=0\\ \lambda_1=\lambda_2=1,\lambda_3=4
A=
21−112−1−1−12
λI−A=
λ−21−11λ−2−1−1−1λ−2
det(λI−A)=λ3−6λ2+9λ−4=(λ−1)2(λ−4)=0λ1=λ2=1,λ3=4
在上面的例子中
λ
3
−
6
λ
2
+
9
λ
−
4
=
0
\lambda^3 - 6\lambda^2 + 9\lambda - 4=0
λ3−6λ2+9λ−4=0就是矩阵的特征方程。
那对于复杂的矩阵,特征方程怎么求呢?接下来,我会介绍一种机械的方法,也就是用矩阵的迹来求特征多项式,就是我的下一篇文章:5.2 用迹求特征多项式。
单位特性向量
因为每个特征值对应的特征向量可以有多个,为了标准化,把长度为1的特征向量定为标准特征向量,也叫单位特征向量normalized eigenvector。具体的计算比较简单,就是将向量的各个坐标都除于向量的长度,就完成了单位化。