ベイズ統計やベイズ推定を学び始めたころ、参考書で必ずぶち当たるのが共役事前分布(きょうやくじぜんぶんぷ、conjugate prior)という概念です。言葉だけ見るととても難しそうで、見ただけで挫折しそうな概念ですが、実は考え方はシンプルです。
今回はこの共役事前分布について、ベイズ推定の基本から振り返りつつ、具体例と Python 実装を交えて分かりやすく解説していきます。
本記事の内容
- 共役事前分布の定義と直感的な意味
- 代表的な共役事前分布の組み合わせ
- ベルヌーイ分布×ベータ分布の導出
- Python での可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
ベイズ推定のおさらい
共役事前分布を理解するためには、まずベイズ推定の枠組みを理解している必要があります。
ベイズ推定では、パラメータ $\theta$ に対する事前分布 $p(\theta)$ を、データ $\mathcal{D}$ の尤度 $p(\mathcal{D}|\theta)$ で更新し、事後分布 $p(\theta|\mathcal{D})$ を得ます。
$$ \begin{equation} p(\theta|\mathcal{D}) = \frac{p(\mathcal{D}|\theta) \cdot p(\theta)}{p(\mathcal{D})} \end{equation} $$
ここで、
- $p(\theta)$:事前分布(データを観測する前のパラメータの信念)
- $p(\mathcal{D}|\theta)$:尤度(パラメータ $\theta$ のもとでデータが観測される確率)
- $p(\theta|\mathcal{D})$:事後分布(データを観測した後のパラメータの信念)
- $p(\mathcal{D})$:周辺尤度(正規化定数)
ベイズ推定の核心は、この式を使って事前分布を事後分布に更新することです。
共役事前分布とは
共役事前分布とは、事前分布と事後分布が同じ分布族に属するような事前分布のことです。
もう少し具体的に言うと、尤度関数 $p(\mathcal{D}|\theta)$ が特定の分布族に従うとき、事前分布 $p(\theta)$ として特定の分布を選ぶと、事後分布 $p(\theta|\mathcal{D})$ も同じ分布族になるという性質があります。このような事前分布を共役事前分布と呼びます。
$$ \underbrace{p(\theta)}_{\text{分布族 } \mathcal{F}} \xrightarrow{\text{ベイズ更新}} \underbrace{p(\theta|\mathcal{D})}_{\text{分布族 } \mathcal{F}} $$
共役事前分布のメリット
共役事前分布を使う最大のメリットは、事後分布を解析的に(閉じた形で)求められることです。
一般のベイズ推定では、(1) 式の分母 $p(\mathcal{D})$ の積分が解析的に計算できないことが多く、MCMC 法などの近似手法が必要になります。しかし共役事前分布を使えば、事後分布のパラメータを直接計算でき、計算コストが大幅に削減されます。
代表的な共役事前分布の組み合わせ
以下に、よく使われる尤度関数と共役事前分布の組み合わせをまとめます。
| 尤度関数 | 共役事前分布 | 事後分布 |
|---|---|---|
| ベルヌーイ分布 | ベータ分布 | ベータ分布 |
| 二項分布 | ベータ分布 | ベータ分布 |
| ポアソン分布 | ガンマ分布 | ガンマ分布 |
| カテゴリカル分布 | ディリクレ分布 | ディリクレ分布 |
| 正規分布(平均未知) | 正規分布 | 正規分布 |
| 正規分布(精度未知) | ガンマ分布 | ガンマ分布 |
| 多変量正規分布(平均未知) | 多変量正規分布 | 多変量正規分布 |
具体例:ベルヌーイ分布 × ベータ分布
最も基本的な例として、ベルヌーイ分布の尤度とベータ分布の事前分布の組み合わせを導出しましょう。
問題設定
コインを $N$ 回投げて、表が $m$ 回、裏が $N – m$ 回出たとします。コインの表が出る確率 $\mu$ をベイズ推定します。
尤度関数
データ $\mathcal{D} = \{x_1, x_2, \dots, x_N\}$($x_i \in \{0, 1\}$)が与えられたとき、尤度関数は次のように書けます。
$$ \begin{equation} p(\mathcal{D}|\mu) = \prod_{i=1}^{N} \mu^{x_i}(1-\mu)^{1-x_i} = \mu^m (1-\mu)^{N-m} \end{equation} $$
ここで $m = \sum_{i=1}^{N} x_i$ は表が出た回数です。
事前分布(ベータ分布)
パラメータ $\mu$ の事前分布として、ベータ分布 $\text{Beta}(\mu|a, b)$ を選びます。
$$ \begin{equation} p(\mu) = \text{Beta}(\mu|a, b) = \frac{\Gamma(a+b)}{\Gamma(a)\Gamma(b)} \mu^{a-1}(1-\mu)^{b-1} \end{equation} $$
ここで $a, b > 0$ はベータ分布のハイパーパラメータです。
事後分布の導出
ベイズの定理を適用すると、
$$ \begin{align} p(\mu|\mathcal{D}) &\propto p(\mathcal{D}|\mu) \cdot p(\mu) \\ &= \mu^m (1-\mu)^{N-m} \cdot \frac{\Gamma(a+b)}{\Gamma(a)\Gamma(b)} \mu^{a-1}(1-\mu)^{b-1} \\ &\propto \mu^{m+a-1} (1-\mu)^{N-m+b-1} \end{align} $$
これは、パラメータ $a’ = m + a$, $b’ = N – m + b$ のベータ分布の核(カーネル)と一致します。したがって、
$$ \begin{equation} p(\mu|\mathcal{D}) = \text{Beta}(\mu|m+a, N-m+b) \end{equation} $$
事前分布がベータ分布で、事後分布もベータ分布になりました。このように、ベータ分布はベルヌーイ分布に対する共役事前分布です。
パラメータ更新の解釈
事後分布のパラメータを見ると、
- $a’ = a + m$(事前の $a$ に表の回数 $m$ を加算)
- $b’ = b + (N – m)$(事前の $b$ に裏の回数 $N – m$ を加算)
つまり、ベータ分布のハイパーパラメータ $a, b$ は「仮想的な観測回数」として解釈できます。データが増えるごとに、パラメータが更新されていく仕組みです。
Python での実装
ベータ分布がデータによって更新される様子を Python で可視化しましょう。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta
# ハイパーパラメータ(事前分布)
a_prior, b_prior = 2, 2
# コイン投げのデータ生成(真の確率 0.7)
np.random.seed(42)
true_mu = 0.7
data = np.random.binomial(1, true_mu, size=100)
# 逐次ベイズ更新を可視化
mu = np.linspace(0, 1, 500)
fig, axes = plt.subplots(2, 3, figsize=(14, 8))
axes = axes.flatten()
observations = [0, 1, 5, 10, 30, 100]
for idx, n_obs in enumerate(observations):
ax = axes[idx]
obs = data[:n_obs]
m = obs.sum()
a_post = a_prior + m
b_post = b_prior + (n_obs - m)
# 事後分布
pdf = beta.pdf(mu, a_post, b_post)
ax.plot(mu, pdf, 'b-', linewidth=2, label=f'Beta({a_post}, {b_post})')
ax.axvline(x=true_mu, color='r', linestyle='--', alpha=0.7, label=f'True mu={true_mu}')
ax.fill_between(mu, pdf, alpha=0.15)
ax.set_title(f'N={n_obs}, m={int(m)}', fontsize=12)
ax.set_xlabel('mu', fontsize=10)
ax.set_ylabel('Density', fontsize=10)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
plt.suptitle('Bayesian Update of Beta Distribution (Conjugate Prior)', fontsize=14)
plt.tight_layout()
plt.show()
このコードでは、データ数 $N$ を0, 1, 5, 10, 30, 100と増やしたときの事後分布の変化を可視化しています。データが増えるにつれて、事後分布が真のパラメータ $\mu = 0.7$ 付近に収束していく様子が確認できます。
ポアソン分布 × ガンマ分布の例
もう一つの具体例として、ポアソン分布のパラメータ $\lambda$ をガンマ分布で推定する場合も簡単に確認しましょう。
ポアソン分布の尤度関数は、
$$ p(\mathcal{D}|\lambda) = \prod_{i=1}^{N} \frac{\lambda^{x_i} e^{-\lambda}}{x_i!} \propto \lambda^{\sum x_i} e^{-N\lambda} $$
事前分布としてガンマ分布 $\text{Gamma}(\lambda|a, b)$ を選ぶと、
$$ p(\lambda|\mathcal{D}) \propto \lambda^{\sum x_i + a – 1} e^{-(N+b)\lambda} $$
これはガンマ分布 $\text{Gamma}(\lambda|\sum x_i + a, N + b)$ に一致します。ガンマ分布はポアソン分布の共役事前分布です。
まとめ
本記事では、共役事前分布について解説しました。
- 共役事前分布とは、事前分布と事後分布が同じ分布族に属するような事前分布のこと
- 共役事前分布を使うことで、事後分布を解析的に求められるという大きなメリットがある
- ベルヌーイ分布×ベータ分布は最も基本的な共役の組み合わせであり、パラメータ更新の仕組みが直感的に理解しやすい
- データが増えるにつれて、事後分布が真のパラメータに収束していく
次のステップとして、以下の記事も参考にしてください。