如果我想有 95% 的几率使不到 1% 的对象有缺陷,我需要多少个样本?

机器算法验证 可能性 置信区间 样本量
2022-03-13 02:17:24

我需要确保我的 XML 站点地图少于1%垃圾(断开的链接)。URL 列表有数十万个,即使可以一一测试它们是可行的,我也不想这样做,原因有很多:

1 - Saved bandwidth
2 - Faster traffic for real clients
3 - Less noise in visitor statistics (because my test would count as a visit)
5 - I could go on...

所以我认为采用随机子集就足够了,问题是我不知道概率。

我可以使用一个简单的功能吗?

如果它有帮助,我们可以假设有一个关于链接在运行中被破坏的概率的先验信息。假设跨越运行有一个0.75%任何给定的链接被破坏。

2个回答

所以这取决于你对破损率的先验信念的分布,但是:大约 3600。

import scipy as sp

p = 0.0075
threshold = .01
confidence = .95

f = lambda n: sp.stats.beta(a=n*p, b=n*(1-p)).cdf(threshold) - confidence
print(sp.optimize.fsolve(f, 1000)[0])

>> 3627.45119614

这里的想法是将链接破损建模为伯努利试验,并将您对破损率的信念建模为 beta 分布。beta 分布与 Bernoulli 分布共轭,运行试验时更新 beta 分布的方法非常简单:

  • 如果失败,则在第一个参数中添加一个,α
  • 如果成功,则在第二个参数中添加一个,β

所以如果我们从一个Beta(0,0)分布并在大约 0.75% 的时间内看到失败,在分布的 95% 的质量低于 0.01 之前需要多少次试验?3600左右。

为了n样品与p=0.0075失败的机会,失败次数的方差是np(1p). 所以使用中心极限定理,有Z一个标准的常态,

P(failures<.01n)P(Z<n(.01p)np(1p))P(Z<n.02898)
现在我们希望上面等于 95%,对应于Z=1.645. 解决n.02898=1.645,我得到n=3222.