🎓 レベル:発展 | 重要度:B(推奨)
📎 前提:収束率と誤差(√n則) | 関連:擬似乱数(線形合同法・メルセンヌツイスタ)
要点(BLUF)
- 準モンテカルロ(QMC):乱数ではなく、定義域を意図的に均等に敷き詰める低食い違い列(Sobol・Halton)を使います。
- 一様性の尺度「食い違い(discrepancy)」を小さくするよう設計され、収束が から へとほぼ に改善します。
- で、Sobol 列の誤差は同じ点数の素朴モンテカルロより桁違いに小さい( で約 対 )。
1. アイデア:ランダムをやめて均等に敷く
モンテカルロの誤差 は、乱数点の配置にムラ(かたまりと隙間)があることに由来します。だったら、最初からできるだけ均等に点を配置すればいい——これが準モンテカルロの発想です。
ただし格子(等間隔)は次元の呪い()に陥るので、代わりに低食い違い列を使います。これは「どの部分区間を見ても、点の割合がその区間の体積にほぼ比例する」ように決定的に作られた点列で、ランダムより遥かに均等です。代表が Sobol 列と Halton 列。
2. 食い違い(discrepancy)と収束
一様性の尺度がスター食い違い です。点集合 について、原点を角とする任意の箱 で「箱に入る点の割合」と「箱の体積」の差の上限:
Koksma–Hlawka の不等式が積分誤差を食い違いで抑えます:
ここで は被積分関数の変動(Hardy–Krause 変動)。ランダム点の食い違いは ですが、低食い違い列は 。ほぼ なので、 より圧倒的に速い。ただし次元 が高いと が効き始め、優位は薄れます。
3. 実測:Sobol 列 vs 素朴MC
import numpy as np
from scipy.stats import qmc
# 乱数シードを固定
rng = np.random.default_rng(34)
true = np.e - 1
for m in [8, 10, 12, 14, 16]:
n = 2**m
sobol = qmc.Sobol(d=1, scramble=True, seed=rng) # スクランブル付きSobol列
pts = sobol.random(n).ravel()
qmc_est = np.exp(pts).mean()
mc_est = np.exp(rng.random(n)).mean() # 同じ点数の素朴MC
print(f"n=2^{m}={n:>6}: QMC誤差={abs(qmc_est-true):.2e} MC誤差={abs(mc_est-true):.2e}")
出力:
n=2^8= 256: QMC誤差=1.22e-07 MC誤差=2.40e-02
n=2^10= 1024: QMC誤差=3.14e-09 MC誤差=1.08e-02
n=2^12= 4096: QMC誤差=8.00e-10 MC誤差=4.89e-03
n=2^14= 16384: QMC誤差=8.00e-10 MC誤差=5.25e-03
n=2^16= 65536: QMC誤差=8.00e-10 MC誤差=1.71e-03
出力の意味:1次元のなめらかな被積分関数では、Sobol 列の誤差が素朴MCより5〜7桁小さい。 ですでに QMC は 、MC は 。QMC は点数を増やすと急速に誤差が落ち(ほぼ )、 以降は浮動小数点の限界()に達しています。点を「賢く均等に」置くだけで、これだけ違う。低次元・なめらか・高精度が欲しい積分では QMC が圧倒的です。
4. スクランブルと使いどころ
- スクランブル(randomized QMC):決定的な Sobol 列にランダムな置換を加えると、(1) 誤差を統計的に評価できる(複数のスクランブルで標準誤差を出せる)、(2) 一部の構造的バイアスを除ける。本コードの
scramble=Trueがこれ。 - 使いどころ:低〜中次元(〜数十次元)でなめらかな被積分関数。金融(経路依存オプション)・数値積分で実績多数。
- 限界:高次元・不連続な被積分関数では変動 が大きく優位が薄れます。乱数性が本質的に要るMCMCには使えません。
数式の直観的意味
準モンテカルロは「運に頼らず、定義域を几帳面に塗りつぶす」操作です。 の は「独立な乱数のムラが完全には消えない」ことの代償でしたが、QMC は最初からムラを作らないので、その代償を払わずに済む——だから に近づく。Koksma–Hlawka の不等式は「積分誤差 ≤ 関数の暴れ具合 × 点配置のムラ」と読め、点配置のムラ(食い違い)を設計で潰せば誤差が直接縮む、と教えます。一方 が次元とともに膨らむのは、「高次元では『均等に塗る』こと自体が難しくなる」ことの数学的表現。低次元でこそ真価を発揮する理由です。
⚠️ よくある誤解・落とし穴
- 「QMC は乱数列だ」ではない:基本は決定的な点列。スクランブルで初めてランダム性が入ります。
- 「いつでも 」ではない:高次元や不連続関数では や大きな が効き、優位が薄れます。
- 「素朴MCの標準誤差式が使える」ではない:決定的列には CLT が効かず、誤差を で評価できません。誤差評価にはスクランブルが必要。
- 「Sobol 列の最初から使ってよい」ではない:一部の低食い違い列は初期点の質が悪く、 個単位で使う・先頭を捨てるなどの作法があります。
- 「MCMC を QMC で置き換えられる」ではない:MCMC は乱数の連鎖が本質。QMC はあくまで独立サンプリング型の積分向けです。
対応シミュレーション参照
本文の Sobol 列 vs 素朴MC の収束比較(default_rng(34)、5〜7桁の差)。
関連ノート
- 収束率と誤差(√n則)(前提・ 則とその超越)
- [02-01_擬似乱数]
- 重点サンプリング(前のトピック・別の効率化)
- 第4章 分散減少法 目次
- シミュレーション・モンテカルロ法 全体目次