Mímisbrunnr知恵の泉

← シミュレーション 一覧

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

📎 前提:収束率と誤差(√n則) | 関連:制御変量法

要点(BLUF)

1. アイデア:誤差を逆向きに振らせる

モンテカルロ推定 1ng(Ui)\frac{1}{n}\sum g(U_i) の分散は、各項の分散 σ2\sigma^2 で決まります。もし負に相関する2つの推定を平均できれば、片方が上振れたとき他方が下振れて相殺し、平均の分散が下がります。

一様乱数 UU(0,1)U \sim \mathcal{U}(0,1) に対し 1U1-UU(0,1)\mathcal{U}(0,1) で、しかも UU が大きいとき 1U1-U は小さい(完全な負の依存)。gg が単調なら g(U)g(U)g(1U)g(1-U) も負に相関します。そこでペアの平均

I^anti=1ni=1ng(Ui)+g(1Ui)2\hat{I}_{\text{anti}} = \frac{1}{n}\sum_{i=1}^{n} \frac{g(U_i) + g(1-U_i)}{2}

を推定量にします。

2. なぜ分散が下がるか

ペア1組の分散は

Var ⁣(g(U)+g(1U)2)=14(σ2+σ2+2Cov(g(U),g(1U)))=σ22(1+ρ)\text{Var}\!\left(\frac{g(U)+g(1-U)}{2}\right) = \frac{1}{4}\Big(\sigma^2 + \sigma^2 + 2\,\text{Cov}\big(g(U),g(1-U)\big)\Big) = \frac{\sigma^2}{2}\,(1+\rho)

ここで ρ=Corr(g(U),g(1U))\rho = \text{Corr}(g(U), g(1-U))。同じ関数評価回数(プレーンは 2n2n 回、対照は nn ペア= 2n2n 回)で比べると、分散比は

Var(対照)Var(プレーン)=1+ρ\frac{\text{Var(対照)}}{\text{Var(プレーン)}} = 1 + \rho

ρ<0\rho < 0 なら 1+ρ<11+\rho < 1 で分散減少。ρ=0.97\rho = -0.97 なら 1+ρ=0.031+\rho = 0.03、すなわち約33倍の改善です。gg が単調なほど ρ\rho は強く負になり、効果が大きくなります。

3. 実測

import numpy as np

# 乱数シードを固定
rng = np.random.default_rng(30)
n = 100_000
reps = 2000

def plain(rng, m):                       # プレーンMC(2n標本)
    u = rng.random(m)
    return np.exp(u)

def antithetic(rng, m):                  # 対照変量(mペア=2m評価)
    u = rng.random(m)
    return (np.exp(u) + np.exp(1 - u)) / 2

plain_ests = np.array([plain(rng, 2*n).mean() for _ in range(reps)])
anti_ests  = np.array([antithetic(rng, n).mean() for _ in range(reps)])

print(f"プレーン   平均={plain_ests.mean():.5f}  分散={plain_ests.var():.2e}")
print(f"対照変量   平均={anti_ests.mean():.5f}  分散={anti_ests.var():.2e}")
print(f"分散減少率 = {plain_ests.var()/anti_ests.var():.2f} 倍")

u = rng.random(500_000)
print(f"corr(e^U, e^(1-U)) = {np.corrcoef(np.exp(u), np.exp(1-u))[0,1]:.4f}")

出力:

プレーン   平均=1.71829  分散=1.29e-06
対照変量   平均=1.71829  分散=4.02e-08
分散減少率 = 31.99 倍
corr(e^U, e^(1-U)) = -0.9677

出力の意味:両者とも真値 e1=1.71828e-1 = 1.71828 を正しく推定(不偏性は保たれる)。しかし分散はプレーン 1.29×1061.29\times10^{-6} に対し対照変量 4.02×1084.02\times10^{-8}約32倍の改善。理論の 1/(1+ρ)=1/(10.9677)=31.01/(1+\rho) = 1/(1-0.9677) = 31.0 とよく一致します。標準誤差にすると 325.7\sqrt{32} \approx 5.7 倍精度が上がる=同じ精度をプレーンの約1/32のサンプルで達成できる、ということです。

数式の直観的意味

対照変量は「サンプルをわざと裏表ペアで取り、運の偏りを打ち消す」操作です。たまたま UU が小さい値ばかり出た(推定が下振れする)回でも、1U1-U は大きい値ばかりになり上振れ、平均すれば偏りが消える。1+ρ1+\rho という分散比は「ペアの誤差がどれだけ逆向きか」の指標で、完全逆相関 ρ=1\rho=-1 なら分散ゼロ(線形関数なら実際に厳密化)。鍵は**gg の単調性**——単調なら UU \uparrowg(U)g(U)\uparrowg(1U)g(1-U)\downarrow となり負相関が保証されます。非単調な gg では ρ\rho が正になり逆効果になり得ます。

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

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

本文の 01exdx\int_0^1 e^x dx 対照変量(default_rng(30)、32倍減)。

関連ノート