🔥

MCMCと変分推論(VI)の実装:Pythonでベイズ推論を試してみよう!

2025/03/01に公開

1. はじめに

MCMC(マルコフ連鎖モンテカルロ法)と変分推論(VI)は、確率分布を推定する代表的な手法です。今回は、Pythonを使ってこれらの手法を実装し、具体的な例で違いを体感できるようにします。

題材:コイン投げのベイズ推定

  • コインを何回か投げた結果から、「このコインが偏っているか?」を推定する
  • MCMCとVIを使って「表が出る確率」を求める

2. データの準備

以下のデータを用います。

  • 100回コインを投げた
  • 表が出た回数 = 60回

このデータを元に、コインが「正しい確率(50%)」なのか、それとも「偏っているのか?」を調べます。

import numpy as np

# データの設定(100回投げて60回表が出た)
n_trials = 100
n_heads = 60

3. MCMCによる推定(PyMC3を使用)

MCMCでは、サンプリングを繰り返して「表が出る確率」の分布を推定します。

import pymc3 as pm
import matplotlib.pyplot as plt

# モデルの定義
with pm.Model() as model_mcmc:
    theta = pm.Beta('theta', alpha=1, beta=1)  # 事前分布(Beta(1,1))
    y = pm.Binomial('y', n=n_trials, p=theta, observed=n_heads)  # 観測データ
    trace_mcmc = pm.sample(2000, return_inferencedata=False)  # MCMCでサンプリング

# サンプリング結果の可視化
plt.hist(trace_mcmc['theta'], bins=30, density=True, alpha=0.7, label='MCMC')
plt.xlabel('表が出る確率 θ')
plt.ylabel('確率密度')
plt.title('MCMCによる推定結果')
plt.legend()
plt.show()

✅ 結果の解釈

  • MCMCは「表が出る確率」の分布を直接サンプリングするため、推定値のバラつきも確認できる
  • 例えば、θ ≈ 0.6(60%)の確率が最も高いと推定される

4. 変分推論(VI)による推定

変分推論では、ベータ分布を用いて「表が出る確率」の近似分布を求めます。

with pm.Model() as model_vi:
    theta = pm.Beta('theta', alpha=1, beta=1)
    y = pm.Binomial('y', n=n_trials, p=theta, observed=n_heads)
    approx = pm.fit(n=50000, method='advi')  # 変分推論で推定
    trace_vi = approx.sample(2000)  # 推定結果をサンプリング

# サンプリング結果の可視化
plt.hist(trace_vi['theta'], bins=30, density=True, alpha=0.7, label='VI', color='orange')
plt.xlabel('表が出る確率 θ')
plt.ylabel('確率密度')
plt.title('変分推論(VI)による推定結果')
plt.legend()
plt.show()

✅ 結果の解釈

  • 変分推論は「表が出る確率」を**一つの分布(ベータ分布)**で近似する
  • そのため、MCMCよりも速く計算できるが、近似誤差が生じる可能性がある

5. MCMC vs VI の比較

MCMCとVIの結果を比較すると、どちらも「表が出る確率 ≈ 0.6」と推定しています。

違いは?

比較項目 MCMC 変分推論(VI)
精度 高い(正しい分布をサンプリング) 近似的(誤差がある)
計算速度 遅い(サンプル数が多い) 速い(最適化で解く)
確率分布の形状 柔軟(どんな分布も推定可能) 近似分布に制限がある

✅ 実務での使い分け

  • MCMC: 高精度な推定が必要な場合(研究向き)
  • VI: 計算リソースが限られている場合(リアルタイム処理向き)

6. まとめ

今回は、MCMCと変分推論(VI)を使って「コイン投げの確率」を推定しました。

  • MCMC はサンプリングによって確率分布を推定(高精度だが計算コストが高い)
  • VI は最適化によって確率分布を近似(高速だが誤差がある)
  • 実務では、精度と計算コストを考えて使い分けるのが重要

MCMCとVIを使いこなすことで、ベイズ統計や確率モデリングを活用した高度な分析が可能になります!🚀

Discussion