Hitung peluang secara rekursif.
Misalkan menjadi probabilitas bahwa nilai x yang tepat , 0 ≤ x ≤ k , dipilih di semua s ≥ 1 penarikan k item independen (tanpa penggantian) dari populasi n ≥ k > 0 anggota. (Mari kita pertahankan n dan k tetap selama analisis sehingga mereka tidak harus disebutkan secara eksplisit.)hals( x )x0 ≤ x ≤ ks ≥ 1kn ≥ k > 0nk
Misalkan adalah probabilitas bahwa jika nilai-nilai y yang tepat dipilih pada s - 1 draw pertama, maka x ≤ y dari mereka dipilih pada draw terakhir. Lalu karena ada ( yhals( x ∣ y)ys - 1x ≤ y himpunan bagian darixelemen darielemeny, dan ( n-y( yx)xy himpunan bagian dari elemenk-x yangtersisadipilih secara terpisah darianggota populasin-ylainnya,( n-yk - x)k - xn - y
hals( x ∣ y) = ( yx) ( n-yk - x)( nk).
Hukum probabilitas total menegaskan
hals( x ) = ∑y= xkhals( x ∣ y) hals - 1( y) .
Untuk , ini merupakan kepastian bahwa x = k : ini adalah distribusi awal.s = 1x = k
Perhitungan total yang diperlukan untuk mendapatkan distribusi penuh naik melalui pengulangan adalah O ( k 2 s ) . Tidak hanya itu cukup cepat, algoritme juga mudah. Salah satu jebakan yang menunggu programmer tidak waspada adalah bahwa probabilitas ini bisa menjadi perhitungan floating-point yang sangat kecil dan underflow. Implementasi berikut menghindari ini dengan menghitung nilai-nilai log ( p s ( x ) ) dalam kolom 1 , 2 , … , s dari sebuah array.sO ( k2s )R
catatan( hals( x ) )1 , 2 , … , s
lp <- function(s, n, k) {
P <- matrix(NA, nrow=k+1, ncol=s, dimnames=list(0:k, 1:s))
P[, 1] <- c(rep(-Inf, k), 0)
for (u in 2:s)
for (i in 0:k) {
q <- P[i:k+1, u-1] + lchoose(i:k, i) + lchoose(n-(i:k), k-i) - lchoose(n, k)
q.0 <- max(q, na.rm=TRUE)
P[i+1, u] <- q.0 + log(sum(exp(q - q.0)))
}
return(P)
}
p <- function(...) zapsmall(exp(lp(...)))
Jawaban atas pertanyaan tersebut diperoleh dengan membiarkan n = 10000 = 10 4 , dan k = 100 = 10 2 . s = 5 , n = 10.000 = 104k = 100 = 102 Outputnya adalah array , tetapi sebagian besar jumlahnya sangat kecil sehingga kita dapat fokus pada x yang sangat kecil . Berikut adalah empat baris pertama yang sesuai dengan x = 0 , 1 , 2 , 3 :101 × 5xx = 0 , 1 , 2 , 3
p(5, 1e4, 1e2)[1:4, ]
Outputnya adalah
1 2 3 4 5
0 0 0.3641945 0.9900484 0.9999 0.999999
1 0 0.3715891 0.0099034 0.0001 0.000001
2 0 0.1857756 0.0000481 0.0000 0.000000
3 0 0.0606681 0.0000002 0.0000 0.000000
Nilai label baris sedangkan nilai s label kolom. Kolom 5 menunjukkan kemungkinan bahwa satu elemen muncul di semua lima sampel adalah sangat kecil (sekitar satu dalam sejuta) dan pada dasarnya tidak ada kemungkinan bahwa dua atau lebih elemen muncul di kelima sampel.xs
Jika Anda ingin melihat seberapa kecil peluang ini, lihat logaritma mereka. Basis 10 nyaman dan kami tidak membutuhkan banyak digit:
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
Output memberitahu kita berapa banyak nol setelah titik desimal:
1 2 3 4 5 6 7 8 9 10 ... 97 98 99 100
6.0 12.3 18.8 25.5 32.3 39.2 46.2 53.2 60.4 67.6 ... 917.0 933.0 949.0 967.0
Angka di baris atas adalah nilai . Misalnya, peluang tepat tiga nilai muncul di semua lima sampel ditemukan oleh komputasi , memberikan 0,000xexp(u[4])
dan memang ini memiliki 18 angka nol sebelum angka signifikan pertama. Sebagai tanda centang, nilai terakhir 967.0 adalah versi bulat dari 967.26 . ( 100000,0000000000000000001434419 ...18967.0967.26(yang menghitung kemungkinan bahwa sampel pertama muncul kembali dalam empat sampel berikutnya) sama dengan10-967,26.( 10000100)- 410- 967.26.