Mímisbrunnr知恵の泉

← 確率過程 一覧

🎓 レベル:発展 | 重要度:A(必須) 📎 前提:マルコフ連鎖とは・遷移行列ポアソン過程

要点(BLUF)

概念

離散時間では「1ステップごと」に遷移しました。連続時間では、状態 ii にいる間ランダムな時間だけ留まり、その後どこかへ飛びます。マルコフ性(無記憶性)を保つには、滞在時間が「どれだけ待ったかを覚えない」分布、すなわち指数分布でなければなりません。各状態からの脱出率と行き先の比率をまとめたのが生成行列です。

数式による定式化

状態 ii脱出率 qi=qii=jiqijq_i=-q_{ii}=\sum_{j\ne i} q_{ij}。滞在時間は Exp(qi)\mathrm{Exp}(q_i)、脱出先は確率 qij/qiq_{ij}/q_ijj。生成行列 Q=(qij)Q=(q_{ij})

qij0 (ij),qii=jiqij,jqij=0q_{ij}\ge 0\ (i\ne j), \qquad q_{ii}=-\sum_{j\ne i}q_{ij}, \qquad \sum_j q_{ij}=0

遷移確率 pij(t)=P(Xt=jX0=i)p_{ij}(t)=P(X_{t}=j\mid X_0=i) を並べた P(t)P(t) は、微小時間で P(h)I+QhP(h)\approx I+Qh となることから

ddtP(t)=P(t)Q=QP(t),P(0)=I\frac{d}{dt}P(t) = P(t)Q = Q P(t), \qquad P(0)=I

を満たし、その解は行列指数

P(t)=eQt=k=0(Qt)kk!P(t) = e^{Qt} = \sum_{k=0}^{\infty}\frac{(Qt)^k}{k!}

直観

要するに QQ は「確率が単位時間あたりどう流れ出すか」の瞬間の写し。P(h)I+QhP(h)\approx I+Qh は「短い時間 hh では、確率 qijhq_{ij}hiji\to j、確率 1qih1-q_i h で留まる」という線形近似で、それを無限に積み重ねると eQte^{Qt} になります。離散の PnP^n(行列のべき乗)が、連続では eQte^{Qt}(行列の指数)に化けた、と見ると対応がきれいです。

状態遷移図(生成率つき)

graph LR
    A["状態0"] -->|"率 q01"| B["状態1"]
    B -->|"率 q10"| A
    B -->|"率 q12"| C["状態2"]
    C -->|"率 q20"| A

矢印のラベルは確率ではなく(単位時間あたりの期待回数)です。

具体例

3状態の生成行列から P(t)=eQtP(t)=e^{Qt} を計算し、Gillespie 法(指数滞在+ジャンプ)のシミュレーションと突き合わせます。

import numpy as np
from scipy.linalg import expm
Q = np.array([[-2.0, 1.0, 1.0],
              [0.5, -1.5, 1.0],
              [1.0, 1.0, -2.0]])
print("Q の行和:", Q.sum(axis=1))                 # すべて0
t = 1.5
Pt = expm(Q*t)
print("P(t) 行和:", np.round(Pt.sum(axis=1), 6))  # すべて1

jumpP = []                                        # 各状態のジャンプ先分布(率に比例)
for i in range(3):
    p = Q[i].copy(); p[i] = 0.0; jumpP.append(p/p.sum())
rng = np.random.default_rng(3)
n = 60000
end = np.zeros(n, dtype=int)
for k in range(n):
    s, tau = 0, 0.0
    while True:
        tau += rng.exponential(-1.0/Q[s, s])      # 指数滞在
        if tau > t:
            break
        s = rng.choice(3, p=jumpP[s])             # 率に比例してジャンプ
    end[k] = s
emp = np.array([(end == j).mean() for j in range(3)])
print("理論 P(t) 第0行:", np.round(Pt[0], 3))
print("Gillespie 推定 :", np.round(emp, 3))
# Q の行和: [0. 0. 0.]
# P(t) 行和: [1. 1. 1.]
# 理論 P(t) 第0行: [0.28  0.391 0.33 ]
# Gillespie 推定 : [0.277 0.393 0.33 ]

行列指数 eQte^{Qt} の第0行と、滞在+ジャンプを直接回したシミュレーションが一致します。QQ の行和0が確率保存(P(t)P(t) の行和1)を保証しています。

他過程との関係

数式の直観的意味

P(t)=eQtP(t)=e^{Qt} は離散の PnP^n と同じく、QQ の固有値・固有ベクトルで挙動が決まります。QQ の固有値は実部が非正で、固有値0が定常分布に対応(πQ=0\pi Q=0定常分布と詳細釣り合い)。残りの固有値の実部の大きさが収束の速さ(緩和時間)を与えます。離散のスペクトルギャップが、連続では固有値の実部のギャップになります。

⚠️ よくある誤解

対応シミュレーション

本文の Gillespie 法は連続時間過程の標準的生成法です。stochastic-processes-study/simulations/ に汎用 CTMC サンプラを置きます。

関連