美文网首页个人专题Python建模与NLP工具癖
动力系统的马尔科夫链——Python数学建模极简入门(九)

动力系统的马尔科夫链——Python数学建模极简入门(九)

作者: dalalaa | 来源:发表于2017-04-09 08:51 被阅读438次

本文将在前面介绍的动力系统的基础上,解释马尔科夫链的知识

首先介绍一下概念,马尔科夫链是由具有以下性质的一系列事件构成的过程:

  1. 一个事件有有限多个结果,称为状态,该过程总是这些状态中的一个;
  2. 在过程的每个阶段或者时段,一个特定的结果可以从它现在的状态转移到任何状态,或者保持原状;
  3. 每个阶段从一个状态转移到其他状态的概率用一个转移矩阵表示,矩阵每行的各元素在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方程:

C-K方程

也就是说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)

相关文章

网友评论

    本文标题:动力系统的马尔科夫链——Python数学建模极简入门(九)

    本文链接:https://www.haomeiwen.com/subject/qyzrattx.html