Jadi, katakanlah Anda melempar koin 10 kali, dan menyebutnya 1 "peristiwa". Jika Anda menjalankan, 1.000.000 "acara" ini, berapa proporsi acara yang memiliki kepala antara 0,4 dan 0,6? Probabilitas binomial menyarankan ini sekitar 0,65, tetapi kode Mathematica saya memberi tahu saya sekitar 0,24
Inilah sintaksis saya:
In[2]:= X:= RandomInteger[];
In[3]:= experiment[n_]:= Apply[Plus, Table[X, {n}]]/n;
In[4]:= trialheadcount[n_]:= .4 < Apply[Plus, Table[X, {n}]]/n < .6
In[5]:= sample=Table[trialheadcount[10], {1000000}]
In[6]:= Count[sample2,True];
Out[6]:= 245682
Di mana kecelakaan itu?
computational-statistics
mathematica
Tim McKnight
sumber
sumber
Jawaban:
Kecelakaan adalah penggunaan kurang dari ketat.
Dengan sepuluh kali lemparan, satu-satunya cara untuk mendapatkan hasil proporsi kepala ketat antara 0,4 dan 0,6 adalah jika Anda mendapatkan tepat 5 kepala. Itu memiliki probabilitas sekitar 0,246 ( ), yaitu tentang apa yang diberikan oleh simulasi Anda (dengan benar).(105) (12)10≈ 0,246
Jika Anda memasukkan 0,4 dan 0,6 dalam batas Anda, (yaitu 4, 5 atau 6 head dalam 10 kali lemparan) hasilnya memiliki probabilitas sekitar 0,656, seperti yang Anda harapkan.
Pikiran pertama Anda seharusnya tidak menjadi masalah dengan generator angka acak. Masalah seperti itu sudah jelas dalam paket yang banyak digunakan seperti Mathematica jauh sebelum sekarang.
sumber
Beberapa komentar tentang kode yang Anda tulis:
experiment[n_]
tetapi tidak pernah menggunakannya, alih-alih mengulangi definisinya ditrialheadcount[n_]
.experiment[n_]
dapat diprogram secara lebih efisien (tanpa menggunakan perintah bawaanBinomialDistribution
) karenaTotal[RandomInteger[{0,1},n]/n
dan ini jugaX
tidak perlu dilakukan.experiment[n_]
ketat antara 0,4 dan 0,6 lebih efisien dilakukan dengan menulisLength[Select[Table[experiment[10],{10^6}], 0.4 < # < 0.6 &]]
.0.4 <= # <= 0.6
Perintah ini kira-kira 9,6 kali lebih cepat dari kode asli Anda. Saya membayangkan seseorang yang bahkan lebih mahir daripada saya di Mathematica dapat mempercepatnya lebih jauh.
sumber
Total@Map[Counts@RandomVariate[BinomialDistribution[10, 1/2], 10^6], {4, 5, 6}]
. Saya mendugaCounts[]
, sebagai fungsi bawaan, sangat dioptimalkan dibandingkan denganSelect[]
, yang harus bekerja dengan predikat sewenang-wenang.Melakukan Eksperimen Probabilitas dalam Mathematica
Mathematica menawarkan kerangka kerja yang sangat nyaman untuk bekerja dengan probabilitas dan distribusi dan - sementara masalah utama batas yang sesuai telah diatasi - Saya ingin menggunakan pertanyaan ini untuk membuat ini lebih jelas dan mungkin berguna sebagai referensi.
Mari kita buat eksperimen berulang dan tentukan beberapa opsi plot agar sesuai dengan selera kita:
Bekerja dengan distribusi parametrik
Yang memberi kami plot distribusi proporsi yang terpisah:
Melakukan Eksperimen Monte Carlo
Kita dapat menggunakan distribusi untuk satu acara untuk berulang kali sampel darinya (Monte Carlo).
Membandingkan ini dengan distribusi teoretis / asimptotis menunjukkan bahwa segala sesuatu sangat cocok:
sumber