Oblicz szanse rekurencyjnie.
Niech jest prawdopodobieństwo, że dokładnie wartości, , wybierane są we wszystkich niezależny czerpie z elementów (bez wymiany) z populacji członków . (Trzymajmy i ustalone na czas analizy, aby nie musiały być wyraźnie wymienione).ps(x)x0≤x≤ks≥1kn≥k>0nk
Niech będzie prawdopodobieństwem, że jeśli dokładnie wartości zostaną wybrane w pierwszych losowaniach , to z nich zostanie wybranych w ostatnim losowaniu. Następnie, ponieważ istnieją podzbiory elementów tych elementów i podzbiory pozostałych elementów oddzielnie wybiera się z pozostałych członków populacjips(x∣y)ys−1x≤y(yx)xy(n−yk−x)k−xn−y
ps(x∣y)=(yx)(n−yk−x)(nk).
Zapewnia prawo całkowitego prawdopodobieństwa
ps(x)=∑y=xkps(x∣y)ps−1(y).
Dla jest pewne, że : jest to rozkład początkowy.s=1x=k
Całkowite obliczenie potrzebne do uzyskania pełnego rozkładu w górę poprzez powtórzeń to . Algorytm jest nie tylko dość szybki, ale także łatwy. Jedną z pułapek czekających na nieostrożnego programistę jest to, że prawdopodobieństwa te mogą stać się wyjątkowo małe i obliczenia zmiennoprzecinkowe poniżej granicy. Poniższa implementacja pozwala tego uniknąć, obliczając wartości w kolumnach tablicy.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(...)))
Odpowiedź na pytanie uzyskuje się, pozwalając , a . s=5, n=10000=104k=100=102 Dane wyjściowe to tablica , ale większość liczb jest tak mała, że możemy skupić się na bardzo małym . Oto pierwsze cztery wiersze odpowiadające :101×5xx=0,1,2,3
p(5, 1e4, 1e2)[1:4, ]
Dane wyjściowe to
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
Wartości oznaczają wiersze, a wartości oznaczają kolumny. Kolumna 5 pokazuje, że prawdopodobieństwo pojawienia się jednego elementu we wszystkich pięciu próbkach jest niewielkie (około jeden na milion) i zasadniczo nie ma szans, że we wszystkich pięciu próbkach pojawią się dwa lub więcej elementów.xs
Jeśli chcesz zobaczyć, jak małe są te szanse, spójrz na ich logarytmy. Baza 10 jest wygodna i nie potrzebujemy wielu cyfr:
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
Dane wyjściowe mówią nam, ile jest zer po przecinku:
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
Liczby w górnym rzędzie są wartościami . Na przykład, szansa na pojawienie się dokładnie trzech wartości we wszystkich pięciu próbkach jest obliczana na podstawie obliczeń , dając i faktycznie ma to zer przed pierwsza cyfra znacząca. Jako sprawdzenie, ostatnia wartość jest zaokrągloną wersją . (która liczy szanse, że pierwsza próbka pojawi się ponownie w następnych czterech próbkach) wynosixexp(u[4])
0.0000000000000000001434419…18967.0967.26(10000100)−410−967.26.