递归计算机会。
让 ps(x ) 恰好是 X 价值观 0 ≤ X ≤ ķ,全部选中 小号≥ 1 独立抽签 ķ 来自以下人群的商品(无替换商品) Ñ ≥ ķ > 0成员。(让我们ñ 和 ķ 在分析期间固定不变,因此无需明确提及。)
让 ps(x ∣ y) 如果完全是 ÿ 在第一个中选择值 s − 1 然后画 X ≤ ÿ他们中的最后一次抽奖被选中。然后,因为有的子集的那些元件元件和剩余的子集元件分开的其他的选自群体成员,(ÿX)Xÿ(ñ - ÿķ - X)ķ - Xñ - ÿ
ps(x ∣ y)=(ÿX)(ñ - ÿķ - X)(ñķ)。
总概率定律
ps(x )=∑ÿ= xķps(x ∣ y)ps − 1(y)。
对于,可以确定:这是初始分布。s = 1x = k
通过次重复获得完整分布所需的总计算量为。这不仅相当快,算法也很容易。等待粗心的程序员的一个陷阱是,这些概率可能变得非常小,并且下溢浮点计算。以下实现通过计算数组的列中的值来避免这种情况。sO (ķ2s )R
日志(ps(x ))1 ,2 ,... ,小号
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 …18岁967.0967.26(10000100)− 410− 967.26。