LogoMark.png

InversionMethod の変更点


#author("2023-02-03T19:41:19+09:00","default:inoue.ko","inoue.ko")
#author("2023-02-03T19:42:20+09:00","default:inoue.ko","inoue.ko")
*逆関数法
Inversion Method
~

#image(InversionMethod.png,right,30%)
逆関数法(inversion method)とは、[[累積分布関数>Google:累積分布関数]]の逆関数を用いて、様々な分布に従う確率変数を生成する手法のことです。コンピュータを用いたシミュレーションでは、プログラム言語に標準的に用意された「標準一様分布に従う乱数」にこの方法を適用して、指数分布やポアソン分布に従う乱数を生成します。
逆関数法(inversion method)とは、[[累積分布関数>Google:累積分布関数]]の逆関数を用いて、様々な分布に従う確率変数を生成する手法のことです。コンピュータを用いたシミュレーションでは、プログラム言語に標準的に用意された「標準一様分布に従う乱数 [ 0,1 )」にこの方法を適用して、指数分布やポアソン分布に従う乱数を生成します。
&scale(75){Source:[[Wikimedia Commons File:Inversion method.svg>https://commons.wikimedia.org/wiki/File:Inversion_method.svg]]};
~

***原理
連続型の確率密度関数 &mathjax( f(x) );を &mathjax(-\infty);から x までを定積分すると、''累積分布関数'' &mathjax( F(x) );が得られます。

|50|50|c
|#image(Statistics/NormalDistribution/NormalDistribution.png)|#image(Statistics/NormalDistribution/NormalDistributionCDF.png)|
|CENTER:確率密度関数 f(x)|CENTER:累積分布関数 F(x)|
&scale(75){''Wikimedia Commons:'' [[Normal Distribution PDF.svg>https://commons.wikimedia.org/wiki/File:Normal_Distribution_PDF.svg]] , [[Normal Distribution CDF.svg>https://commons.wikimedia.org/wiki/File:Normal_Distribution_CDF.svg]]};

&mathjax( F(x) );は 0.0 〜 1.0 まで単調に増加するのが一般的で、&mathjax( f(x) );において、分布の山にあたる部分では、 &mathjax( F(x) );は急激な上昇カーブを描き、分布の裾野にあたる部分では、 &mathjax( F(x) );はゆっくりと上昇します。

#image(InversionMethod.png,right,30%)
関数を逆向きに見て、y軸側から標準一様乱数(0.0 〜 1.0)を「カーブにぶつける」とすれば、急激な上昇をする箇所(もとの分布では山にあたる部分)の範囲が広くて「当たりやすく」、結果、x軸上の当該部分付近で乱数の分布が密に(分布の山に)なります。つまり、この x は &mathjax( f(x) );に従う乱数として使える・・というのが直感的な説明です。
~

***事例|指数乱数

事例として、指数分布 &mathjax(X 〜 E_x(λ)); に従う乱数の生成について概説します。

#image(Statistics/ExponentialDistribution/ExponentialDistribution.png,right,30%)
指数分布の確率密度関数は、右のようなグラフで、これを関数式で書くと以下のようになります。
&scale(75){Source:[[Wikimedia Commons File:Exponential distribution pdf.png>https://commons.wikimedia.org/wiki/File:Exponential_distribution_pdf.png]]};

#mathjax( f(x) = λ e^{-λx} ( x \geq 0 ))
~


#image(Statistics/ExponentialDistribution/ExponentialDistributionCDF.png,right,30%)
指数分布の累積分布関数は、右のようなグラフで、これを関数式で書くと以下のようになります。
&scale(75){Source:[[Wikimedia Commons File:Exponential distribution cdf.png>https://commons.wikimedia.org/wiki/File:Exponential_distribution_cdf.png]]};

#mathjax( F(x) = 1 - e^{-λx} )

この逆関数は、&mathjax( F^{-1}(x) = -\frac{1}{λ} \ln(1-y) ); で、&mathjax(X = -\frac{1}{λ} \ln(1-U) );となります。&mathjax(1-U);は、実質的に&mathjax(U); と同じになるため、高速化のためにこれを簡略化して、以下の式が得られます。
#mathjax(X = -\frac{1}{λ} \ln(U) )

&small(註):Uは、標準一様分布の確率変数で、0.0 〜 1.0 の値を取ります。);
&small(註):ln は e = 2.71828182...を底とする 自然対数(natural logarithm)です。);

指数分布のパラメータ λ は、確率変数 X の 期待値 (1 / λ)の逆数にあたるもので、直感的にわかりにくいので、期待値を &mathjax(μ = 1/λ); として、以下のように書く方がわかりやすいかもしれません。
#mathjax(X = -μ \ln(U) )

~

***指数乱数のプログラム例
以下、Python で記述した例です。
__[[GitHub:InversionMethod.ipynb>https://github.com/koichi-inoue/JupyterNotebook/blob/master/InversionMethod.ipynb]]__

~
~


**APPENDIX
***関連ページ
-[[Statistics/Probability]]
-[[Statistics/UniformDistribution]]
-[[Statistics/BinomialDistribution]]
-[[Statistics/PoissonDistribution]]
-[[Statistics/NormalDistribution]]
-[[Statistics/ExponentialDistribution]]
~
~