任意の確率分布に従う乱数を逆関数法で一様分布から生成する

学生時代にExcelで色々シミュレーションしていたときによく使った方法です。
エクセル関数で生成できる乱数がrand()で得られる一様分布の乱数くらいしかなく、
他の分布に従う乱数が欲しい時はそこから変換して作っていました。
(Pythonを使うようになってから、Scipyに実装されている確率分布を使えば良いので、滅多に行うことがなくなりました。)

ただ、逆関数法という名前がついていることは最近知りました。
逆関数法 出典: フリー百科事典『ウィキペディア(Wikipedia)』
英語では inverse transform sampling というようです。

前回の記事同様、少々厳密性は犠牲にして、登場する各関数等は(連続性や滑らかさなどの)適切な仮定を満たしているものとします。

まず前提として、区間$[0,1]$上の一様分布に従う乱数$U$は取得できるものとします。
$$
\begin{align}
f_U(u) = \left\{\begin{matrix}
1& u \in[0,1]\\
0& u \notin[0,1]
\end{matrix}\right.
\end{align}
$$

そして欲しい乱数$X$が従う確率密度関数を$f(x)$とし、累積分布関数を$F(x)$とします。
$$
F(x) = \int_{-\infty}^x f(y) dy.
$$

そして$F$の逆関数を$F^{-1}$とした時、
$X=F^{-1}(U)$は、確率密度関数$f(x)$に従う確率変数となります。

証明は前回の記事で紹介した、確率変数の変換を使います。
この記事中の、$g$に相当するのが$F^{-1}$であることに注意して計算します。
まず前回の記事で紹介した返還式に、この記事中で使っている記号に注意しながら代入します。
$$
f_X(x) = f_U(F(x))\frac{du}{dx}.
$$
ここで、累積分布関数の性質より$0\leq F(x)\leq 1$より、$f_U(F(x))=1$です。
さらに、
$$
\frac{du}{dx} = \frac{d}{dx}F(x) = f(x)
$$
となることから、次の式が示されました。
$$
f_X(x) = f(x).
$$

累積分布関数(と、その逆関数)が具体的に計算できる確率分布についてはこれは非常に便利な式です。
学生時代は個人的な調べ物のため、指数分布を使うシミュレーションをよくやっていたので、よく使っていました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です