Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:メトロポリス・ヘイスティングス法 | ベイズ:ギブスサンプリング

要点(BLUF)

1. アルゴリズム

dd 個の変数 x=(x1,,xd)\mathbf{x} = (x_1, \dots, x_d) の同時分布 π(x)\pi(\mathbf{x}) からサンプルしたいとき、各変数を他のすべてを固定した条件付き分布から順に引きます。

  1. x1(t+1)π(x1x2(t),x3(t),,xd(t))x_1^{(t+1)} \sim \pi(x_1 \mid x_2^{(t)}, x_3^{(t)}, \dots, x_d^{(t)})
  2. x2(t+1)π(x2x1(t+1),x3(t),,xd(t))x_2^{(t+1)} \sim \pi(x_2 \mid x_1^{(t+1)}, x_3^{(t)}, \dots, x_d^{(t)})
  3. … 最後の xdx_d まで順に更新して1ステップ完了

最新の値を使いながら1変数ずつ更新するのがポイント(更新したらすぐ次の条件に反映)。これを繰り返すと、状態列は同時分布 π(x)\pi(\mathbf{x}) を定常分布とするマルコフ連鎖になります。

2. なぜ受理率100%か

ギブスは MH で提案分布を「条件付き分布 q(xixi)=π(xixi)q(x_i'|x_{-i}) = \pi(x_i'|x_{-i})」に選んだ特殊ケースです。このとき受理確率を計算すると、π(x)=π(xixi)π(xi)\pi(\mathbf{x}) = \pi(x_i|x_{-i})\pi(x_{-i}) を使って

α=min ⁣(1, π(x)q(xx)π(x)q(xx))=min ⁣(1, π(xixi)π(xi)π(xixi)π(xixi)π(xi)π(xixi))=min(1,1)=1\alpha = \min\!\left(1,\ \frac{\pi(x')\,q(x|x')}{\pi(x)\,q(x'|x)}\right) = \min\!\left(1,\ \frac{\pi(x_i'|x_{-i})\pi(x_{-i})\cdot \pi(x_i|x_{-i})}{\pi(x_i|x_{-i})\pi(x_{-i})\cdot \pi(x_i'|x_{-i})}\right) = \min(1, 1) = 1

きれいに約分されて常に1。提案が「その変数の正しい条件付き分布」なので、棄却する理由がない——だから100%受理で効率的です。条件付き分布から直接サンプルできること(閉形式や標準分布であること)が使える条件です。

3. 実装:相関0.8の二変量正規

二変量標準正規(相関 ρ=0.8\rho=0.8)の条件付き分布は、xyN(ρy, 1ρ2)x \mid y \sim \mathcal{N}(\rho y,\ 1-\rho^2)yxN(ρx, 1ρ2)y \mid x \sim \mathcal{N}(\rho x,\ 1-\rho^2) と閉形式。これを交互に引きます。

import numpy as np

# 乱数シードを固定
rng = np.random.default_rng(42)

rho = 0.8
n = 200_000
x = np.empty(n); y = np.empty(n)
xc, yc = 0.0, 0.0
sd = np.sqrt(1 - rho**2)
for i in range(n):
    xc = rng.normal(rho * yc, sd)   # x | y からサンプル
    yc = rng.normal(rho * xc, sd)   # y | x からサンプル(更新後のxを使う)
    x[i] = xc; y[i] = yc

burn = 2000
print(f"平均  x={x[burn:].mean():.3f}  y={y[burn:].mean():.3f}  (目標 0, 0)")
print(f"標準偏差 x={x[burn:].std():.3f}  y={y[burn:].std():.3f}  (目標 1, 1)")
print(f"相関 corr(x,y) = {np.corrcoef(x[burn:], y[burn:])[0,1]:.3f}  (目標 0.8)")

出力:

平均  x=0.000  y=0.001  (目標 0, 0)
標準偏差 x=0.999  y=1.000  (目標 1, 1)
相関 corr(x,y) = 0.798  (目標 0.8)

出力の意味:条件付き正規から交互に引くだけで、二変量正規の平均(0,0)・標準偏差(1,1)・相関0.798(目標0.8)を見事に復元。同時分布を直接サンプルする式を持っていなくても、条件付き分布さえ書ければ同時分布が再現できる——これがギブスの威力です。ベイズの階層モデルでは各パラメータの条件付き分布が共役で書けることが多く、ギブスが定番になります(ベイズ)。

4. 強みと弱み

数式の直観的意味

ギブスは「一度に1軸ずつ、その軸の正しい断面分布に沿って動く」探索です。xx を更新するときは yy を固定した「縦の断面」、次は xx を固定した「横の断面」——各断面では条件付き分布が正確に分かるので、提案がそのまま正解(受理率100%)。ただし軸に平行にしか動けないので、分布が斜めに細長い(強相関)と、対角線方向へ進むのに小刻みなジグザグを強いられ、収束が遅くなる。これがギブスの幾何的な限界で、MH のランダムウォーク(任意方向に提案できる)との使い分けの基準です。条件付きが書けるなら受理率100%のギブス、書けない・強相関ならブロック化や HMC を検討します。

⚠️ よくある誤解・落とし穴

対応シミュレーション参照

本文の二変量正規ギブス(相関0.8・default_rng(42)、相関0.798復元)。応用はベイズへ。

関連ノート