Untuk mensimulasikan distribusi normal dari satu set variabel seragam, ada beberapa teknik:
Algoritma Box-Muller , di mana satu sampel dua varian seragam independen pada dan mengubahnya menjadi dua distribusi normal standar independen melalui: Z 0 = √
metode CDF , di mana orang dapat menyamakan cdf normal dengan varian Uniform: F ( Z ) = U dan menurunkan Z = F - 1 ( 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:
Karenanya:
normal-distribution
simulation
uniform
pengguna2350366
sumber
sumber
Jawaban:
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:
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 , perbandingan
rnorm(N)
danqnorm(runif(N))
merupakan keuntungan dari invers cdf, keduanya dalam waktu pelaksanaan:dan dalam hal kecocokan di ekor:
Mengikuti komentar Radford Neal di blog saya , saya ingin menunjukkan bahwa default
rnorm
di R menggunakan metode inversi, sehingga perbandingan di atas mencerminkan pada antarmuka dan bukan pada metode simulasi itu sendiri! Mengutip dokumentasi R di RNG:sumber
R 3.0.2
rowSums
qnorm(runif(N))
InverseCDF[NormalDistribution[], #] &
qnorm(runif(N))
bahkan 20% lebih cepat darirnorm(N)
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 mendapatkanmean 11.38363 median 11.18718
untuk inversi danmean 13.00401 median 12.48802
untuk Box-Muller