AI

エンジニア向け入門:棄却サンプリングとは何か?基本概念と応用例をステップバイステップで徹底解説

エンジニア向け入門:棄却サンプリングとは何か?基本概念と応用例をステップバイステップで徹底解説

棄却サンプリングは、任意の確率分布に従う乱数を生成する基本的な手法です。例えば確率密度関数のグラフを大きな板に描き、その周囲に均一に矢を投げると考えます。曲線下に落ちた矢の位置は、元の分布に従うサンプルになります。この手法ではまずターゲット分布$f(x)$と、それを包む提案分布$q(x)$を選択し、定数$M$を用いて$f(x)\le Mq(x)$を満たすよう調整します。次に$q(x)$から候補点$x$を生成し、一様乱数$u\sim U(0,1)$を取得して条件$u\le f(x)/(M\,q(x))$をチェックします。条件を満たす場合にその$x$を受容し、満たさない場合は破棄して再サンプリングします。このように得られたサンプルはターゲット分布に従うことが保証されます。ターゲット分布が正規化済みであれば、理論的に受容される確率(受容率)は$1/M$に等しくなります。さらに、棄却サンプリングは分布関数の正規化(積分が1になる操作)が不要な点が大きな利点です。

棄却サンプリングの仕組みとアルゴリズム:乱数生成のメカニズムをステップバイステップで詳しく解説

棄却サンプリングの手順は非常にシンプルです。まず、提案分布$q(x)$と包絡定数$M$を決めます。ここで$M$は、提案分布をどれだけ拡大すればターゲット分布を完全に包めるかを示す係数であり、安全マージンともいえます。次に$q(x)$から乱数$x$を生成し、一様乱数$u\sim U(0,1)$を引いて判定します。具体的には条件$u\le f(x)/(M\,q(x))$を満たす場合に$x$を受容し、そうでなければ破棄して再試行します。このようにして受け入れられたサンプル群はターゲット分布$f$に従います。理論上、ターゲット分布が正規化されている場合、平均して$M$回の試行から1つのサンプルが得られるため、受容率は$1/M$となります。

棄却サンプリングの基本手順と実装プロセス:ステップバイステップでコード例を交えながら詳しく徹底的に解説

実装面では上記の判定処理を繰り返し実行します。例えばPythonでは、所望のサンプル数に達するまでwhileループで候補点$x$を生成し、一様乱数$u$を取得して受容条件をチェックします。このとき得られたサンプルは相互に独立に分布します。一方、受容率が低い場合には無駄な試行が増えやすいため、提案分布の選択や$M$の調整が重要です。特に次元が増えると「ピークの相対体積」が急減し、受容率が崩壊しやすい点には注意が必要です。

Pythonによる棄却サンプリングの実装例:コードで学ぶステップバイステップで詳しく解説

PythonではNumPyやSciPyなどのライブラリを活用して実装できます。たとえば、ベータ分布を例に、提案分布に[0,1]一様分布を選び、SciPyのbeta.pdf関数を用いて目的分布を評価する方法があります。具体的には以下のようなコードでサンプリングを実装します(コメントは説明用です):

import numpy as np
from scipy.stats import beta
a, b = 2.0, 5.0 # ベータ分布のパラメータ
M = 2.0 # 包絡定数 (例: beta.pdfの概算最大値)
accepted = []
while len(accepted) < N:
x = np.random.rand() # 提案分布からのサンプリング (一様分布)

u = np.random.rand() * M
if u <= beta.pdf(x, a, b):
accepted.append(x)

このコードではbeta.pdfで確率密度を評価し、条件判定で受容を決定します。生成されたサンプルをヒストグラム化して理論分布と比較すれば、棄却サンプリングの正しさを確認できます。

棄却サンプリングを用いた乱数生成の具体例:応用事例と使用例を技術ブログでわかりやすく詳しく解説

具体的な応用例としては、例えば1次元のベータ分布や指数分布などが挙げられます。ベータ分布の場合、[0,1]区間に一様分布を提案分布とし、ベータ密度の最大値から$M$を設定するのが一般的です。一方、多次元の場合には受容率の変化に注意が必要です。たとえば$d$次元の標準ガウス分布$f(x)\propto e^{-|x|^2/2}$を[-R,R]^dの一様分布で包んだ場合、受容率は$(\sqrt{\pi}/R)^{d}$程度に低下するため、高次元ではほとんどサンプルが得られません。また、Wikipediaにもあるように、棄却サンプリングは分布が正規化されていなくても適用できるため、未知の正規化定数を持つ関数からもサンプルを得られます。

棄却サンプリングの受容率と効率性: 理論式とサンプル数・計算量の関係を実測データで詳しく分析

受容率は生成サンプル数に占める受容サンプルの割合であり、理論上は$1/M$に対応します。すなわち平均して$M$回の試行から1つのサンプルが得られるため、$M$が大きいほど効率は低下します。実装では、同じターゲットサンプル数を得るためにおおよそ$M$倍の計算コストが必要になります。受容率を向上させるには提案分布$q(x)$をターゲットに近づけることが有効です。分布が類似していれば無駄な廃棄が減り効率が向上します。しかし、次元数が増えるとピーク部分の相対体積が小さくなるため、いかなる工夫をしても受容率は著しく低下しやすいことに注意が必要です。

他のサンプリング手法との比較: MCMC・メトロポリス法や重要度サンプリングとの違いと使い分けを徹底解説

棄却サンプリングは各サンプルが独立である点が特徴です。これに対しMCMC(マルコフ連鎖モンテカルロ)法ではサンプルに逐次相関が生じ、バーンインや相関による評価が必要になります。例えばメトロポリス法では状態$x$から提案分布で$x’$を生成し、確率$f(x’)/f(x)$で受容しますが、棄却サンプリングでは定数$M$を用いた確率判定で直接受容を決定します。また重要度サンプリングでは重み$w(x)=f(x)/q(x)$でサンプルを補正しますが、棄却サンプリングでは補正なしに直接ターゲット分布に従うサンプルが得られます。各手法の使い分けは問題設定によりますが、棄却法は独立サンプルが欲しい場合や規格化定数が不明な場合に特に有効です。

資料請求

RELATED POSTS 関連記事