Dengarkan Julia: Mencicipi Teh – Beragampengetahuan
Oleh: Jan Vanhove
Repost dari:
Di posting blog ketiga ini saya mencoba tangan saya di Julia
bahasa, saya akan menangani sedikit variasi pada masalah lama – Fisher’s Tea Tasting
wanita – baik dari segi analisis maupun penggunaan simulasi kekerasan.
Contents
Wanita mencicipi teh
DI DALAM Desain eksperimenRonald A. Fisher menjelaskan Fisher dengan benar
uji dengan menggunakan contoh berikut. Bayangkan seorang wanita mengklaim bahwa dia bisa merasakan
perbedaan antara cangkir teh di mana teh dituangkan ke dalam cangkir
pertama dan kemudian susu ditambahkan, dan cangkir teh tempat susu dituangkan
pertama dan kemudian teh ditambahkan. Seorang skeptis dapat menguji seorang wanita
dan siapkan delapan cangkir teh – empat cangkir teh dengan tambahan susu,
dan empat dengan susu ditambahkan ke teh. (Ngomong-ngomong, semoga sukses untuk keduanya.)
Wanita itu diberi ini secara acak dan diminta untuk mengidentifikasi
keempat cangkir itu dengan teh dengan tambahan susu. Sekarang, jika wanita itu tidak punya
kemampuan untuk mendiskriminasi apa pun, hanya ada 1 dari 70 kemungkinan dia akan mengidentifikasi
keempat cangkir dengan benar. Ini karena ada 70 cara untuk memilih
empat dari delapan cangkir, dan hanya satu yang benar. Di Julia:
binomial(8, 4)
## 70
Kita sekarang dapat membayangkan sedikit variasi dalam percobaan ini.
Jika wanita itu mengidentifikasi keempat cangkir dengan benar, kami memilih untuk percaya bahwa dia
tujuan yang berpotensi diskriminatif. Jika dia mengidentifikasi dua atau kurang
cangkir dengan benar, kami tetap skeptis. Tapi dia mengidentifikasi tiga dari empat
cangkir dengan benar, kami menyiapkan delapan cangkir teh lagi dan memberinya satu cangkir lagi
kesempatan dalam kondisi yang sama.
Kami dapat mengajukan dua pertanyaan tentang prosedur baru ini:
- Seberapa besar kemungkinan kita akan mempercayai wanita tersebut jika, pada kenyataannya, dia tidak memiliki kapasitas diskriminatif?
- Rata-rata, berapa putaran pencicipan teh yang kita perlukan sebelum percobaan selesai?
Berikut ini, saya akan berbagi berbasis analitis dan simulasi
jawaban atas pertanyaan-pertanyaan ini.
Solusi analitis
Menurut hipotesis non-diskriminatif,
jumlah pasti cangkir dalam undian apa pun ($X$) diikuti oleh a
distribusi metafisik
dengan parameter $N = 8$ (total), $K = 4$ (berhasil) dan $n = 4$ (seri), yaitu,
[
X \sim \textrm{Hypergeometric}(8, 4, 4).
]
Di babak mana pun, subjek akan gagal dalam ujian jika dia hanya menentukan
0, 1 atau 2 cangkir benar. Menurut hipotesis nol, kemungkinan ini
terjadi diberikan oleh $p = \mathbb{P}(X \leq 2)$, nilainya
kita dapat menentukan menggunakan fungsi massa kumulatif dari
Distribusi metafisik (8, 4, 4).
Kami menangguhkan penilaian atas kemampuan subjek untuk mendiskriminasi jika dia
mengidentifikasi tiga cangkir dengan benar, dalam hal ini dia memiliki satu cangkir lagi.
Di bawah hipotesis nol, kemungkinan hal ini terjadi di mana saja
loop yang diberikan diberikan oleh $q = \mathbb{P}(X = 3)$, nilainya
dapat ditentukan dengan menggunakan fungsi massa probabilistik Hipergeometrik(8, 4, 4)
alokasi.
Dengan probabilitas tersebut, kita sekarang dapat menghitung probabilitas itu
subjek gagal dalam percobaan di babak tertentu, dengan asumsi hipotesis nol
benar. Di babak pertama, dia akan gagal dengan probabilitas $p$.
Untuk gagal di babak kedua, dia harus maju ke babak kedua.
putaran kedua, terjadi dengan probabilitas $q$, dan kemudian gagal putaran itu,
terjadi dengan probabilitas $p$. Artinya, dia akan gagal untuk kedua kalinya
dibulatkan dengan probabilitas $pq$. Untuk gagal di babak ketiga, dia harus melanjutkan
ke putaran ketiga, terjadi dengan probabilitas $q^2$ dan kemudian gagal
putaran ketiga, terjadi dengan probabilitas $p$. Artinya, dia akan gagal
di babak ketiga dengan probabilitas $pq^2$. Dan lain-lain.
Probabilitas bahwa dia akan gagal di suatu tempat dalam percobaan jika nol
hipotesis benar, maka
diberikan oleh
[
\sum_{i = 1}^{\infty}pq^{i-1} = \sum_{i = 0}^{\infty}pq^i = \frac{p}{1-q},
]
di mana persamaan pertama hanyalah masalah mengubah indeks
dan persamaan kedua benar karena pernyataan tersebut merupakan deret geometri.
Mari menghitung hasil akhir menggunakan Julia.
Di sini unduh DataFrames Dan Distributions kemasan
dan kemudian menentukan d sebagai distribusi Hypergeometric(8, 4, 4).
Perhatikan bahwa di Julia, parameter untuk distribusi Hypergeometric
bukan $N$ (total), $K$ (menang) dan $n$ (seri), tetapi $k$ (menang), $Nk$ (kalah) dan $n$ (seri);
Penampil Dokumen.
Kami kemudian membaca nilai untuk $p$ dan $q$ dari fungsi massa kumulatif dan fungsi massa probabilitas, masing-masing:
using Distributions
d = Hypergeometric(4, 4, 4);
p = cdf(d, 2);
q = pdf(d, 3);
Probabilitas bahwa subjek akan gagal dalam percobaan jika dia benar-benar gagal
Kemungkinan diskriminasi yang ditargetkan sekarang dapat dihitung dengan mudah:
p / (1 - q)
## 0.9814814814814815
Pertanyaan selanjutnya adalah berapa putaran yang kita harapkan untuk melanjutkan percobaan.
jika hipotesis nol benar. Pada setiap putaran, kemungkinan bahwa
percobaan yang berakhir pada putaran itu diberikan oleh $1 – q$.
Dari distribusi geometris,
kita tahu bahwa rata-rata kita membutuhkan $1/(1-q)$ coba sebelum yang pertama
peristiwa akhir terjadi:
1 / (1 - q)
## 1.2962962962962965
Singkatnya, jika subjek tidak memiliki kemampuan membedakan, hanya ada
1,85% kemungkinan dia akan lulus ujian dan rata-rata ujian
akan berjalan 1,3 putaran.
solusi kekerasan
Pertama, kita mendefinisikan sebuah fungsi experiment() menjalankan tes sekali.
Intinya, kita memiliki urn yang empat di antaranya benar
identifikasi (true) dan empat kesalahan identifikasi (false).
Mulai sekarang urnKami sample() empat pengenal tanpa penggantian.
Perhatikan bahwa fungsi Julia dapat mengambil kedua argumen posisi
dan argumen kata kunci. di dalam sample() perintah di bawah ini, keduanya urn Dan4 dilewatkan sebagai argumen posisi dan Anda harus membaca
dokumen
untuk mengetahui argumen mana yang menentukan apa.
Argumen kata kunci dipisahkan dari argumen posisi oleh titik koma
dan diidentifikasi dengan nama parameter.
Selanjutnya, kami menghitung jumlahnya trueada di dalam kita pick menggunakan sum().
Tergantung seberapa banyak trues terkandung di pickKami
Akhir percobaan, kembalilah false jika kita masih ragu
Dan true jika kita memilih untuk mempercayai wanita itu, atau kita menjalankan tes untuk a
lebih bulat. Jumlah upaya juga dihitung dan dikeluarkan.
function experiment(attempt = 1)
urn = [false, false, false, false, true, true, true, true]
pick = sample(urn, 4; replace = false)
number = sum(pick)
if number <= 2
return false, attempt
elseif number >= 4
return true, attempt
else
return experiment(attempt + 1)
end
end;
Satu lari experiment() dapat menghasilkan output sebagai berikut:
experiment()
## (false, 2)
Selanjutnya, kita menulis sebuah fungsi simulate() yang berjalan experiment()
sejumlah besar kali, dan output baik setiap kali experiment()
yang mengarah pada apakah kita mempercayai wanita itu atau skeptis lainnya, dan berapa putaran setiap putaranexperiment() ambil. Hasil ini ditabulasikan DataFrame – hanya karena.
Khususnya, Julia mendukung pemahaman daftar yang akan akrab dengan pengguna Python.
Saya menggunakan fitur ini di sini dan menjalankan pengujian berkali-kali
serta untuk parsing keluaran.
using DataFrames
function simulate(runs = 10000)
results = [experiment() for _ in 1:runs]
success = [results[i][1] for i in 1:runs]
attempts = [results[i][2] for i in 1:runs]
d = DataFrame(Successful = success, Attempts = attempts)
return d
end;
Ayo lompati pagar dan jalankan tes ini jutaan kali.
Sama seperti di Python, kita dapat membuat angka besar lebih mudah diurai dengan memasukkan
Garis bawahi di mana:
runs = 1_000_000;
Menggunakan @time makro, kita dapat memeriksa berapa lama untuk mensimulasikan ini
akhir.
@time d = simulate(runs)
## 0.783903 seconds (4.50 M allocations: 380.651 MiB, 8.40% gc time, 59.95% compilation time)
## 1000000×2 DataFrame
## Row │ Successful Attempts
## │ Bool Int64
## ─────────┼──────────────────────
## 1 │ false 2
## 2 │ false 1
## 3 │ false 1
## 4 │ false 1
## 5 │ false 1
## 6 │ false 1
## 7 │ false 1
## 8 │ false 1
## ⋮ │ ⋮ ⋮
## 999994 │ false 2
## 999995 │ false 1
## 999996 │ false 1
## 999997 │ true 1
## 999998 │ false 1
## 999999 │ false 2
## 1000000 │ false 1
## 999985 rows omitted
Di mesin saya, dibutuhkan lebih sedikit waktu untuk menjalankan simulasi ini
lebih dari satu detik.
Perhatikan bahwa 60% dari waktu ini adalah waktu kompilasi.
Memang, jika kita menjalankan fungsi tersebut di lain waktu, yaitu,
setelah dikompilasi, run time turun menjadi sekitar 0,3
Kedua:
@time d2 = simulate(runs)
## 0.299691 seconds (3.89 M allocations: 348.754 MiB, 9.35% gc time)
## 1000000×2 DataFrame
## Row │ Successful Attempts
## │ Bool Int64
## ─────────┼──────────────────────
## 1 │ false 1
## 2 │ false 2
## 3 │ false 1
## 4 │ false 1
## 5 │ false 1
## 6 │ false 1
## 7 │ false 1
## 8 │ false 2
## ⋮ │ ⋮ ⋮
## 999994 │ false 2
## 999995 │ false 1
## 999996 │ false 2
## 999997 │ false 1
## 999998 │ false 1
## 999999 │ false 1
## 1000000 │ false 1
## 999985 rows omitted
menggunakan describe()kami menemukan bahwa simulasi ini –
tidak ‘tahu’ apa-apa tentang metafisika
dan distribusi geometris, menghasilkan jawaban yang sama
yang telah kami capai melalui analisis:
Ada kemungkinan 1,85% kita pada akhirnya akan mempercayai wanita itu
bahkan jika dia tidak memiliki kemampuan diskriminatif apapun.
Dan jika dia tidak memiliki kebijaksanaan,
kita membutuhkan rata-rata 1,3 putaran sebelum akhir
percobaan:
describe(d)
## 2×7 DataFrame
## Row │ variable mean min median max nmissing eltype
## │ Symbol Float64 Integer Float64 Integer Int64 DataType
## ─────┼─────────────────────────────────────────────────────────────────────
## 1 │ Successful 0.018457 false 0.0 true 0 Bool
## 2 │ Attempts 1.29573 1 1.0 9 0 Int64
Perbedaan yang sangat kecil antara model berbasis simulasi
Hasil dan hasil analisis murni kebetulan.
Berikut adalah cara cepat untuk membangun kepercayaan diri 95%.
periode waktu di sekitar kedua estimasi berdasarkan simulasi kami,
dan solusi analitik terletak pada kedua interval.
means = mean.(eachcol(d))
## 2-element Vector{Float64}:
## 0.018457
## 1.295729
ses = std.(eachcol(d)) / sqrt(runs)
## 2-element Vector{Float64}:
## 0.0001345970180477906
## 0.0006191088287649774
upr = means + 1.96*ses
## 2-element Vector{Float64}:
## 0.01872081015537367
## 1.2969424533043792
lwr = means - 1.96*ses
## 2-element Vector{Float64}:
## 0.018193189844626333
## 1.2945155466956206
Terkait
Software Terbaru Saat Ini
Aplikasi yang sedang trend saat ini
object oriented programming, programming language, programming adalah, web programming, belajar programming, tournament software, software, software adalah, contoh software, apa itu software, pengertian software, aplikasi, aplikasi penghasil uang, aplikasi bokep, aplikasi video, programming
#Dengarkan #Julia #Mencicipi #Teh