🎓 レベル:標準 | 重要度:A(必須)
📎 前提:ベイズ線形回帰 | 関連:正則化の理論(機械学習)・正則化(Ridge・Lasso・Elastic Net)(機械学習)
要点(BLUF)
- リッジ回帰 = ガウス事前の MAP 推定。L2 罰則 は事前 そのもので、(事前精度/雑音精度)。
- Lasso = ラプラス事前の MAP 推定。L1 罰則 はラプラス(両側指数)事前の で、係数を厳密に にして変数選択します。
- 正則化はベイズ MAP の別名。ただし MAP は点推定なので不確実性は出ません——フルベイズ(ベイズ線形回帰)なら事後分布が得られます。
1. 罰則付き最小二乗 = MAP 推定
回帰の MAP 推定は、事後 尤度 × 事前 の対数を最大化することです。
ガウス尤度の負対数が二乗誤差。事前の負対数が、そのまま正則化の罰則項になります。どんな事前を置くかで、どんな正則化になるかが決まります。
2. リッジ = ガウス事前
事前 なら 。これを上に入れると、、すなわちリッジ回帰()。ベイズ 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 とリッジ回帰が完全一致(差 )。リッジの「係数を へ縮める」は、ベイズでは「 中心のガウス事前が係数を引き戻す」ことに他なりません。真の 係数も完全には にならず、小さな値()が残る——ガウス事前は係数を縮めるが消さないのが特徴です。
3. Lasso = ラプラス事前
事前をラプラス(両側指数) にすると 、すなわち L1 罰則 = Lasso。Lasso は係数を厳密に にして変数選択します。座標降下(ソフト閾値)で実装します。
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
出力の意味:リッジが無関係な係数を小さく残す()のに対し、Lasso は無関係な5係数を厳密に にし、真の非ゼロ3個を正しく拾いました。L1 罰則=ラプラス事前が変数選択になるわけです。
4. なぜ L1 は疎・L2 は密なのか:事前の形
違いは事前分布の** での尖り方です。ラプラス事前は で鋭い角**(微分不可能な尖り)を持ち、 近くの係数を へ強く吸い込みます。ガウス事前は で滑らかなので、縮めても にはしません。
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()
グラフの意味:ラプラス(橙)は で角ばって尖り、その尖りが MAP 最適化で係数を厳密に へ引き込みます。ガウス(青)は で丸いので、縮めるだけで にはしません。これが「L1 =疎、L2 =密」の正体で、罰則の幾何ではなく事前分布の形として理解できます(正則化の理論)。
5. MAP の限界:点推定には不確実性がない
正則化=MAP は点推定です。リッジや Lasso は係数を1組返すだけで、「その係数がどれくらい確からしいか」を語りません。フルベイズ(ベイズ線形回帰)なら係数の事後分布が得られ、予測にも不確実性帯がつきます。ラプラス事前でフルベイズにすると Lasso のような厳密な は出ません(事後平均は にならない)——「スパース性は MAP(最頻値)の性質」という点も、点推定とフルベイズの違いとして要注意です(ベイズ的スパース化には horseshoe 事前などを使う。要最新確認)。
⚠️ よくある誤解
- 「正則化はベイズと無関係な工学的小細工」ではない:罰則は事前の負対数。リッジ=ガウス、Lasso=ラプラスの MAP です。
- 「L1 が疎なのは罰則の角のおかげ」だけではない:等価に、ラプラス事前が で尖るから(§4)。同じことの2つの見方。
- 「Lasso のスパース性はフルベイズでも出る」ではない:厳密な は MAP(最頻値)の性質。ラプラス事前の事後平均は になりません。
- 「正則化したから不確実性も分かる」ではない:MAP は点推定。区間が欲しければフルベイズ(ベイズ線形回帰)。
関連ノート
- ベイズ線形回帰
- ベイズGLM(次のトピック・非ガウスの回帰)
- 点推定と損失関数(MAP の位置づけ)
- 正則化の理論(機械学習・正則化=MAP の理論)
- 正則化(Ridge・Lasso・Elastic Net)(機械学習・実装)
- 正則化(リッジ・Lasso)(統計)
- 第7章 ベイズ回帰とGLM 目次
- ベイズ統計テキスト 全体目次