マルコフ連鎖とは?高校数学の知識でGPTに教えてもらった
確率や統計の話を調べていると「マルコフ連鎖」という言葉に出会うことがあります。
機械学習やGoogleの検索アルゴリズムなどでも登場する概念ですが、実は基本的な仕組みは
高校数学レベルの知識でも理解できるかもしれません。
この記事では、できるだけ数式の意味を丁寧に追いながら、
マルコフ連鎖の基本を解説します。途中では「天気」を例にした
トイプロブレム(理解のための簡単な例題)を使って、
実際に計算してみます。
こんな人向けの記事
- 高校数学はかろうじて理解している
- 確率・統計の基本的な考え方に興味がある
マルコフ連鎖とは
マルコフ連鎖は、簡単に言うと
「次の状態が、現在の状態だけで決まる確率モデル」
です。
過去の履歴は関係ないんですか?
基本モデルでは、直前の状態だけを使って次を決めます。これを「マルコフ性」と呼びます。
数学的には次のように書かれます。
\( P(X_{n+1} \mid X_n, X_{n-1}, \dots ) = P(X_{n+1} \mid X_n) \)
- \(P(\cdot)\)
確率(Probability)を表す記号です。
括弧の中に書かれた出来事が起こる確率を意味します。 - \(X_n\)
時刻 \(n\) における状態(state)を表す確率変数です。
例えば天気モデルなら「今日の天気」に対応します。 - \(X_{n+1}\)
次の時刻の状態です。
天気の例なら「明日の天気」にあたります。 - \(X_{n-1}, X_{n-2}, \dots\)
それより前の状態を表します。
「昨日の天気」「一昨日の天気」など、
過去の履歴を表している部分です。 - \(|\)
条件付き確率を表す記号です。
「〜という条件のもとで」という意味になります。
※要は現在だけを比較するのと、過去全てを比較するは同じだよっていうこと。仕組みが知りたいだけならこれは重要じゃないのであまり深く考えなくて良いです。
問題です
次のような天気のモデルを考えます。
- 今日晴れ → 明日晴れ 70%
- 今日晴れ → 明日雨 30%
- 今日雨 → 明日晴れ 40%
- 今日雨 → 明日雨 60%
↺0.7 ↺0.6
[晴れ] ──0.3──→ [雨]
←─0.4───
この確率に従って、天気が毎日変わっていくとします。
このとき、試行を何回も繰り返していくと、
- 晴れになる確率
- 雨になる確率
は最終的にどのような値に近づくでしょうか?
つまり、
「長期的には晴れと雨はどのくらいの割合で現れるのか」
を考える問題です。
このような問題を解くために使われるのが
マルコフ連鎖です。
これを行列で表すと次のようになります。
\[P=\begin{pmatrix}0.7 & 0.3 \\0.4 & 0.6\end{pmatrix}\]
\[P=\begin{pmatrix}⚪︎⚪︎ & ⚪︎⚫︎ \\ ⚫︎⚪︎ & ⚫︎⚫︎\end{pmatrix}\]
この行列を遷移確率行列と呼びます。
確率分布は掛け算で更新される
例えば今日の天気が
\( v_0 = (1,0) \)
つまり
- 晴れ100%
- 雨0%
とします。
明日の確率は
\( v_1 = v_0 P \)
です。
計算すると
\( (1,0)\begin{pmatrix}0.7 & 0.3 \\0.4 & 0.6\end{pmatrix}=(0.7,0.3) \)
つまり
- 晴れ70%
- 雨30%
になります。
さらに2日後は
\( v_2 = v_1 P \)
つまり
\( (0.7,0.3)\begin{pmatrix}0.7 & 0.3 \\0.4 & 0.6\end{pmatrix}=(0.61,0.39) \)
となります。
一般には
\( v_n = v_0 P^n \)
と書くことができます。
何回も掛けると確率が安定する
遷移行列を何回も掛けていくと、確率はある値に近づくことがあります。
どうして同じ値に近づくんですか?
行列の性質によって、初期状態の影響がだんだん小さくなるためです。
例えばこの天気モデルでは、計算を繰り返すと
- 晴れ:約57%
- 雨:約43%
という値に近づいていきます。
このような分布を
定常分布
と呼びます。
定常分布の数式
定常分布は次の条件を満たします。
\( \pi P = \pi \)
ここで
\( \pi \)
は円周率の事ではなく、長期的な確率分布という意味で使っています。
つまり
「1回遷移しても分布が変わらない状態」
を意味します。
Pをかけても変わらないってことはP=1ってこと?
通常の式だとそうだけど、行列だとそうならない場合もあるよ。
さらに確率なので
\( \pi_1 + \pi_2 = 1 \)
という条件も付きます。
実際に計算してみよう
このトイプロブレムをPythonで計算してみます。
import numpy as np
P = np.array([
[0.7,0.3],
[0.4,0.6]
])
v = np.array([1,0])
for i in range(20):
v = v @ P
print(v)
==>
[0.7 0.3]
[0.61 0.39]
[0.583 0.417]
[0.5749 0.4251]
・・・
[0.57142857 0.42857143]
このコードを実行すると、確率は次第に
\( (0.571,0.429) \)
に近づきます。
つまり長期的には
- 晴れ 約57%
- 雨 約43%
という割合になります。
繰り返し計算するしか求められないのか?
やっぱり何十回も計算するしかないんですか?
実は、繰り返し計算をしなくても求める方法があります。
方法① 方程式として解く
状態数が少ない場合は、この式を連立方程式として解くことができます。
例えば天気モデルの遷移行列が
\(P =\begin{pmatrix}0.7 & 0.3 \\0.4 & 0.6\end{pmatrix}\)
だったとします。
定常分布を
\( \pi = (x, y) \)
とすると
\( (x,y)P = (x,y) \)
になります。
計算すると
\(\begin{cases}0.7x + 0.4y = x \\0.3x + 0.6y = y\end{cases}\)
さらに確率なので
\( x + y = 1 \)
という条件を追加して解くと
\( x \approx 0.571 \)
\( y \approx 0.429 \)
が得られます。
方法② 固有値問題として解く
もう少し数学的に書くと、
\( \pi P = \pi \)
は次の形と同じです。
\( P^T \pi^T = 1 \cdot \pi^T \)
つまり
固有値1の固有ベクトル
を求める問題になります。
そのため線形代数のアルゴリズムを使って、
直接定常分布を求めることも可能です。
まとめ
- マルコフ連鎖は「次の状態が現在だけで決まる」確率モデル
- 状態の変化は遷移確率行列で表せる
- 確率分布は \( v_{n}=v_0P^n \) で更新される
- 多くの場合、長い時間で定常分布に収束する
- 天気のようなトイプロブレムで理解しやすい
マルコフ連鎖はシンプルなモデルですが、
Web検索、機械学習、金融モデル(今の⚪︎年平均線がこうなら上がるか)など
さまざまな分野で応用されています。
まずは今回のような小さなトイプロブレムから理解すると、
数式の意味が見えやすくなるかもしれません。

コメント