純粋に確率論的な観点から見ると、両方のアプローチは正しいため、同等です。アルゴリズムの観点から、比較では精度と計算コストの両方を考慮する必要があります。
Box-Mullerは均一な発電機に依存しており、この均一な発電機とほぼ同じコストです。私のコメントで述べたように、サインやコサインの呼び出しがなくても、対数がなければ逃げることができます。
- 生成まで、S = U 2 1 + U 2 2 ≤ 1
U1,U2∼iidU(−1,1)
S=U21+U22≤1
- Z = √を取るおよびX1=ZU1を定義Z=−2log(S)/S−−−−−−−−−−√
X1=ZU1, X2=ZU2
一般的な反転アルゴリズムでは、例えばqnorm(runif(N))
R の逆正規cdfを呼び出す必要があります。これは、上記よりもコストがかかり、さらに重要なことに、分位関数が適切にコーディングされていない限り、精度の点で失敗する可能性があります。
行われたコメントに従ってくださいwhuber、の比較rnorm(N)
とqnorm(runif(N))
逆CDFの利点である、両方の実行時間で:
> system.time(qnorm(runif(10^8)))
sutilisateur système écoulé
10.137 0.120 10.251
> system.time(rnorm(10^8))
utilisateur système écoulé
13.417 0.060 13.472` `
そして、尾にフィットするという点で:
私のブログでのRadford Nealのコメントに続いてrnorm
、R のデフォルトは反転法を使用しているため、上記の比較はシミュレーション法ではなくインターフェースに反映されていることを指摘したいと思います!RNGに関するRドキュメントを引用するには:
‘normal.kind’ can be ‘"Kinderman-Ramage"’, ‘"Buggy
Kinderman-Ramage"’ (not for ‘set.seed’), ‘"Ahrens-Dieter"’,
‘"Box-Muller"’, ‘"Inversion"’ (the default), or ‘"user-supplied"’.
(For inversion, see the reference in ‘qnorm’.) The
Kinderman-Ramage generator used in versions prior to 1.7.1 (now
called ‘"Buggy"’) had several approximation errors and should only
be used for reproduction of old results. The ‘"Box-Muller"’
generator is stateful as pairs of normals are generated and
returned sequentially. The state is reset whenever it is selected
(even if it is the current normal generator) and when ‘kind’ is
changed.