本文将在前面介绍的动力系统的基础上,解释马尔科夫链的知识
首先介绍一下概念,马尔科夫链是由具有以下性质的一系列事件构成的过程:
- 一个事件有有限多个结果,称为状态,该过程总是这些状态中的一个;
- 在过程的每个阶段或者时段,一个特定的结果可以从它现在的状态转移到任何状态,或者保持原状;
- 每个阶段从一个状态转移到其他状态的概率用一个转移矩阵表示,矩阵每行的各元素在0到1之间,每行的和为1。
实例:选举投票趋势的预测(实例来自于华章数学译丛版《数学建模》)
以美国大选为例,首先取得过去十次选举的历史数据,然后根据历史数据得到选民意向的转移矩阵。我们假设得到了如下的转移矩阵(很明显这个数据不是真实的):
这样就形成了一个差分方程组
Rn+1 = 0.75Rn+0.20Dn+0.40In
Dn+1 = 0.05Rn+0.60Dn+0.20In
In+1 = 0.20Rn+0.20Dn+0.40In
根据我们以前将差分方程组的内容,可以推测出选民投票意向的长期趋势
import matplotlib.pyplot as plt
RLIST = [0.33333]
DLIST = [0.33333]
ILIST = [0.33333]
for i in range(40):
R = RLIST[i]*0.75 + DLIST[i]*0.20 + ILIST[i]*0.40
RLIST.append(R)
D = RLIST[i]*0.05 + DLIST[i]*0.60 + ILIST[i]*0.20
DLIST.append(D)
I = RLIST[i]*0.20 + DLIST[i]*0.20 + ILIST[i]*0.40
ILIST.append(I)
plt.plot(RLIST)
plt.plot(DLIST)
plt.plot(ILIST)
plt.xlabel('Time')
plt.ylabel('Voting percent')
plt.annotate('DemocraticParty',xy = (5,0.2))
plt.annotate('RepublicanParty',xy = (5,0.5))
plt.annotate('IndependentCandidate',xy = (5,0.25))
plt.show()
print(RLIST,DLIST,ILIST)
最后得到的长期趋势是:56%的人选共和党、19%的人选民主党、25%的人选独立候选人。
这个问题还可以直接用矩阵来解
关于马尔科夫链的转移矩阵性质还有一个定理叫Chapman-kolmogorov方程:
也就是说P(m) = (Pij(m))是从状态i到状态j的m步转移矩阵。熟悉矩阵运算的朋友应该很容易就能证明出来。
我们已经得到了一步转移矩阵,只需做个迭代就可以了:
import numpy as np
a = np.array([[0.75,0.05,0.20],[0.20,0.60,0.20],[0.40,0.20,0.40]])
p = np.mat(a)
for i in range(40):
p = p*p
print(p)```
得到40步转移矩阵:
```[[ 0.55560086 0.1944603 0.25002039]
[ 0.55560086 0.1944603 0.25002039]
[ 0.55560086 0.1944603 0.25002039]]```
跟前面差分方程模拟结果一致,实际应用中往往使用这种方式来求解。
> 想了解马尔科夫链的升级版隐马尔可夫模型的朋友可以移步知乎:
[如何用简单易懂的例子解释隐马尔科夫模型](https://www.zhihu.com/question/20962240)