本文將在前面介紹的動力系統(tǒng)的基礎上焰檩,解釋馬爾科夫鏈的知識
首先介紹一下概念,馬爾科夫鏈是由具有以下性質(zhì)的一系列事件構(gòu)成的過程:
- 一個事件有有限多個結(jié)果专控,稱為狀態(tài)沾歪,該過程總是這些狀態(tài)中的一個;
- 在過程的每個階段或者時段鸯匹,一個特定的結(jié)果可以從它現(xiàn)在的狀態(tài)轉(zhuǎn)移到任何狀態(tài)坊饶,或者保持原狀;
- 每個階段從一個狀態(tài)轉(zhuǎn)移到其他狀態(tài)的概率用一個轉(zhuǎn)移矩陣表示殴蓬,矩陣每行的各元素在0到1之間匿级,每行的和為1。
實例:選舉投票趨勢的預測(實例來自于華章數(shù)學譯叢版《數(shù)學建娜咎》)
以美國大選為例痘绎,首先取得過去十次選舉的歷史數(shù)據(jù),然后根據(jù)歷史數(shù)據(jù)得到選民意向的轉(zhuǎn)移矩陣肖粮。我們假設得到了如下的轉(zhuǎn)移矩陣(很明顯這個數(shù)據(jù)不是真實的):
轉(zhuǎn)移矩陣
三狀態(tài)馬爾科夫鏈
這樣就形成了一個差分方程組
Rn+1 = 0.75Rn+0.20Dn+0.40In
Dn+1 = 0.05Rn+0.60Dn+0.20In
In+1 = 0.20Rn+0.20Dn+0.40In
根據(jù)我們以前將差分方程組的內(nèi)容孤页,可以推測出選民投票意向的長期趨勢
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%的人選獨立候選人行施。
這個問題還可以直接用矩陣來解
關(guān)于馬爾科夫鏈的轉(zhuǎn)移矩陣性質(zhì)還有一個定理叫Chapman-kolmogorov方程:
C-K方程
也就是說P(m) = (Pij(m))是從狀態(tài)i到狀態(tài)j的m步轉(zhuǎn)移矩陣允坚。熟悉矩陣運算的朋友應該很容易就能證明出來。
我們已經(jīng)得到了一步轉(zhuǎn)移矩陣悲龟,只需做個迭代就可以了:
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步轉(zhuǎn)移矩陣:
```[[ 0.55560086 0.1944603 0.25002039]
[ 0.55560086 0.1944603 0.25002039]
[ 0.55560086 0.1944603 0.25002039]]```
跟前面差分方程模擬結(jié)果一致屋讶,實際應用中往往使用這種方式來求解。
> 想了解馬爾科夫鏈的升級版隱馬爾可夫模型的朋友可以移步知乎:
[如何用簡單易懂的例子解釋隱馬爾科夫模型](https://www.zhihu.com/question/20962240)