《概率统计》9.状态转移:初识马尔科夫链
回顧兩類重要的隨機過程
在上一篇隨機過程的概述中,我們提到過兩類非常非常典型且重要的隨機過程,一類是:伯努利過程和泊松過程,這一類隨機過程是無記憶性的,也就是說未來的狀態不依賴于過去的狀態——新的“成功”或“到達”不依賴于該過程過去的歷史情況。
而另一類則正好相反,未來的情況會依賴于過去的情況,并且能夠在某種程度上通過過去發生的情況去預測未來,例如這一篇我們的核心內容——馬爾科夫過程,它在許許多多的領域都有深入和廣泛的應用。
離散時間的馬爾科夫鏈
馬爾科夫鏈三要素
這是一類隨著時間而發生狀態變換的過程,因此分為離散時間的馬爾科夫鏈和連續時間的馬爾科夫鏈兩類。我們首先考慮離散時間的馬爾科夫鏈,它的狀態在確定的離散時間點上發生變化。
離散時間的馬爾科夫鏈有三個核心概念點:離散時間、狀態空間、轉移概率。
在離散時間的馬爾科夫鏈中,我們通常使用 n 來表示時刻,用 Xn 來表示馬爾科夫鏈在此時的狀態,那么顯然馬爾科夫鏈所有的狀態會構成一個集合 S,這個集合 S 我們把它稱作是這個離散時間馬爾科夫鏈的狀態空間。
那么,在這個狀態空間的基礎之上,我們來討論馬爾科夫鏈的第二個概念:轉移概率。轉移概率是這么描述的:當離散時間的馬爾科夫鏈當前的狀態是 i 時,下一個狀態等于 j 的概率就是轉移概率,我們記作是 (P_{ij})。
轉移概率 (P_{ij}) 本質上用一個條件概率就可以表達:
(P_{ij} = P(X_{n+1} = j| X_{n} = i), i,j ∈S)
我們舉一個擁有三個狀態的離散時間馬爾科夫鏈,它的轉移概率圖如下:
在這幅圖中標明的是"古明地覺"的三種狀態,每天他都處于這三種狀態中的一種:要么宅在家中,要么在外面運動,要么吃美食。這就是"古明地覺"的狀態空間,如果今天"古明地覺"宅在家中,明天他仍然宅在家中的概率是 0.2,明天出去吃美食的概率是 0.6,明天出去運動的概率是 0.2,這就是他的幾個轉移概率。
馬爾科夫性
如果我們說離散時間、狀態空間和轉移概率是離散時間馬爾科夫鏈的構成要素,那么馬爾科夫性則是它的靈魂特征。
這個特性具體描述為:只要時刻 n 馬爾科夫鏈的狀態為 i,不論過去發生了什么,也不論馬爾科夫鏈是如何到達狀態 i 的,下一個時刻 n+1 轉移到狀態 j 的概率一定都是轉移概率(P_{ij})
我們還是用上面的圖例來說明,比如"古明地覺"今天是在吃美食,那么不管她昨天是在運動還是宅在家中,他明天出去運動的概率都不變,就是 0.3,出去繼續吃美食的概率也不變,還是 0.6。概況的說來就是:下一個狀態只與當前狀態有關,而與更早的歷史狀態無關。
語言上七七八八的說了這么多,又是舉例子,又是理論術語的,其實落實在數學語言的表達上,還是一個條件概率等式的事兒:
即對任意的時刻 n,對狀態空間中的任意狀態 i, j ∈ S,以及時刻n前(也就是歷史上的)任何可能的狀態序列(i_{0},i_{1},...,i_{n-1}),均有:
(P(X_{n+1} = j|X_{n}=i,X_{n-1}=i-1,...,x_{0}=i_0) = P(X_{n+1} = j|X_n=i) = P_{ij})
很清楚也很直白:下一個狀態 (X_{n+1})的狀態只依賴于前一個狀態(X_n)
轉移概率和狀態轉移矩陣
那么問題來了,這個轉移概率(P_{ij})具有什么樣的性質呢?首先(P_{ij})必須滿足非負性,這是必須的
其次再有(∑_{j=1}^{m}P_{ij} = 1),這個等式對于所有的i都成立。其實這個很好理解,我們還是對照著上面那個"古明地覺"的狀態圖來看。比如她今天宅在家中,那么她明天繼續宅在家中的概率是 0.2,明天出去運動的概率是 0.2,明天出去吃美食的概率是 0.6,不管這三個概率如何取值,如何分配,有一點是肯定的,就是三者相加必須等于 1。
我們關注一下這里特殊一點的情況,即當 i=j 時,(P_{ij}) 的取值問題。其實就是對應了"古明地覺"今天宅在家中,明天繼續宅在家中的情況。雖然狀態沒有發生變化,但是我們可以認為是狀態發生了一次特殊的轉移,也就是自身轉移。
在狀態空間 S 中,任意兩個狀態 i 和 j 之間都有一個轉移概率(P_{ij}),并且滿足(P_{ij})?≥ 0(當狀態 i 無法轉移到狀態 j 的時候,(P_{ij})=0)。那么我們可以把狀態空間中的狀態間的所有轉移概率按照順序組織成一個二維矩陣,其中第i行、第j列的元素就是(P_{ij}),那么這個二維矩陣:
就稱為是轉移概率矩陣,它刻畫了對應的馬爾科夫鏈的本質。
我們沿用"古明地覺"的例子:我們令狀態 1 為宅在家中;狀態 2 為運動;狀態 3 為吃美食,那么這個馬爾科夫鏈就是一個 3×3 的 2 維矩陣。
馬爾科夫鏈性質的總結
到這里,我們有必要停下來梳理一下馬爾科夫鏈的最基本性質,一個馬爾科夫鏈由以下主要特征確定:
第一是狀態集合S = {1, 2, 3, ..., m}
第二是可能發生狀態轉移的(i, j),即那些(P_{ij} > 0)的狀態對;
第三是(P_{ij})的取值;
而這三點都可以最終由一個二維的轉移概率矩陣所描述。
并且由該上述特征所描述的馬爾科夫鏈是一個隨機變量序列(X_{0},X_{1},X_{2},...,X_{n}),它們取值于狀態空間S,并且滿足:對于任意的時間n,所有狀態i,j∈S,以及之前所有可能的狀態序列:(i_{0},i_{1},...,i_{n}),均有:
(P(X_{n+1} = j|X_{n}=i,X_{n-1}=i-1,...,x_{0}=i_0) = P(X_{n+1} = j|X_n=i) = P_{ij})
一步到達與多步轉移
剛才我們花大篇幅介紹的轉移概率(P_{ij})給出的是從狀態i一步到達狀態j的轉移概率(P_{ij} = P(X_{n+1}=j|X_{n}=i))。那么我們進一步拓展,我們不是通過一步,而是通過m步(其中m>1)從狀態i轉移到狀態j,那么這個對應的就是m步的狀態轉移概率。
寫成條件概率的形式就是:
(P^{m}(i, j) = P(X_{n+m} = j|X_{n} = i))
這里我們換一個例子來看看,社會的流動性問題是大家都非常關注的一個問題,社會的流動性強,社會的底層通過自身的努力使得家族向社會中層甚至上層流動是社會始終保持活力重要推動力。
社會學中就有一個非常有名的反映社會階層流動的馬爾科夫鏈,在這個馬爾科夫鏈的狀態空間中,有三個狀態,狀態 1 是處于貧困水平,狀態 2 是中產階級,狀態 3 是財富自由,它的狀態轉移矩陣為:
我們不討論這里面數據的合理性和準確性,單單就事論事,如(P_{13}=0.1),表示如果這一代人處于貧困水平,下一代人想成為財富自由的概率為 0.1,而繼續處于貧困水平的概率要大得多,為 0.7。而如果這一代人處于財富自由的水平,那么他的下一代處于財富自由的概率也要大不少,為 0.4。
那么,我們現在思考這么一個問題,假設爺爺處于貧困水平(狀態 1),那么父親處于中產階級(狀態 2),而你處于財富自由水平(狀態 3)的概率有多大?
從哪里入手呢?還是緊扣定義,從條件概率表達式入手:
(P(X_{2}=3,X_{1}=2|X_{0}=1)) =?$ P(X_{2}=3,X_{1}=2,X_{0}=1) over P(X_{0}=1)$
=(P(X_{2}=3,X_{1}=2,X_{0}=1) over P(X_{1}=2,X_{0}=1))?· (P(X_{1}=2,X_{0}=1) over P(X_{0}=1))
=(P(X_{2}=3|X_{1}=2,X_{0}=1) · P(X_{1}=2,X_{0}=1))
由于這是一個馬爾科夫鏈,因此滿足:
(P(X_{2}=3|X_{1}=2,X_{0}=1) = P(X_{2}=3|X_{1}=2))
因此有:
(P(X_{2}=3,X_{1}=2|X_{0}=1) = P(X_{2}=3|X_{1}=2)P(X_{1}=2|X_{0}=1))
對應到轉移概率矩陣中,就是從狀態 1 轉移到狀態 2 的概率乘以從狀態 2 轉移到狀態 3 的概率:
(P_{12}P_{23} = 0.2·0.2 = 0.04)
接下來我們不指定父親的狀態,只看這么一個問題,就是假設爺爺是貧困水平(狀態 1),問孫子處于財富自由(狀態 3)狀態的概率有多大?
那么這里只指定了爺爺和孫子所處的狀態,那么父親這一代可以是處于貧窮、中產和財富自由中的任意一種狀態,那么這個概率的表達式寫起來也很簡單:
(P(X_{2}=3|X_{0}=1) = P(X_{2}=3,X_{1}=1|X_{0}=1) + P(X_{2}=3,X_{1}=3|X_{0}=1)=P_{11}P_{13}+P_{12}P_{23}+P_{13}P_{33})
(=∑_{k=1}^{3}P_{1k}P_{k3}=0.7·0.1+0.2·0.2+0.1·0.4=0.15)
上面具體計算出來的結果對我們而言其實并不重要,我們重點還是回過頭來看這個式子:
(P(X_{2}=3|X_{0}=1) = P_{11}P_{13}+P_{12}P_{23}+P_{13}P_{33})
對線性代數熟悉的同學應該對這個等式很敏感,它實際上就是
該轉移矩陣中,第一行和第三列點乘的結果,如果按照矩陣相乘的運算法則,這個計算出來的結果恰好位于結果矩陣的第一行第三列,也正對應了從狀態 1 到狀態 3,兩步狀態轉移的概率值。
試想,如果我們將概率轉移矩陣與自身相乘,也就是求它的二次冪,即:
那么得到的新的 3×3 的二維矩陣里就包含了所有狀態間,通過兩步到達的概率值:
import numpy as np
A = np.array([[0.7, 0.2, 0.1],
[0.3, 0.5, 0.2],
[0.2, 0.4, 0.4]])
print(A @ A)
"""
[[0.57 0.28 0.15]
[0.4 0.39 0.21]
[0.34 0.4 0.26]]
"""
從結果中我們可以看出,第一行第三列確實就是我們剛剛求出來的概率值 0.15。
那么以此類推,我們想看看 n 步狀態轉移概率,那么就是求取上面的狀態轉移矩陣的n次冪
from functools import reduce
import numpy as np
A = np.array([[0.7, 0.2, 0.1],
[0.3, 0.5, 0.2],
[0.2, 0.4, 0.4]])
print(np.array(reduce(np.ndarray.__matmul__, [A] * 3)))
"""
[[0.513 0.314 0.173]
[0.439 0.359 0.202]
[0.41 0.372 0.218]]
"""
print(np.array(reduce(np.ndarray.__matmul__, [A] * 5)))
"""
[[0.47683 0.3353 0.18787]
[0.46251 0.34373 0.19376]
[0.45662 0.34708 0.1963 ]]
"""
print(np.array(reduce(np.ndarray.__matmul__, [A] * 10)))
"""
[[0.46823165 0.34033969 0.19142866]
[0.4679919 0.34048014 0.19152797]
[0.46789259 0.3405383 0.19156911]]
"""
print(np.array(reduce(np.ndarray.__matmul__, [A] * 20)))
"""
[[0.46808515 0.34042551 0.19148934]
[0.46808508 0.34042555 0.19148937]
[0.46808505 0.34042556 0.19148938]]
"""
print(np.array(reduce(np.ndarray.__matmul__, [A] * 100)))
"""
[[0.46808511 0.34042553 0.19148936]
[0.46808511 0.34042553 0.19148936]
[0.46808511 0.34042553 0.19148936]]
"""
很顯然,隨著 n 的逐漸增大,n 步狀態轉移矩陣收斂于:
[[0.46808511 0.34042553 0.19148936]
[0.46808511 0.34042553 0.19148936]
[0.46808511 0.34042553 0.19148936]]
我們發現,它每行的三個元素都是一模一樣的,這說明不論你現在是貧窮水平、中產階級還是財富自由,過了很多代以后,你的后代落入到三個階層中任意一個階層的概率都是一定的。而且最大的概率都是變成貧困階層。當然這個只是我們依據給定的數據計算而來,具體是否符合社會學的常識,就不是我們所關心的問題了。不過確實也說明,富有從來不是一件容易的事兒。
最后我們看看由 n 步轉移概率所派生出來的路徑概率問題。
給定一個馬爾科夫鏈模型,我們可以計算未來任何一個給定狀態序列的概率,特別的我們有:
(P(X_{0}=i_{0},X_{1}=i_{1},...,X_{n}=i_{n})=P(X_{0}=i_{0})P_{i_{0}i_{1}}P_{i_{1}i_{2}}···P_{i_{n-1}i_{n}})
這個結合馬爾可夫性和條件概率的描述形式,說明起來也是非常簡單。
首先由貝葉斯定理可得:
(P(X_{0}=i_{0},X_{1}=i_{1},...,X_{n}=i_{n})=P(X_{n}=i_{n}|X_{0}=i_{0},X_{1}=i_{1},...,X_{n-1}=i_{n-1})P(X_{0}=i_{0},X_{1}=i_{1},X_{2}=i_{2},...X_{n-1}=i_{n-1}))
然后依照馬爾可夫性:
(P(X_{n}=i_{n}|X_{0}=i_{0},X_{1}=i_{1},...,X_{n-1}=i_{n-1})=P(X_{n}=i_{n}|X_{n-1}=i_{n-1}) = P_{i_{n-1}i_{n}})
從而得到:
(P(X_{0}=i_{0},X_{1}=i_{1},...,X_{n}=i_{n})= P_{i_{n-1}i_{n}}P(X_{0}=i_{0},X_{1}=i_{1},...,X_{n-1}=i_{n-1}))
然后我們在這個式子的基礎上不斷遞推就能得到最開始的:
(P(X_{0}=i_{0},X_{1}=i_{1},...,X_{n}=i_{n})= P(X_{0}=i_{0})P_{i_{0}i_{1}}P_{i_{1}i_{2}}···P_{i_{n-1}i_{n}})
這個路徑問題舉個例子就很好理解了,比如從你的太爺爺開始,太爺爺是貧窮,爺爺是貧窮,爸爸是中產,你是財富自由,你兒子中產,你孫子貧窮,這就是一個路徑,當然是一個非常悲劇,典型的努力拼搏最后又富不過三代的悲劇路徑:那么路徑概率是(P(X_{0}=1)P_{11}P_{12}P_{23}P_{32}P_{21}),最左邊的 (P(X_{0}=1)) 表示太爺爺是貧窮的概率,這個值指定了,整個路徑的概率就可以計算出來了。
總結
以上是生活随笔為你收集整理的《概率统计》9.状态转移:初识马尔科夫链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android之styles.xml,以
- 下一篇: 网站页面设计中如何定位网站页面颜色