Mímisbrunnr知恵の泉

← シミュレーション 一覧

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

📎 前提:逆関数法 | 関連:重点サンプリング | メトロポリス・ヘイスティングス法

要点(BLUF)

1. 原理:包絡して当たり判定

逆関数法は F1F^{-1} が書けないと使えません(逆関数法)。棄却法はその制約を外す汎用法です。アイデアは「目的の密度 ff を、引きやすい密度 gg の定数倍 MgMg で覆い(包絡し)、覆いの下に当たった点だけ採用する」。

条件は、ある定数 M1M \ge 1 が存在して、ff の台すべてで

f(x)Mg(x)f(x) \le M\, g(x)

手順は3ステップ:

  1. 提案 XgX \sim g を引く
  2. UU(0,1)U \sim \mathcal{U}(0,1) を引く
  3. Uf(X)Mg(X)U \le \dfrac{f(X)}{M g(X)} なら XX受理、さもなくば棄却して1に戻る
flowchart TD
    A["提案 X ~ g を引く"] --> B["U ~ U(0,1) を引く"]
    B --> C{"U <= f(X)/(M g(X)) ?"}
    C -->|"はい(受理)"| D["X を採用"]
    C -->|"いいえ(棄却)"| A

2. なぜ受理されたサンプルが f に従うのか

受理される確率は、xx で条件づけると f(x)/(Mg(x))f(x)/(Mg(x))XgX \sim g なので、「xx 付近を提案し、かつ受理する」同時密度は g(x)f(x)Mg(x)=f(x)Mg(x)\cdot \frac{f(x)}{Mg(x)} = \frac{f(x)}{M}。これを全域で積分すると全体の受理確率

P(受理)=f(x)Mdx=1MP(\text{受理}) = \int \frac{f(x)}{M}\,dx = \frac{1}{M}

ff は密度なので積分は1)。よって受理されたサンプルの密度は f(x)/M1/M=f(x)\frac{f(x)/M}{1/M} = f(x)、すなわち厳密に目的分布。同時に、受理率が 1/M1/M だとわかります。MM が大きい=覆いが目的より大きすぎる=棄却が多く非効率、ということです。

3. 具体例:Beta(2,2) を一様提案で生成

目的を f(x)=6x(1x)f(x) = 6x(1-x)[0,1][0,1] 上の Beta(2,2))、提案を g(x)=1g(x) = 1(一様)とします。ff の最大は x=0.5x=0.5f(0.5)=1.5f(0.5) = 1.5 なので M=1.5M = 1.5 で覆えます。

import numpy as np

# 乱数シードを固定
rng = np.random.default_rng(4)

M = 1.5
N_try = 1_000_000
x = rng.random(N_try)              # 提案 ~ Uniform(0,1)
u = rng.random(N_try)
f = 6 * x * (1 - x)                # 目的密度 Beta(2,2)
accept = u <= f / (M * 1.0)        # 受理判定(g=1)
samples = x[accept]

print(f"受理率(シミュ) = {accept.mean():.4f}  (理論 1/M = {1/M:.4f})")
print(f"サンプル平均 = {samples.mean():.4f}  (理論 0.5)")
print(f"サンプル分散 = {samples.var():.4f}  (理論 0.05)")

出力:

受理率(シミュ) = 0.6662  (理論 1/M = 0.6667)
サンプル平均 = 0.5003  (理論 0.5)
サンプル分散 = 0.0501  (理論 0.0500)

出力の意味:受理率 0.666 が理論値 1/M=1/1.5=0.6671/M = 1/1.5 = 0.667 とピタリ。受理されたサンプルの平均 0.500・分散 0.0501 も Beta(2,2) の理論値(平均 αα+β=0.5\frac{\alpha}{\alpha+\beta}=0.5、分散 αβ(α+β)2(α+β+1)=0.05\frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta+1)}=0.05)と一致。覆いの定数 MM を最小(1.5)に取ったので、提案の約3分の2が活きています。

4. 効率と提案分布の選び方

数式の直観的意味

棄却法は「密度のグラフの下の面積に、一様に点をばらまく」操作と見ると直観的です。MgMg で覆った長方形(一般には gg 形の領域)に一様に点を打ち、ff の曲線より下の点だけ残す。残った点の xx 座標は、ff が高いところほど密に分布する——だから ff に従います。受理率 1/M1/M は「覆いの面積 MM のうち、目的の面積 1 が占める割合」そのもの。MM を目的にぴったり被せるほど無駄打ちが減る、という幾何が効率を決めています。

⚠️ よくある誤解・落とし穴

対応シミュレーション参照

本文の Beta(2,2) 棄却サンプリング(default_rng(4)、受理率 = 1/M の確認)。

関連ノート