コイン投げによるベイズ更新のシミュレーション

コインを投げ続ける過程をシミュレーションし、ベイズの公式を使って「コインが不正かどうか」の信念分布をリアルタイムに更新します。

このケースを学ぶと、以下のことが理解できます:ベイズ法の核心——新しいデータを観測するたびに、尤度関数を使って信念を更新する。


日常生活からの導入

新しい同僚は頼りになるか?

初日は、新しい同僚について何も知らない(事前分布:頼りになるかもしれないし、ならないかもしれない、それぞれ50%)。最初の1週間、その人は毎回時間通りにタスクを完了する(新しい証拠)。あなたは「その人はおそらく頼りになる」と感じ始める。2週目もまた時間通りに完了する(さらなる証拠)。あなたの判断はより確信になる。

あなたの判断が事後確率です——新しい証拠で初期の判断を継続的に修正した結果です。これがベイズ更新の直感です。


直感的理解

コインが1枚ありますが、その表が出る確率は不明です。事前分布:投げる前は、任意の表の確率(0から1)が可能性として考えられます。尤度:結果を見るたびに、「表の確率が theta の場合にこの結果が観測される可能性」を使って更新します。事後分布:更新後の信念分布——データが多いほど、分布は真の値の近くに集中します。


数学的定義

\[ P(\theta \mid \text{data}) = \frac{P(\text{data} \mid \theta) \cdot P(\theta)}{P(\text{data})} \] \[ \text{事後}_t \propto \text{尤度}(\text{第 }t\text{ 回の結果} \mid \theta) \times \text{事後}_{t-1} \]

Python での実践

実例

import numpy as np
np.random.seed(1)

true_p = 0.75  # 実際のコインの表の確率(知らないふり)
theta_grid = np.linspace(0, 1, 200)

# 事前分布:すべての theta を同等に扱う
prior = np.ones_like(theta_grid)
prior /= prior.sum()

# コインを40回投げるシミュレーション
flips = np.random.binomial(1, true_p, size=40)

posterior = prior.copy()
print("サンプル ベイズ更新過程 (実際の theta=0.75):\n")
for i, outcome in enumerate(flips, start=1):
    likelihood = theta_grid if outcome == 1 else (1 - theta_grid)
    posterior = posterior * likelihood
    posterior /= posterior.sum()

    if i % 10 == 0:
        est = theta_grid[np.argmax(posterior)]
        print(f" {i:2d} 回投げた後、最も可能性が高い theta={est:.3f}")

# 不確実性の比較
prior_std = np.sqrt(np.sum(theta_grid**2 * prior) - np.sum(theta_grid * prior)**2)
post_std = np.sqrt(np.sum(theta_grid**2 * posterior) - np.sum(theta_grid * posterior)**2)
print(f"\n"サンプル 事前標準偏差: {prior_std:.4f} -> 事後標準偏差: {post_std:.4f} ({prior_std/post_std:.1f} 倍に縮小)")
サンプル 贝叶斯更新过程 (真实 theta=0.75):

  抛 10 次后,最可能的 theta=0.754
  抛 20 次后,最可能的 theta=0.769
  抛 30 次后,最可能的 theta=0.759
  抛 40 次后,最可能的 theta=0.774

サンプル 先验标准差: 0.2890 -> 后验标准差: 0.0642 (缩小了 4.5 倍)

AI での応用シーン

シーンベイズ法の役割
ナイーブベイズ分類ベイズの公式 + 特徴量の独立仮定 → 古典的クラス分類器
ベイズ最適化事前分布 + 観測データ → 事後ガウス過程 → ハイパーパラメータ探索を導く
変分推論単純な分布で複雑な事後分布を近似する——VAE の数学的基盤
その他の拡張