Saya telah melihat simulasi Monte Carlo baru-baru ini, dan telah menggunakannya untuk memperkirakan konstanta seperti (lingkaran di dalam persegi panjang, area proporsional).
Namun, saya tidak dapat memikirkan metode yang sesuai untuk memperkirakan nilai [angka Euler] menggunakan integrasi Monte Carlo.
Apakah Anda memiliki petunjuk tentang bagaimana hal ini dapat dilakukan?
simulation
monte-carlo
algorithms
random-generation
numerical-integration
statistiknewbie12345
sumber
sumber
R
perintah2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Jika menggunakan fungsi Gamma log mengganggu Anda, gantikan dengan2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, yang hanya menggunakan penambahan, perkalian, pembagian, dan pemotongan, dan abaikan peringatan luapan.) Apa yang mungkin lebih menarik adalah simulasi yang efisien : dapatkah Anda meminimalkan jumlah langkah-langkah komputasi yang diperlukan untuk memperkirakan sampai akurasi tertentu?Jawaban:
Cara sederhana dan elegan untuk memperkirakan oleh Monte Carlo dijelaskan dalam makalah ini . Makalah ini sebenarnya tentang pengajaran . Karenanya, pendekatan tersebut tampaknya sangat sesuai untuk tujuan Anda. Idenya didasarkan pada latihan dari buku teks Rusia populer tentang teori probabilitas oleh Gnedenko. Lihat contoh.22 di hlm.183ee e
Itu terjadi sehingga , di mana adalah variabel acak yang didefinisikan sebagai berikut. Ini adalah jumlah minimum sehingga dan adalah angka acak dari distribusi seragam pada . Cantik bukan ?!ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=e ξ n ∑ni=1ri>1 ri [0,1]
Karena ini adalah latihan, saya tidak yakin apakah itu keren bagi saya untuk mengirim solusi (bukti) di sini :) Jika Anda ingin membuktikannya sendiri, inilah tipnya: bab ini disebut "Momen", yang seharusnya menunjukkan Anda ke arah yang benar.
Jika Anda ingin menerapkannya sendiri, maka jangan membaca lebih lanjut!
Ini adalah algoritma sederhana untuk simulasi Monte Carlo. Gambarlah seragam acak, lalu yang lain dan seterusnya sampai jumlahnya melebihi 1. Jumlah tebusan yang ditarik adalah percobaan pertama Anda. Katakanlah Anda mendapat:
Kemudian sidang pertama Anda diberikan 3. Jauhkan melakukan percobaan ini, dan Anda akan melihat bahwa rata-rata Anda mendapatkan .e
Kode MATLAB, hasil simulasi dan histogram mengikuti.
Hasil dan histogram:
UPDATE: Saya memperbarui kode saya untuk menyingkirkan berbagai hasil uji coba sehingga tidak memerlukan RAM. Saya juga mencetak estimasi PMF.
Pembaruan 2: Inilah solusi Excel saya. Masukkan tombol di Excel dan tautkan ke makro VBA berikut:
Masukkan jumlah uji coba, seperti 1000, di sel D1, dan klik tombol. Di sini bagaimana tampilan layar setelah menjalankan pertama:
UPDATE 3: Silverfish menginspirasi saya ke cara lain, tidak seanggun yang pertama tapi masih keren. Ini menghitung volume n-simpleks menggunakan urutan Sobol .
Secara kebetulan dia menulis buku pertama tentang metode Monte Carlo yang saya baca di sekolah menengah. Ini pengantar metode terbaik menurut saya.
PEMBARUAN 4:
Silverfish dalam komentar menyarankan implementasi rumus Excel sederhana. Ini adalah jenis hasil yang Anda dapatkan dengan pendekatannya setelah sekitar 1 juta angka acak dan uji coba 185 ribu:
Jelas, ini jauh lebih lambat daripada implementasi Excel VBA. Terutama, jika Anda mengubah kode VBA saya untuk tidak memperbarui nilai sel di dalam loop, dan hanya lakukan setelah semua statistik dikumpulkan.
PEMBARUAN 5
Solusi Xi'an # 3 terkait erat (atau bahkan sama dalam arti sesuai komentar jwg di utas). Sulit untuk mengatakan siapa yang datang dengan gagasan pertama Forsythe atau Gnedenko. Edisi 1950 asli Gnedenko dalam bahasa Rusia tidak memiliki bagian Masalah di Bab. Jadi, saya tidak dapat menemukan masalah ini pada pandangan pertama di mana ia berada di edisi selanjutnya. Mungkin ditambahkan kemudian atau dikubur dalam teks.
Seperti yang saya komentari dalam jawaban Xi'an, pendekatan Forsythe terkait dengan bidang menarik lainnya: distribusi jarak antara puncak (ekstrem) dalam urutan acak (IID). Jarak rata-rata adalah 3. Urutan ke bawah dalam pendekatan Forsythe berakhir dengan dasar, jadi jika Anda melanjutkan pengambilan sampel Anda akan mendapatkan bagian bawah lainnya di beberapa titik, lalu di titik lainnya. Anda dapat melacak jarak antara mereka dan membangun distribusi.
sumber
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]
R
solusi yang saya posting di jawaban Xi'an adalah dua puluh kali lebih cepat:n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
Saya menyarankan untuk tidak memilih jawaban Aksakal. Ini tidak bias dan hanya bergantung pada metode menghasilkan penyimpangan seragam unit.
Jawaban saya dapat dibuat tepat secara sewenang-wenang, tetapi masih bias dari nilai sebenarnya dari .e
Jawaban Xi'an benar, tetapi saya pikir ketergantungannya pada fungsi atau cara menghasilkan penyimpangan Poisson acak agak melingkar ketika tujuannya adalah untuk memperkirakan e .log e
Memperkirakan dengan Bootstrappinge
Sebagai gantinya, pertimbangkan prosedur bootstrap. Satu memiliki sejumlah besar objek yang ditarik dengan penggantian ke ukuran sampel n . Pada setiap undian, probabilitas untuk tidak menggambar objek i tertentu adalah 1 - n - 1 , dan ada n gambar seperti itu. Probabilitas bahwa objek tertentu dihilangkan dari semua undian adalah p = ( 1 - 1n n saya 1 - n- 1 n p = ( 1 - 1n)n.
jadi kita juga dapat menulis
Yaitu, estimasi ditemukan dengan memperkirakan probabilitas bahwa pengamatan khusus dihilangkan dari bootstrap mereplikasi melintasi banyak ulangan seperti itu - yaitu fraksi kemunculan objek dalam bootstraps.m B jhal m Bj saya
Ada dua sumber kesalahan dalam perkiraan ini. Hingga akan selalu berarti bahwa hasilnya adalah perkiraan, yaitu estimasi bias. Selain itu, akan berfluktuasi di sekitar nilai sebenarnya karena ini adalah simulasi.pn hal^
Saya menemukan pendekatan ini agak menarik karena sarjana atau orang lain dengan cukup sedikit untuk melakukan bisa perkiraan menggunakan setumpuk kartu, tumpukan batu-batu kecil, atau item lainnya di tangan, di vena sama seperti seseorang bisa memperkirakan menggunakan kompas, tepi lurus dan beberapa butir pasir. Saya pikir itu rapi ketika matematika dapat dipisahkan dari kenyamanan modern seperti komputer.πe π
Hasil
Saya melakukan beberapa simulasi untuk berbagai jumlah replikasi bootstrap. Kesalahan standar diperkirakan menggunakan interval normal.
Perhatikan bahwa pilihan jumlah objek yang sedang bootstrap menetapkan batas atas mutlak pada keakuratan hasil karena prosedur Monte Carlo memperkirakan dan hanya bergantung pada . Pengaturan menjadi terlalu besar hanya akan membebani komputer Anda, baik karena Anda hanya memerlukan perkiraan "kasar" ke atau karena bias akan dibanjiri oleh varians karena Monte Carlo. Hasil ini untuk dan akurat untuk desimal ketiga.p p n n e n = 10 3 p - 1 ≈ en hal hal n n e n = 103 hal- 1≈ e
Plot ini menunjukkan bahwa pilihan memiliki konsekuensi langsung dan mendalam bagi stabilitas di . Garis putus-putus biru menunjukkan dan garis merah menunjukkan . Seperti yang diharapkan, meningkatkan ukuran sampel menghasilkan perkiraan yang lebih akurat . p p e pm hal^ hal e hal^
Saya menulis naskah R yang panjang dan memalukan untuk ini. Saran untuk perbaikan dapat diajukan di belakang tagihan $ 20.
sumber
Solusi 1:
Untuk distribusi Poisson , Oleh karena itu, jika , yang berarti Anda dapat memperkirakan oleh simulasi Poisson. Dan simulasi Poisson dapat diturunkan dari generator distribusi eksponensial (jika tidak dengan cara yang paling efisien).P ( X = k ) = λ kP( λ ) X ∼ P ( 1 ) P ( X = 0 ) = P ( X = 1 ) = e - 1 e - 1
Solusi 2:
Cara lain untuk mencapai representasi konstanta sebagai integral adalah dengan mengingat bahwa, ketika lalu yang juga merupakan distribusi . Oleh karena itu, Pendekatan kedua untuk mendekati oleh Monte Carlo dengan demikian mensimulasikan pasangan normal dan memantau frekuensi kali . Dalam arti itu adalah kebalikan dari perkiraan Monte Carlo dari terkait dengan frekuensi kali ...e
Solusi 3:
Rekan saya dari Universitas Warwick, M. Pollock, menunjukkan perkiraan lain dari Monte Carlo yang disebut metode Forsythe : idenya adalah menjalankan serangkaian generasi yang seragam sampai . Ekspektasi aturan pemberhentian yang sesuai, , yang merupakan jumlah waktu urutan seragam turun maka sedangkan probabilitas bahwa ganjil adalah ! ( Metode Forsythe sebenarnya bertujuan mensimulasikan dari setiap kepadatan bentuk , maka lebih umum daripada mendekati dan .)kamu1, kamu2, . . . kamun + 1> un N e N e- 1 expG ( x ) e e- 1
Implementasi R cepat dari metode Forsythe adalah untuk tidak mengikuti dengan tepat urutan seragam yang mendukung blok yang lebih besar, yang memungkinkan untuk pemrosesan paralel:
sumber
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
Bukan solusi ... hanya komentar cepat yang terlalu panjang untuk kotak komentar.
Aksakal
Aksakal memposting solusi di mana kami menghitung jumlah yang diharapkan dari gambar Seragam standar yang harus diambil, sehingga jumlahnya akan melebihi 1. Dalam Mathematica , formulasi pertama saya adalah:
EDIT: Baru saja bermain cepat dengan ini, dan kode berikut (metode yang sama - juga di Mma - kode yang berbeda) sekitar 10 kali lebih cepat:
Xian / Whuber
Whuber telah menyarankan kode keren cepat untuk mensimulasikan solusi Xian 1:
Versi R:
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
Versi mma:
n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
yang dia catat adalah 20 kali lebih cepat kode pertama (atau sekitar dua kali lebih cepat dari kode baru di atas).
Hanya untuk bersenang-senang, saya pikir akan menarik untuk melihat apakah kedua pendekatan sama efisiennya (dalam arti statistik). Untuk melakukannya, saya menghasilkan 2000 perkiraan e menggunakan:
... keduanya dalam Mathematica . Diagram berikut kontras estimasi kerapatan kernel nonparametrik dari data yang dihasilkan dan dataB set data.
Jadi, sementara kode whuber (kurva merah) sekitar dua kali lebih cepat, metode ini tampaknya tidak dapat diandalkan.
sumber
running four times as many iterations will make them equally accurate
Metode yang membutuhkan jumlah sampel yang tidak saleh
Jika Anda ingin benar-benar gila, Anda bahkan dapat memperkirakan dan menggunakan metode yang Anda bahas sebelumnya.2-√ 2 π--√
Metode yang membutuhkan sampel sangat sedikit, tetapi menyebabkan jumlah kesalahan numerik yang tidak baik
Jawaban yang benar-benar konyol, tetapi sangat efisien, berdasarkan komentar yang saya buat:
Biarkan . Tentukan. Definisikan .Y n = | ( ˉ x ) n | E = ( 1 - Y n ) - 1 / Y nX∼ seragam ( - 1 , 1 ) Yn= | ( x¯)n| e^= ( 1 - Yn)- 1 / Yn
Ini akan menyatu sangat cepat, tetapi juga mengalami kesalahan numerik ekstrem.
1 / Y n n → ∞ Y n Y n = 0Yn 1 / Yn n → ∞ Yn Yn= 0 e
sumber
Berikut cara lain yang bisa dilakukan, meskipun cukup lambat. Saya tidak mengklaim efisiensi, tetapi menawarkan alternatif ini dalam semangat kelengkapan.
Implementasi dalam R: Metode ini dapat diterapkan dalam
R
menggunakanrunif
untuk menghasilkan nilai yang seragam. Kode tersebut adalah sebagai berikut:sumber