多次迭代的 Beta 二项式贝叶斯更新

机器算法验证 贝叶斯 β-二项分布
2022-04-04 18:08:02

我正在为我正在编写的一段代码使用 beta 二项式更新模型。该软件是实时更新的——意味着不断收集数据,在收集到 N 个数据点后,使用 N 个数据点更新贝叶斯模型。

在这个逻辑下,我将后验输出用作下一次迭代的先验。我的问题是,超过数十亿/万亿/也许更多的迭代,贝叶斯 beta 参数(alpha 和 beta)会变得非常大。我担心最终参数会变得如此之大,以至于它们会导致内存中的整数溢出。

所以我的问题是双重的 -

  1. 担心这个整数溢出是否合理。我明白那个232是一个非常大的数字,但我正在为每年 365 天、每天 24 天、每天 7 天运行的互联网服务构建这个软件,我不希望它崩溃。例如,如果我每天用 1,000,000 个数据点更新它,那么该模型在整数溢出之前只能持续约 4000 天。

  2. 是否可以将 x 和 y 非常大的 Beta(x,y) rv 转换为 x* 和 y* 相对较小的 Beta(x*,y*) rv?转换后的 Beta 不必精确,只需相似即可。

4个回答

1)你可以缩小它,所以α,βα/N,β/N. 这确实可以让你继续。然而,这样做的目的是使旧数据的权重更轻(如果N是两个,它将承载一半的重量)。如果您更愿意信任较新的数据,这甚至可能是一项功能。

例如比较α=β=20α=β=10 在这里除以时你在做什么N将分布的方差乘以N(几乎!)同时不影响预期值。

2)你可以停在那里。拥有 100 万个数据点,您的分布基本上就是一个点。如果你的模型有问题,尽管有 1000000 个数据点,你不需要更多的数据,你需要一个更好的模型。

简而言之,溢出不应该是二项式 beta 设置的问题,因为早在你达到溢出之前,你就会有非常小的置信区间。

如果您继续以您描述的方式更新您的先前数据,您是否假设生成数据的过程是静止的?

如果问题的答案是肯定的,那么您需要做的就是随机抽取数据样本来创建似然函数,然后生成后验。这样你就不用担心溢出了。

另一方面,虽然我不知道您正在调查的过程是什么,但一个过程似乎几乎不可能在任何长时间内保持静止。事实上,您可以通过监控 alpha 和 beta 参数随时间的独立估计来检查您的数据生成过程是否在连续变化。最低限度,您可以制作两个参数的控制图;或者更好的是,可能有一种简单的方法来实现似然比来检查平稳性。

如果alphabeta非常大,则您的先验分布必须已经收敛到一个点,并且您可以使用MAP近似值而不是后验分布。

话虽如此,缩小alphabeta缩小将保持平均值并使您远离转换(如果这是您正在寻找的)。

见python代码:

from conjugate_prior import BetaBinomial
heads = 95
tails = 105
prior_model = BetaBinomial() # Uninformative prior
updated_model = prior_model.update(heads, tails)
credible_interval = updated_model.posterior(0.45, 0.55)
print ("There's {p:.2f}% chance that the coin is fair".format(p=credible_interval*100))
predictive = updated_model.predict(50, 50)
print ("The chance of flipping 50 Heads and 50 Tails in 100 trials is {p:.2f}%".format(p=predictive*100))
scaled_down_model = BetaBinomial(BetaBinomial.mean()) # preserve mean, new model

我发现对此有用的方法是将 a 和 b 参数除以每次迭代时 y 轴的最大值。从而保持比例不变。