Обчислюйте шанси рекурсивно.
Дозволяє pс( х ) бути ймовірністю, що саме х значення, 0≤x≤k, обрані в усіх s≥1 незалежні розіграші k предметів (без заміни) від населення Росії n≥k>0члени. (Тримаємосьn і k фіксовано протягом тривалості аналізу, тому їх не потрібно чітко згадувати.)
Дозволяє ps(x∣y) бути ймовірністю, що якщо точно y значення вибираються в першому s−1 малює, значить x≤yз них обрані в останньому розіграші. Тоді , тому що є підмножин елементів тих елементів, а підмножини залишилися елементів по окремо вибрані з іншого членів населення,(yx)xy(n−yk−x)k−xn−y
ps(x∣y)=(yx)(n−yk−x)(nk).
Закон стверджує повну ймовірність
ps(x)=∑y=xkps(x∣y)ps−1(y).
Для визначено, що : це початковий розподіл.s=1x=k
Загальна кількість обчислень, необхідних для повного розподілу вгору через повторень, становить . Мало того, що досить швидко, алгоритм простий. Однією з неполадок, які очікують на неохайного програміста, є те, що ці ймовірності можуть стати надзвичайно малі та піддаються обчисленням з плаваючою комою. Наступна реалізація уникає цього шляхом обчислення значень у стовпцях масиву.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(...)))
Відповідь на запитання отримуємо, довівши , і . s=5, n=10000=104k=100=102 Вихід - це масив , але більшість чисел настільки малі, що ми можемо зосередитись на дуже малому . Ось перші чотири рядки, що відповідають :101×5xx=0,1,2,3
p(5, 1e4, 1e2)[1:4, ]
Вихід є
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
Значення позначають рядки, а значення позначають стовпці. У колонці 5 показано ймовірність того, що один елемент з’являється у всіх п'яти зразках - мізерний (приблизно один на мільйон), і по суті немає жодного шансу, що два чи більше елементів з’являться у всіх п’яти зразках.xs
Якщо ви хочете побачити, наскільки малі ці шанси, подивіться на їх логарифми. База 10 зручна, і нам не потрібно багато цифр:
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
Вихід показує нам, скільки нулів є після десяткової крапки:
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
Числа у верхньому ряду - це значення . Наприклад, шанс рівно трьох значень, виявлених у всіх п’яти вибірках, виявляється обчисленням , даючи і справді це нулів перед перша значна цифра. Як чек, останнє значення - це округла версія . (що рахує шанси на те, що перший зразок з'явиться у наступних чотирьох зразках) дорівнюєxexp(u[4])
0.0000000000000000001434419…18967.0967.26(10000100)−410−967.26.