M4.0 明天的天氣只看今天:Markov Chain 與 Transition Matrix
從一份氣象紀錄開始
你手上有一個城市過去幾年的天氣紀錄,每天只記「晴」或「雨」。翻過幾頁之後你發現一個規律:晴天的隔天有八成還是晴天;雨天的隔天有四成會放晴。 沒有別的訊息——前天、上週、季節都先不看。
先把這當成一個模型:明天只依賴今天,而且規則每天相同。今天是晴天,想知道:
- 接下來三天都是晴天的機率大概多少?
- 一百天之後那一天是晴天的機率大概多少?——它還跟「今天是晴天」有關嗎?
第一題可以沿著「晴、晴、晴」這條路相乘。第二題卻不能只乘 :中間可能下雨、再放晴,有很多條路會抵達第 100 天的晴天。要怎麼把所有可能的中間狀態一起算進來? 一張轉移表加上 distribution,就能把這些路逐步加總。
課堂提問Q1
先不急著算。把「晴天的隔天八成晴、雨天的隔天四成晴」翻成數學:這裡的隨機變數是什麼?我們要算的量又是什麼?「只看今天」這個假設在數學上要怎麼寫?
先想一想,再展開看整理後的答案
最直覺的說法是「隨機變數是天氣」,這是對的但不夠精確——每一天各有一個。令 是第 天的天氣(S 晴、R 雨), 是今天。一整串 是一個 stochastic process(隨時間演進的一串隨機變數)。
「只看今天」寫成一條關於 conditional probability 的等式:
給了今天,再多給過去任何資訊都不改變明天的分佈。這叫 Markov property。紀錄裡那兩個數字則是另一個假設: 不隨 變(time-homogeneous,規則每天一樣)。
我們要算的量有兩個:第一題是一個聯合事件的機率 ;第二題是一個邊際分佈 。兩個都只由那兩個數字決定——這正是 Markov property 的威力:整個過程的所有機率,都由「一步的規則」生出來。
先抓住這個畫面
想像一顆棋子在兩個格子之間跳。每一天它擲一次骰子決定要不要換格子:站在「晴」格時,八成留下、兩成跳到「雨」格;站在「雨」格時,六成留下、四成跳回「晴」格。棋子沒有記憶——它不知道自己在這一格已經待了幾天,每天擲的骰子都一樣。
現在不放一顆棋子,放一千顆,全部從「晴」格出發。第一天結束後約八百顆留在「晴」、兩百顆到了「雨」。第二天,「晴」格裡的八百顆有八成留下(640),「雨」格裡的兩百顆有四成回來(80),所以「晴」格有 720 顆。第三天再算一次……你會看到「晴」格的數量往某個值靠過去,然後不再動。那個不再動的分配,就是這一篇要找的東西。 而「往它靠過去」的速度,決定了「一百天後跟今天有沒有關係」。
圖:反覆套用同一個 transition matrix 會忘掉起點,並靠向流量平衡的 stationary distribution。
把畫面寫成矩陣
把「一步的規則」排成一張表,列是今天、欄是明天:
這叫 transition matrix。它每一列的和都是 1(今天是 ,明天總得在某一格),元素都非負;符合這兩個條件的矩陣叫 stochastic matrix。
把「今天的分佈」寫成列向量 。明天的分佈是
這一行是 law of total probability:明天在 ,要嘛今天在 S 然後跳到 ,要嘛今天在 R 然後跳到 。再走一天就是再乘一次,所以
矩陣乘法就是「把一步的規則連續套 次」。 兩步的轉移 是「先到某個中繼 、再到 」對所有 加總,這叫 Chapman–Kolmogorov 等式,它只是矩陣乘法的定義。
第一題現在是三個條件機率相乘(Markov property 讓每一步只看前一步):
直覺答案對了,而且現在知道它為什麼對:三個 能直接相乘,靠的正是 Markov property;如果「連晴兩天後第三天更容易下雨」,這條就不成立。
不再動的分配
一個分佈 如果滿足
就叫 stationary distribution:今天的分配是 ,明天還是 。用 2 狀態手算, 的第一個分量是 ,整理成 。讀法:每天從 S 流出的量等於從 R 流回的量(流量平衡)。加上 得
一般地, 是 eigenvalue 對應的非負、總和為 1 的左 eigenvector。有限 stochastic matrix 至少有一個這樣的 distribution;不只是找到任意 eigenvector 就可以當機率。若任兩狀態互相到得了(irreducible),它才唯一。
多快忘掉今天
第二題問的是 。用 把 分解成「極限」加「離極限的差」。令 。從 可得
(驗算: 時 ,正確。)那個 是 的第二個 eigenvalue 。今天的影響每天縮成 倍:五天後剩 ,一百天後是 ,什麼都不剩。
所以第二題的答案是 ,跟今天是晴是雨無關。「各半」錯在忽略了規則不對稱(晴天比雨天黏);「八成」錯在把「一天的規則」當成「長期的比例」——晴天雖然八成留下,但一旦掉進雨天要花幾天才回來,長期比例是兩種黏性相對強弱的結果,。
展開細節一般的收斂敘述:Perron–Frobenius 給的三件事
有限狀態、irreducible 且 aperiodic 的 chain 有唯一的 ,而且任意 都收斂到它 [1, 3]。本篇兩狀態例子的差距精確乘上 ;一般矩陣若有非平凡 Jordan block,還可能多出 polynomial factor,不能一律寫成 。若其他 eigenvalues 的最大 modulus 是 ,對任意 ,可用 作幾何上界。可對角化、特別是 reversible 的情況,才有更直接的 spectral bound。
另外, 還有一個「時間平均」的意義:一條單一軌跡裡,晴天所佔的天數比例以機率 1 收斂到 (ergodic theorem)。這是為什麼「一千顆棋子的分配」與「看一條紀錄很多年」會給同一個 。
回頭看那兩個直覺
在這個固定轉移表下,連續三天晴的機率是 ;從晴天出發,第 100 天晴的機率則是 。它極接近 ,但有限時間不是真的完全與初始狀態無關。長期比例由流量平衡決定,接近它的速度才由剩下的 eigenvalue 控制。
若轉移表隨季節改變,就要用各時刻的 ,不能直接用固定 P 的結論;它們仍可能剛好共享同一個 stationary distribution。若規則依賴更長的歷史,也要把足夠的歷史納入狀態。最後,irreducible chain 若有週期,從一般初始分布出發未必收斂:例如每天晴雨互換,從全晴開始就永遠交替;從 開始卻仍保持 。
動手跑一次
理論預測有三個數字可以對:、、以及「 每天縮 倍」。用十行程式驗證,然後刻意違反一個假設。
import numpy as np
rng = np.random.default_rng(0)
P = np.array([[0.8, 0.2], [0.4, 0.6]]) # 0 = S, 1 = R
N, x = 200_000, 0 # 今天晴
path = np.empty(N, dtype=int)
for n in range(N):
x = rng.choice(2, p=P[x]); path[n] = x
print("長期晴天比例", (path == 0).mean()) # ≈ 0.667
p = np.array([1.0, 0.0])
for n in range(1, 6):
p = p @ P; print(n, p[0], p[0] - 2/3) # 差每天 ×0.4
# 違反 Markov:連晴兩天後轉雨機率升到 0.5(二階規則)
檢查理解
參考文獻
- Norris, J. R. Markov Chains. Cambridge University Press, 1997.(第 1 章:離散時間 chain、transition matrix、stationary distribution 與收斂定理。)
- Grimmett, G., Stirzaker, D. Probability and Random Processes, 3rd ed. Oxford University Press, 2001.(第 6 章 Markov chains。)
- Levin, D. A., Peres, Y. Markov Chains and Mixing Times, 2nd ed. AMS, 2017.(第 4 章:收斂速度與 。)