美文网首页个人专题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