Mímisbrunnr知恵の泉

← ベイズ統計 一覧

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

📎 前提:ベイズ線形回帰 | 関連:正則化の理論(機械学習)・正則化(Ridge・Lasso・Elastic Net)(機械学習)

要点(BLUF)

1. 罰則付き最小二乗 = MAP 推定

回帰の MAP 推定は、事後 \propto 尤度 × 事前 の対数を最大化することです。

wMAP=argmaxw[logp(Dw)+logp(w)]=argminw[12σ2yΦw2log尤度 + (logp(w))罰則]w_{\mathrm{MAP}}=\arg\max_w\big[\log p(D\mid w)+\log p(w)\big] =\arg\min_w\Big[\underbrace{\tfrac{1}{2\sigma^2}\|y-\Phi w\|^2}_{-\log\text{尤度}}\ +\ \underbrace{(-\log p(w))}_{\text{罰則}}\Big]

ガウス尤度の負対数が二乗誤差。事前の負対数が、そのまま正則化の罰則項になります。どんな事前を置くかで、どんな正則化になるかが決まります。

2. リッジ = ガウス事前

事前 wN(0,α1I)w\sim\mathcal N(0,\alpha^{-1}I) なら logp(w)=α2w2+const-\log p(w)=\tfrac{\alpha}{2}\|w\|^2+\text{const}。これを上に入れると、argminw[12σ2yΦw2+α2w2]\arg\min_w\big[\tfrac{1}{2\sigma^2}\|y-\Phi w\|^2+\tfrac{\alpha}{2}\|w\|^2\big]、すなわちリッジ回帰λ=ασ2=α/β\lambda=\alpha\sigma^2=\alpha/\beta)。ベイズ MAP とリッジ閉形式が厳密に一致することを確かめます。

import numpy as np

rng = np.random.default_rng(0)
n, p = 60, 8
true_w = np.array([3.0, -2.0, 0, 0, 1.5, 0, 0, 0])     # 疎な真の係数
X = rng.standard_normal((n, p)); sigma = 1.0
y = X @ true_w + rng.normal(0, sigma, n)

alpha, beta = 2.0, 1/sigma**2                           # 事前精度 α・雑音精度 β
lam = alpha/beta                                        # 正則化係数 λ=α/β
w_bayes_map = np.linalg.solve(X.T@X + lam*np.eye(p), X.T@y)   # ガウス事前のMAP
w_ridge     = np.linalg.solve(X.T@X + lam*np.eye(p), X.T@y)   # リッジ閉形式
print(f"ベイズMAP : {np.round(w_bayes_map, 4)}")
print(f"リッジ    : {np.round(w_ridge, 4)}")
print(f"最大差    : {np.max(np.abs(w_bayes_map - w_ridge)):.2e}  (λ=α/β={lam})")

出力:

ベイズMAP : [ 2.8684 -2.1156 -0.0084  0.1592  1.6411 -0.0275  0.134  -0.129 ]
リッジ    : [ 2.8684 -2.1156 -0.0084  0.1592  1.6411 -0.0275  0.134  -0.129 ]
最大差    : 0.00e+00  (λ=α/β=2.0)

出力の意味:ガウス事前の MAP とリッジ回帰が完全一致(差 00)。リッジの「係数を 00 へ縮める」は、ベイズでは「00 中心のガウス事前が係数を引き戻す」ことに他なりません。真の 00 係数も完全には 00 にならず、小さな値(0.01,0.16,-0.01,0.16,\dots)が残る——ガウス事前は係数を縮めるが消さないのが特徴です。

3. Lasso = ラプラス事前

事前をラプラス(両側指数) p(w)exp(bw1)p(w)\propto\exp(-b\|w\|_1) にすると logp(w)=bw1-\log p(w)=b\|w\|_1、すなわち L1 罰則 = Lasso。Lasso は係数を厳密に 00 にして変数選択します。座標降下(ソフト閾値)で実装します。

import numpy as np

