Şansları yinelemeli olarak hesaplayın.
Let tam olarak bu olasılık olmak değerleri , bütün seçilir ait çizer bağımsız bir nüfustan (yerine koymadan) öğeleri üye . ( ve analiz süresi boyunca sabit tutalım , böylece açıkça belirtilmeleri gerekmez.)ps(x)x0≤x≤ks≥1kn≥k>0nk
Let tam olarak eğer olasılığı olması değerleri ilk seçilir çeker, sonra da bunlardan son beraberlikle seçilir. Daha sonra , bu öğesinin öğesinin alt kümesi olduğundan ve kalan öğelerinin alt kümesi , popülasyonun diğer üyelerinden ayrı olarak seçilir ,ps(x∣y)ys−1x≤y(yx)xy(n−yk−x)k−xn−y
ps(x∣y)=(yx)(n−yk−x)(nk).
Toplam olasılık yasası
ps(x)=∑y=xkps(x∣y)ps−1(y).
İçin , bir kesinlik var bu başlangıç dağılımı şöyle:.s=1x=k
tekrarları yoluyla tam dağılımı elde etmek için gereken toplam hesaplama . Sadece bu kadar hızlı değil, algoritma da kolay. Dikkatsiz programcıyı bekleyen bir tuzak, bu olasılıkların son derece küçük hale gelebilmesi ve kayan nokta hesaplamaları altını alabilmesidir. Aşağıdaki uygulama , bir dizinin sütunlarındaki değerlerini hesaplayarak bunu önler .sO(k2s)R
log(ps(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(...)))
Sorunun yanıtı ve . s=5, n=10000=104k=100=102 Çıktı dizisidir, ancak sayıların çoğu o kadar küçük ki çok küçük odaklanabiliriz . İşte karşılık gelen ilk dört satır :101×5xx=0,1,2,3
p(5, 1e4, 1e2)[1:4, ]
Çıktı
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
Değerleri değerleri ise satır etiket sütunları etiketleyin. Sütun 5, beş numunenin hepsinde bir öğenin görünme olasılığının minik (milyonda bir) olduğunu ve beş numunenin tamamında iki veya daha fazla öğenin görünme şansı olmadığını gösterir.xs
Bu şansların ne kadar küçük olduğunu görmek istiyorsanız, onların logaritmalarına bakın. Temel 10 uygundur ve çok sayıda basamağa ihtiyacımız yoktur:
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
Çıktı bize ondalık noktadan sonra kaç tane sıfır olduğunu söyler:
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
Üst satırdaki sayılar değeridir . Örneğin, beş örneklerde gösteren tam olarak üç değerlerinin şansı hesaplanmasıyla bulunan veren ve gerçekten de bu sahiptir önce sıfır ilk önemli basamak. Çek olarak, son değer yuvarlanmış versiyonudur . (sonraki dört örnekte ilk örneğin tekrar olasılığını sayar) değerine eşittirxexp(u[4])
0.0000000000000000001434419…18967.0967.26(10000100)−410−967.26.