Mímisbrunnr知恵の泉

← ベイズ統計 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:VAEとELBOの共通構造 | 数理:正規正規モデル正則化(リッジ・Lasso)(統計)

要点(BLUF)

1. モデルと事後(閉形式)

入力 xx を特徴ベクトル ϕ(x)\phi(x)(ここでは [1,x][1, x])に写し、y=ϕ(x)w+ε, εN(0,σ2)y=\phi(x)^\top w+\varepsilon,\ \varepsilon\sim\mathcal N(0,\sigma^2)。係数に事前 wN(0,α1I)w\sim\mathcal N(0,\alpha^{-1}I) を置きます。尤度も事前もガウスなので、事後は平方完成で再びガウス(正規正規モデル の多変量版):

wDN(mN,SN),SN=(αI+βΦΦ)1,mN=βSNΦyw\mid D\sim\mathcal N(m_N,S_N),\qquad S_N=(\alpha I+\beta\Phi^\top\Phi)^{-1},\qquad m_N=\beta\,S_N\Phi^\top y

ここで β=1/σ2\beta=1/\sigma^2(雑音精度)、Φ\Phi は計画行列(各行が ϕ(xi)\phi(x_i))。α\alpha が事前精度で、大きいほど係数を 00 へ強く引きます(正則化との関係 のリッジ)。

2. コード:事後と事後予測

import numpy as np

rng = np.random.default_rng(1)
true_w = np.array([0.5, -1.2]); sigma = 0.4; beta = 1/sigma**2
alpha = 1.0                                   # 事前精度
x = np.sort(rng.uniform(-1, 1, 25))
X = np.c_[np.ones_like(x), x]                 # 計画行列 [1, x]
y = X @ true_w + rng.normal(0, sigma, len(x))

# 事後 w|D ~ N(m_N, S_N)(閉形式)
S_N = np.linalg.inv(alpha*np.eye(2) + beta*X.T@X)
m_N = beta * S_N @ X.T @ y
print(f"事後平均 w=[{m_N[0]:.3f}, {m_N[1]:.3f}] (真{true_w})")
print(f"事後SD   w=[{np.sqrt(S_N[0,0]):.3f}, {np.sqrt(S_N[1,1]):.3f}]")

# 事後予測 p(y*|x*):平均=φ(x*)ᵀm_N, 分散=1/β + φ(x*)ᵀS_N φ(x*)
def pred(xs):
    Phi = np.c_[np.ones_like(xs), xs]
    mean = Phi @ m_N
    var = 1/beta + np.einsum('ij,jk,ik->i', Phi, S_N, Phi)
    return mean, np.sqrt(var)

for xs in [0.0, 1.0, 3.0]:                    # データ中心 / 端 / 外挿
    mean, sd = pred(np.array([xs]))
    print(f"x*={xs:>4}: 予測平均={mean[0]:+.3f}  予測SD={sd[0]:.3f}")

出力:

事後平均 w=[0.465, -1.113] (真[ 0.5 -1.2])
事後SD   w=[0.080, 0.141]
x*= 0.0: 予測平均=+0.465  予測SD=0.408
x*= 1.0: 予測平均=-0.648  予測SD=0.431
x*= 3.0: 予測平均=-2.874  予測SD=0.586

出力の意味:事後平均 w=[0.47,1.11]w=[0.47,-1.11] は真の [0.5,1.2][0.5,-1.2] をよく回収。予測 SD はデータの中心 x=0x_*=00.410.41、端 x=1x_*=10.430.43、外挿 x=3x_*=30.590.59データから離れるほど増えます。予測分散の式 1/β+ϕ(x)SNϕ(x)1/\beta+\phi(x_*)^\top S_N\phi(x_*) の第1項が「データ自体の雑音」、第2項が「係数の不確実性が予測に伝わるぶん」で、後者が外挿で膨らみます。点推定回帰なら一定幅の予測になるところを、ベイズは「知らない領域では自信がない」と帯を広げます。

3. 図:予測の不確実性帯

事後予測の平均と ±2\pm2 SD の帯を、事後からサンプルした回帰直線とともに描きます。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib  # 日本語ラベル用

rng = np.random.default_rng(1)
true_w = np.array([0.5, -1.2]); sigma = 0.4; beta = 1/sigma**2; alpha = 1.0
x = np.sort(rng.uniform(-1, 1, 25)); X = np.c_[np.ones_like(x), x]
y = X @ true_w + rng.normal(0, sigma, len(x))
S_N = np.linalg.inv(alpha*np.eye(2) + beta*X.T@X); m_N = beta*S_N@X.T@y

xs = np.linspace(-2.5, 2.5, 200); Phi = np.c_[np.ones_like(xs), xs]
mean = Phi@m_N
sd = np.sqrt(1/beta + np.einsum('ij,jk,ik->i', Phi, S_N, Phi))

plt.figure(figsize=(7.5, 4.5))
for w in rng.multivariate_normal(m_N, S_N, 30):   # 事後からの回帰直線サンプル
    plt.plot(xs, Phi@w, color="C1", alpha=0.15, lw=0.8)
plt.fill_between(xs, mean-2*sd, mean+2*sd, alpha=0.2, color="C0", label="予測 ±2SD")
plt.plot(xs, mean, color="C0", lw=2, label="予測平均")
plt.scatter(x, y, color="black", s=20, zorder=5, label="データ")
plt.axvspan(-1, 1, color="gray", alpha=0.08)      # データのある範囲
plt.xlabel("x"); plt.ylabel("y"); plt.legend(fontsize=9)
plt.title("ベイズ線形回帰:外挿で予測帯が広がる")
plt.tight_layout(); plt.show()

グラフの意味:データのある [1,1][-1,1](灰色帯)の中では予測帯が細く、事後からサンプルした直線(橙)もよく揃います。外側へ出ると直線が扇状に開き、予測帯(青)が広がる——「データのない所では傾きの不確実性が予測のばらつきになる」様子がそのまま見えます。

4. 正規–正規の応用、そして正則化へ

ベイズ線形回帰は、正規正規モデル の「分散既知の正規–正規」を多変量・回帰に拡張したものです。事後精度は SN1=αI+βΦΦS_N^{-1}=\alpha I+\beta\Phi^\top\Phi=事前精度+データ精度の足し算、事後平均は精度の加重平均——構図はまったく同じ。事前精度 α\alpha が係数を 00 へ収縮させるので、事後平均(=MAP)はリッジ回帰の解に一致します。この対応を次節 正則化との関係 で厳密に確かめます。非ガウス(ロジスティック・ポアソン)の回帰は共役が崩れるので、ラプラス近似や MCMC を使います(ベイズGLM)。

⚠️ よくある誤解

関連ノート