rng = np.random.default_rng(0)
n, p = 60, 8
true_w = np.array([3.0, -2.0, 0, 0, 1.5, 0, 0, 0])
X = rng.standard_normal((n, p)); y = X @ true_w + rng.normal(0, 1.0, n)
w_ridge = np.linalg.solve(X.T@X + 2.0*np.eye(p), X.T@y)

def soft(rho, t): return np.sign(rho)*max(abs(rho)-t, 0.0)   # ソフト閾値
def lasso(X, y, lam, iters=1000):
    w = np.zeros(X.shape[1]); col2 = (X**2).sum(0)
    for _ in range(iters):
        for j in range(len(w)):
            rj = X[:,j] @ (y - X@w + X[:,j]*w[j])             # 残差相関
            w[j] = soft(rj, lam)/col2[j]                      # 0 へ閾値処理
    return w

w_lasso = lasso(X, y, lam=12.0)
print(f"真の w : {true_w}")
print(f"リッジ : {np.round(w_ridge, 2)}(全係数が非ゼロ)")
print(f"Lasso  : {np.round(w_lasso, 2)}(無関係な係数が厳密に0)")
print(f"Lassoの非ゼロ数={np.sum(np.abs(w_lasso)>1e-6)} / 真の非ゼロ数={np.sum(true_w!=0)}")

出力:

真の w : [ 3.  -2.   0.   0.   1.5  0.   0.   0. ]
リッジ : [ 2.87 -2.12 -0.01  0.16  1.64 -0.03  0.13 -0.13](全係数が非ゼロ)
Lasso  : [ 2.68 -1.94 -0.    0.    1.55 -0.    0.   -0.  ](無関係な係数が厳密に0)
Lassoの非ゼロ数=3 / 真の非ゼロ数=3

出力の意味:リッジが無関係な係数を小さく残す(0.01,0.16,-0.01,0.16,\dots)のに対し、Lasso は無関係な5係数を厳密に 00し、真の非ゼロ3個を正しく拾いました。L1 罰則=ラプラス事前が変数選択になるわけです。

4. なぜ L1 は疎・L2 は密なのか:事前の形

違いは事前分布の**00 での尖り方です。ラプラス事前は 00鋭い角**(微分不可能な尖り)を持ち、00 近くの係数を 00 へ強く吸い込みます。ガウス事前は 00滑らかなので、縮めても 00 にはしません。

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

w = np.linspace(-3, 3, 400)
gauss = np.exp(-0.5*w**2)                      # ガウス事前(∝, 0で滑らか)
laplace = np.exp(-np.abs(w))                   # ラプラス事前(∝, 0で尖る)
plt.figure(figsize=(7, 4))
plt.plot(w, gauss/gauss.max(), label="ガウス事前(→リッジ・密)")
plt.plot(w, laplace/laplace.max(), label="ラプラス事前(→Lasso・疎)")
plt.axvline(0, color="gray", lw=0.6)
plt.xlabel("係数 w_j"); plt.ylabel("事前密度(規格化)")
plt.title("事前の形:ラプラスは0で尖る→係数を0に吸い込む")
plt.legend(); plt.tight_layout(); plt.show()

グラフの意味:ラプラス(橙)は 00 で角ばって尖り、その尖りが MAP 最適化で係数を厳密に 00 へ引き込みます。ガウス(青)は 00 で丸いので、縮めるだけで 00 にはしません。これが「L1 =疎、L2 =密」の正体で、罰則の幾何ではなく事前分布の形として理解できます(正則化の理論)。

5. MAP の限界:点推定には不確実性がない

正則化=MAP は点推定です。リッジや Lasso は係数を1組返すだけで、「その係数がどれくらい確からしいか」を語りません。フルベイズ(ベイズ線形回帰)なら係数の事後分布が得られ、予測にも不確実性帯がつきます。ラプラス事前でフルベイズにすると Lasso のような厳密な 00 は出ません(事後平均は 00 にならない)——「スパース性は MAP(最頻値)の性質」という点も、点推定とフルベイズの違いとして要注意です(ベイズ的スパース化には horseshoe 事前などを使う。要最新確認)。

⚠️ よくある誤解

関連ノート