#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]] ~ ~