从观察到的数据估计故障率

机器算法验证 自习 马尔可夫链蒙特卡罗 pymc
2022-04-04 23:08:04

我最近读了一本优秀的书Probabilistic Programming & Bayesian Methods for Hackers,我正在尝试自己解决一些问题:

我通过购买 1000 台设备并在 1 年内运行它们以查看有多少失败,来进行一个实验来估计设备(例如 CPU、汽车、风扇等)的可靠性。我的实验表明,其中有 0 个在此期间失败了。失败率的 95% 置信区间是多少?

如果失败的设备数量不为零,我可以使用计算标准误差或自举等标准技术来估计平均值和置信区间。0 个设备失败的事实使它变得更加棘手。我尝试使用 PyMC 来解决它:

import numpy as np
import pymc as pm

data = np.zeros(1000)  # observed data: zero failures out of 1000 devices
p = pm.Uniform('p', 0, 1) # model the failure rate as a uniform distribution from 0 to 1
obs = pm.Bernoulli('obs', p, value=data, observed=True) # each device can fail or not fail. i.e. the observations follow a Bernoulli distribution
model = pm.Model([obs, p])

mcmc = pm.MCMC(model)
mcmc.sample(40000, 10000, 1)

print np.percentile(mcmc.trace('p')[:], [2.5, 97.5])

> [3.3206054853225512e-05, 0.0037895137242935613]
  1. 我的模型正确吗?
  2. 我对 PyMC 的使用正确吗?
  3. 有人可以用另一种方法确认我的答案吗?也许通过使用泊松分布进行分析?

PS 我实际上对 MCMC 背后的理论一无所知,但是这本书的应用优先和数学第二的方法非常好。

1个回答

这似乎是一个很好的模型,在 PyMC 中正确实现。有两个贝叶斯统计事实,我们可以使用另一种方法来确认您的答案:

  1. Beta(1,1)等价于区间上的均匀分布;[0,1]
  2. 贝塔分布和二项分布是共轭的。

这意味着的后验分布也是 beta 分布,并且(如果我的参数化正确)您可以将此分析得出的分布中的百分位数与您通过 MCMC 找到的百分位数进行比较:ppposteriorBeta(1,1001)

> p_posterior = np.random.beta(a=1, b=1001, size=1000000)
> print np.percentile(p_posterior, [2.5, 97.5])
[2.5350975458273468e-05, 0.003681783314872197]

这是一个收集这一切的笔记本

顺便说一句,我不确定持卡统计学家是否会将其称为置信区间。这个问题有很多微妙之处,但主要的实际反对意见是您没有指定如何选择 1000 台设备。例如,如果您是一个非常重要的购买者,并且您在订购一百万个之前测试了这千个,制造商可能会竭尽全力确保您在这批中获得一千个!