Keuntungan Box-Muller dibandingkan metode CDF terbalik untuk mensimulasikan distribusi Normal?

15

Untuk mensimulasikan distribusi normal dari satu set variabel seragam, ada beberapa teknik:

  1. Algoritma Box-Muller , di mana satu sampel dua varian seragam independen pada dan mengubahnya menjadi dua distribusi normal standar independen melalui: Z 0 = (0,1)

    Z0=2lnU1cos(2πU0)Z1=2lnU1sin(2πU0)
  2. metode CDF , di mana orang dapat menyamakan cdf normal dengan varian Uniform: F ( Z ) = U dan menurunkan Z = F - 1 ( U )(F(Z))

    F(Z)=U
    Z=F1(U)

Pertanyaan saya adalah: komputasi mana yang lebih efisien? Saya akan berpikir ini metode terakhir - tetapi sebagian besar makalah yang saya baca menggunakan Box-Muller - mengapa?

Informasi tambahan:

Kebalikan dari CDF normal diketahui dan diberikan oleh:

F1(Z)=2erf1(2Z1),Z(0,1).

Karenanya:

Z=F1(U)=2erf1(2U1),U(0,1).
pengguna2350366
sumber
1
Apa kebalikan dari cdf normal? Itu tidak dapat dihitung secara analitis, hanya jika CDF asli didekati dengan fungsi linear piecewise.
Artem Sobolev
Bukankah keduanya terkait erat? Box Muller, saya percaya, adalah kasus khusus untuk generasi 2-varian.
ttnphns
Hai Barmaley, saya telah menambahkan beberapa informasi di atas. CDF Inverse memiliki ekspresi - tetapi harus dihitung secara komputasi - sehingga mungkin mengapa kotak Muller lebih disukai? Saya berasumsi erf 1 akan dihitung dalam tabel pencarian, seperti nilai-nilai dosa dan kosinus ? Jadi bukankah itu jauh lebih mahal secara komputasi? Namun saya mungkin salah. erf1erf1sincosine
user2350366
2
Ada versi Box-Muller tanpa dosa dan kosinus.
Xi'an
2
@Dilip Untuk aplikasi dengan presisi sangat rendah, seperti grafik komputer, sinus dan cosinus memang dapat dioptimalkan dengan menggunakan tabel pencarian yang sesuai. Namun, untuk aplikasi statistik, optimasi seperti itu tidak pernah digunakan. Pada akhirnya tidak benar-benar lebih sulit untuk menghitung dari log atau sqrt , tetapi pada sistem komputasi modern fungsi-fungsi dasar yang berkaitan dengan exp - termasuk fungsi trigonometri - cenderung dioptimalkan ( cos dan log adalah instruksi dasar pada Intel 8087 chip!), Sedangkan erf tidak tersedia atau telah dikodekan pada level yang lebih tinggi (= lebih lambat). erf1logsqrtexpcoslog
whuber

Jawaban:

16

Dari sudut pandang probabilitas murni, kedua pendekatan itu benar dan karenanya setara. Dari perspektif algoritmik, perbandingan harus mempertimbangkan ketepatan dan biaya komputasi.

Box-Muller bergantung pada generator yang seragam dan harganya hampir sama dengan generator yang seragam ini. Seperti yang disebutkan dalam komentar saya, Anda dapat pergi tanpa panggilan sinus atau cosinus, jika tidak tanpa logaritma:

  • menghasilkan hingga S = U 2 1 + U 2 21
    U1,U2iidU(1,1)
    S=U12+U221
  • ambil dan tentukanX1=ZU1Z=2log(S)/S
    X1=ZU1, X2=ZU2

Algoritma inversi generik membutuhkan panggilan ke invers normal cdf, misalnya qnorm(runif(N))dalam R, yang mungkin lebih mahal daripada yang di atas dan yang lebih penting mungkin gagal di bagian ekor dalam hal presisi, kecuali fungsi kuantil dikodekan dengan baik.

Untuk mengikuti komentar yang dibuat oleh whuber , perbandinganrnorm(N) dan qnorm(runif(N))merupakan keuntungan dari invers cdf, keduanya dalam waktu pelaksanaan:

> 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` `

dan dalam hal kecocokan di ekor: enter image description here

Mengikuti komentar Radford Neal di blog saya , saya ingin menunjukkan bahwa default rnormdi R menggunakan metode inversi, sehingga perbandingan di atas mencerminkan pada antarmuka dan bukan pada metode simulasi itu sendiri! Mengutip dokumentasi R di RNG:

‘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.
Xi'an
sumber
3
logΦ1Φ1X1X2Ui1101
whuber
2
R 3.0.2rowSumsSqnorm(runif(N))InverseCDF[NormalDistribution[], #] &
1
Saya setuju, qnorm(runif(N))bahkan 20% lebih cepat darirnorm(N)
Xi'an
3
Φ1sincos
1
Sebagai perbandingan, menggunakan i7-3740QM @ 2.7Ghz dan R 3.12, untuk panggilan berikut: RNGkind(kind = NULL, normal.kind = 'Inversion');At <- microbenchmark(A <- rnorm(1e5, 0, 1), times = 100L);RNGkind(kind = NULL, normal.kind = 'Box-Muller');Bt <- microbenchmark(B <- rnorm(1e5, 0, 1), times = 100L)Saya mendapatkan mean 11.38363 median 11.18718untuk inversi dan mean 13.00401 median 12.48802untuk Box-Muller
Avraham