ベイズ統計では事前分布を仮定する必要がありますが、パラメータについて事前知識がない場合にどのような事前分布を選べばよいのかは重要な問題です。このような場合に用いられるのが無情報事前分布(non-informative prior)です。
今回は、無情報事前分布の定義と代表的な例について分かりやすく解説していきます。
本記事の内容
- 無情報事前分布の定義と動機
- 一様事前分布とその問題点
- ジェフリーズ事前分布
- Python での比較実装
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
無情報事前分布とは
無情報事前分布とは、パラメータに対して「事前に何も知らない」という状態を表現するために使われる事前分布です。理想的には、事前分布がベイズ推定の結果にできるだけ影響を与えないようにしたいという動機に基づいています。
先行研究や事前知識として、パラメータの分布の形状がある程度わかっている場合にはそのような分布を利用することも有用ですが、まったく事前情報がない場合には無情報事前分布を使うことになります。
一様事前分布
最も直感的な無情報事前分布は一様分布です。
$$ \begin{equation} p(\theta) = \text{const} \end{equation} $$
すべてのパラメータ値に等しい確率を割り当てるため、「事前に偏りがない」という意味で自然に思えます。
一様事前分布の問題点
しかし、一様事前分布にはいくつかの問題があります。
問題1: パラメータの変換に対して不変でない
例えば、パラメータ $\theta$ について一様な事前分布 $p(\theta) \propto 1$ を設定したとき、$\phi = \theta^2$ に変数変換すると、ヤコビアンにより
$$ p(\phi) = p(\theta) \left|\frac{d\theta}{d\phi}\right| = \frac{1}{2\sqrt{\phi}} $$
変換後の分布は一様ではなくなります。つまり、どのパラメトリゼーションを選ぶかによって「無情報」の意味が変わってしまいます。
問題2: 広義事前分布(improper prior)
$\theta \in (-\infty, \infty)$ の場合、$p(\theta) = \text{const}$ は積分が発散するため、正則な確率分布になりません(広義事前分布)。ただし、事後分布が正則になる場合は使用可能です。
ジェフリーズ事前分布
パラメータ変換に対して不変な無情報事前分布として、ジェフリーズ事前分布(Jeffreys prior)があります。
$$ \begin{equation} p(\theta) \propto \sqrt{I(\theta)} \end{equation} $$
ここで $I(\theta)$ はフィッシャー情報量で、
$$ \begin{equation} I(\theta) = -E\left[\frac{\partial^2 \ln p(x|\theta)}{\partial \theta^2}\right] \end{equation} $$
ジェフリーズ事前分布は、パラメータの再パラメトリゼーションに対して不変であるという優れた性質を持っています。
具体例:正規分布の平均
データが $\mathcal{N}(\mu, \sigma^2)$ に従い、$\sigma^2$ が既知のとき、
$$ I(\mu) = \frac{1}{\sigma^2} $$
よってジェフリーズ事前分布は $p(\mu) \propto 1$(一様分布)です。この場合は一様事前分布とジェフリーズ事前分布が一致します。
具体例:正規分布の分散
$\mu$ が既知で $\sigma^2$ が未知のとき、
$$ I(\sigma^2) = \frac{1}{2(\sigma^2)^2} $$
ジェフリーズ事前分布は、
$$ p(\sigma^2) \propto \frac{1}{\sigma^2} $$
これは $\ln\sigma^2$ について一様な事前分布に対応しています。スケールパラメータに対しては、対数スケールで一様にする方が「無情報」として自然であることを示しています。
Python での比較
事前分布の選択が事後分布に与える影響を比較しましょう。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, invgamma
# データ生成
np.random.seed(42)
true_mu = 5.0
true_sigma = 2.0
N = 10
data = np.random.normal(true_mu, true_sigma, N)
x_bar = data.mean()
# 分散既知(sigma=2)で平均muをベイズ推定
sigma_known = 2.0
mu_range = np.linspace(0, 10, 500)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 左: 異なる事前分布(平均の推定)
ax1 = axes[0]
# 一様事前分布(無情報): p(mu) = const -> 事後分布はN(x_bar, sigma^2/N)
sigma_post_flat = sigma_known / np.sqrt(N)
post_flat = norm.pdf(mu_range, x_bar, sigma_post_flat)
ax1.plot(mu_range, post_flat, 'b-', linewidth=2, label=f'Flat prior -> N({x_bar:.2f}, {sigma_post_flat:.2f})')
# 情報的事前分布: p(mu) = N(0, 1)
mu_0, sigma_0 = 0.0, 1.0
precision_post = N / sigma_known**2 + 1 / sigma_0**2
sigma_post_info = np.sqrt(1 / precision_post)
mu_post_info = (N * x_bar / sigma_known**2 + mu_0 / sigma_0**2) / precision_post
post_info = norm.pdf(mu_range, mu_post_info, sigma_post_info)
ax1.plot(mu_range, post_info, 'r-', linewidth=2, label=f'Informative N(0,1) -> N({mu_post_info:.2f}, {sigma_post_info:.2f})')
# 緩い情報的事前分布: p(mu) = N(0, 100)
mu_0w, sigma_0w = 0.0, 10.0
precision_post_w = N / sigma_known**2 + 1 / sigma_0w**2
sigma_post_weak = np.sqrt(1 / precision_post_w)
mu_post_weak = (N * x_bar / sigma_known**2 + mu_0w / sigma_0w**2) / precision_post_w
post_weak = norm.pdf(mu_range, mu_post_weak, sigma_post_weak)
ax1.plot(mu_range, post_weak, 'g-', linewidth=2, label=f'Weak N(0,100) -> N({mu_post_weak:.2f}, {sigma_post_weak:.2f})')
ax1.axvline(x=true_mu, color='k', linestyle='--', alpha=0.5, label=f'True mu={true_mu}')
ax1.set_xlabel('mu', fontsize=12)
ax1.set_ylabel('Posterior density', fontsize=12)
ax1.set_title(f'Effect of Prior on Posterior (N={N})', fontsize=13)
ax1.legend(fontsize=9)
ax1.grid(True, alpha=0.3)
# 右: データ数による事前分布の影響の減少
ax2 = axes[1]
n_values = np.arange(1, 101)
mu_post_flat_arr = np.zeros_like(n_values, dtype=float)
mu_post_info_arr = np.zeros_like(n_values, dtype=float)
all_data = np.random.normal(true_mu, true_sigma, 100)
for i, n in enumerate(n_values):
xb = all_data[:n].mean()
mu_post_flat_arr[i] = xb
prec = n / sigma_known**2 + 1 / sigma_0**2
mu_post_info_arr[i] = (n * xb / sigma_known**2 + mu_0 / sigma_0**2) / prec
ax2.plot(n_values, mu_post_flat_arr, 'b-', linewidth=1.5, label='Flat prior')
ax2.plot(n_values, mu_post_info_arr, 'r-', linewidth=1.5, label='Informative N(0,1)')
ax2.axhline(y=true_mu, color='k', linestyle='--', alpha=0.5, label=f'True mu={true_mu}')
ax2.set_xlabel('Sample size N', fontsize=12)
ax2.set_ylabel('Posterior mean', fontsize=12)
ax2.set_title('Prior Effect Diminishes with More Data', fontsize=13)
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
左のグラフでは、データ数が少ない場合に事前分布の選択が事後分布に影響すること、右のグラフでは、データ数が増えるにつれて事前分布の影響が薄れ、すべての事後分布が真のパラメータに収束することが確認できます。
まとめ
本記事では、無情報事前分布について解説しました。
- 無情報事前分布はパラメータに事前知識がない場合に使われる事前分布
- 一様事前分布は直感的だが、パラメータ変換に対して不変でないという問題がある
- ジェフリーズ事前分布はフィッシャー情報量に基づき、パラメータ変換に対して不変
- データ数が十分に多ければ、事前分布の選択は事後分布にほとんど影響しない
次のステップとして、以下の記事も参考にしてください。