最近「ゼロからできるMCMC」を読んでいます。Chapter2で、ガウス乱数を発生させる方法として、ボックス・ミュラー法が登場します。
実際にJuliaで実装してみたので、(自分の)記録として残しておきます。
ボックス・ミュラー法
ボックス・ミュラー法は、ガウス乱数を発生させる方法です。
$$
x = \sqrt{(-2 logp)}*coś(2 \pi q)
$$
$$
y = \sqrt{(-2 logp)}*sin(2 \pi q)
$$
ボックス・ミュラー法をJuliaで実装する
実装してみるとこんな感じです。今回は、任意の個数(n)の一様乱数のベクトル(x, y)を発生させて、それにボックス・ミュラー法の関数を当てています。
肝としては、ベクトルに関数を適用してもうまく走らない(例:f_x(p, q)
)ので、この様にf_x.(p, q)
、関数のあとに「.」(ドット)をつける必要があります。
# ライブラリ # using Pkg # Pkg.add("RDatasets") # Pkg.add("StatsPlots") using Statistics, StatsPlots ## 初期設定(Wikipediaより) n = 100000 # 乱数を発生させる個数 p = rand(n) q = rand(n) # 関数を定義する # xを生成する関数 function f_x(p, q) sqrt(-2*log(p))*cos(2*π*q) end # yを生成する関数 function f_y(p, q) sqrt(-2*log(p))*sin(2*π*q) end # 実行する x = f_x.(p, q) y = f_y.(p, q) histogram(x) histogram(y)
ja.wikipedia.org