Mímisbrunnr知恵の泉

← ベイズ統計 一覧

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

📎 前提:階層モデルの構造 | 関連:正規正規モデル正則化の理論(機械学習)

要点(BLUF)

1. ジェームズ–スタインの逆説

JJ 個のグループ平均 θ1,,θJ\theta_1,\dots,\theta_J を、各グループの観測 yj=θj+雑音y_j=\theta_j+\text{雑音} から推定します。素朴には「各グループは独立だから θ^j=yj\hat\theta_j=y_j(MLE)が最善」に思えます。ところが J3J\ge3 なら、全体平均へ少し収縮した推定のほうが、総二乗誤差 j(θ^jθj)2\sum_j(\hat\theta_j-\theta_j)^2 の期待値で必ず勝ちます。1955年に示されたこの事実は、独立な問題でも「まとめて縮める」と得をするという、直観に反する結果でした。

ジェームズ–スタイン推定量(全体平均 yˉ\bar y へ収縮)は

θ^jJS=yˉ+(1(J3)σ2k(ykyˉ)2)(yjyˉ)\hat\theta_j^{JS}=\bar y+\Big(1-\frac{(J-3)\sigma^2}{\sum_k (y_k-\bar y)^2}\Big)(y_j-\bar y)

です。括弧の中が収縮率(<1<1)。実際に総 MSE を比べます。

2. コードで総MSEを比べる

import numpy as np

# J個の正規平均。y_j = θ_j + N(0,σ²)。収縮が総MSEを下げるか
rng = np.random.default_rng(0)
J, sigma, tau, M = 10, 1.0, 2.0, 20000
err_mle = err_js = err_bayes = 0.0
for _ in range(M):
    theta = rng.normal(5.0, tau, J)             # 真のグループ平均
    y = rng.normal(theta, sigma)                # 観測(MLE = y_j)
    ybar = y.mean()
    # ジェームズ–スタイン(全体平均へ収縮)
    S = np.sum((y - ybar)**2)
    factor = max(0.0, 1 - (J-3)*sigma**2/S)
    theta_js = ybar + factor*(y - ybar)
    # ベイズ部分プーリング(τ既知):B=σ²/(σ²+τ²)
    B = sigma**2/(sigma**2 + tau**2)
    theta_bayes = (1-B)*y + B*ybar
    err_mle   += np.sum((y - theta)**2)
    err_js    += np.sum((theta_js - theta)**2)
    err_bayes += np.sum((theta_bayes - theta)**2)

print(f"総二乗誤差の平均(J={J}, σ={sigma}, τ={tau}):")
print(f"  非プーリング(MLE)    = {err_mle/M:.3f}  (理論 Jσ²={J*sigma**2})")
print(f"  ジェームズ–スタイン  = {err_js/M:.3f}")
print(f"  ベイズ部分プーリング = {err_bayes/M:.3f}")
print(f"  → 収縮で {100*(1-err_js/err_mle):.0f}%(JS)/ {100*(1-err_bayes/err_mle):.0f}%(Bayes)改善")

出力:

総二乗誤差の平均(J=10, σ=1.0, τ=2.0):
  非プーリング(MLE)    = 10.024  (理論 Jσ²=10.0)
  ジェームズ–スタイン  = 8.611
  ベイズ部分プーリング = 8.213
  → 収縮で 14%(JS)/ 18%(Bayes)改善

出力の意味:MLE の総 MSE は 10.010.0(理論値 Jσ2J\sigma^2 どおり)。ジェームズ–スタインは 8.68.6、ベイズ部分プーリングは 8.28.2 と、収縮するだけで 141418%18\% も誤差が下がります。ベイズが JS よりわずかに良いのは、真の τ\tau を使って最適に収縮しているから(JS は τ\tau を知らずデータから暗に推定)。「各グループ独立が最善」という直観が、ここで覆ります。

3. 最適収縮率=ベイズの精度加重

なぜこの収縮率なのか。1グループに注目し、事前 θN(μ,τ2)\theta\sim\mathcal N(\mu,\tau^2)、観測 yN(θ,σ2)y\sim\mathcal N(\theta,\sigma^2) とすると、事後平均(二乗損失で最適な推定)は分散既知の正規–正規(正規正規モデル)より

θ^=(1B)y+Bμ,B=σ2σ2+τ2\hat\theta=(1-B)\,y+B\,\mu,\qquad B=\frac{\sigma^2}{\sigma^2+\tau^2}
import numpy as np
print("収縮率 B = σ²/(σ²+τ²)(σ=1):")
for t in [0.5, 1, 2, 5]:
    print(f"  τ={t}: B={1/(1+t**2):.3f}")

出力:

収縮率 B = σ²/(σ²+τ²)(σ=1):
  τ=0.5: B=0.800
  τ=1: B=0.500
  τ=2: B=0.200
  τ=5: B=0.038

出力の意味:群が似ている(τ=0.5\tau=0.5)なら B=0.80B=0.80 と大きく縮め、群がばらばら(τ=5\tau=5)なら B=0.04B=0.04 とほぼ縮めない。ジェームズ–スタインの収縮率 1(J3)σ2/S1-(J-3)\sigma^2/S は、この最適 BBデータから推定したものに当たります(S=(ykyˉ)2S=\sum(y_k-\bar y)^2 が群間ばらつきの目安で τ\tau を推す)。だから階層ベイズと JS は本質的に同じことをしています。

4. なぜ得をするのか:バイアス-バリアンス分解

収縮は各推定に「全体平均へ寄せる」バイアスを入れます。それでも総 MSE が下がるのは、分散の減少がバイアスの増加を上回るからです。MSE はバイアス²と分散に分解できます。

MSE(θ^j)=(E[θ^j]θj)2バイアス2+Var(θ^j)分散\mathrm{MSE}(\hat\theta_j)=\underbrace{\big(\mathbb E[\hat\theta_j]-\theta_j\big)^2}_{\text{バイアス}^2}+\underbrace{\mathrm{Var}(\hat\theta_j)}_{\text{分散}}

収縮 θ^=(1B)y+Bμ\hat\theta=(1-B)y+B\mu の分散は (1B)2σ2(1-B)^2\sigma^2 で、B>0B>0 なら MLE の分散 σ2\sigma^2 より小さい。入るバイアスは小さく抑えつつ分散を大きく削れるので、合計で得をする——これは正則化(正則化の理論、リッジが係数を 0 へ縮める)とまったく同じ理屈です。階層モデルの収縮は、「全体平均」という賢い目標へ向けた正則化だと言えます(リッジは 0 へ、収縮は群平均へ)。

⚠️ よくある誤解

関連ノート