使用 PyMC3 进行增量模型更新

Posted

技术标签:

【中文标题】使用 PyMC3 进行增量模型更新【英文标题】:Incremental model update with PyMC3 【发布时间】:2017-04-13 17:48:12 【问题描述】:

是否可以在 pyMC3 中增量更新模型。我目前找不到这方面的信息。所有文档始终使用先验已知数据。

但在我的理解中,贝叶斯模型也意味着能够更新信念。这在pyMC3中可能吗?我在哪里可以找到这方面的信息?

谢谢你:)

【问题讨论】:

AFAIK,这在 PyMC3 中没有实现。不过,您可以手动执行此操作,只需使用一些数据和先验,使用 PyMC3 更新以计算后验,然后使用后验作为先验。你可能想问这个问题here 不,主要限制是每次更新后,您必须在合并下一批数据之前将后验转换为先验。 澄清一下:我想建立一个模型来预测某些事件何时发生。每当发生实际事件时,我都想更新我的信念。我可以在 pymc3 中执行此操作吗?据我了解,该库主要支持 MCMC,因此不能真正使用简单的贝叶斯更新,或者是吗?我基本上是在尝试使用该库,因为我可以构建复杂的模型,例如,我的多个事件共享某些知识。 @ChrisFonnesbeck 通过“将后验转换为先验”,您的意思是使用诸如核密度估计之类的东西并用 Continuous 子类包装它吗? 在不丢失信息的情况下进行转换并不总是那么容易,除非它是一个简单的共轭问题。如果能够直接使用直方图或 kde 作为概率分布,那就太好了;我猜那将是最简单的。请注意,kde 将不可避免地意味着转换中的信息丢失。 【参考方案1】:

按照@ChrisFonnesbeck 的建议,我写了一个关于增量预先更新的小型教程笔记本。可以在这里找到:

https://github.com/pymc-devs/pymc3/blob/master/docs/source/notebooks/updating_priors.ipynb

基本上,您需要将后验样本包装在一个自定义的 Continuous 类中,该类会根据它们计算 KDE。下面的代码就是这样做的:

def from_posterior(param, samples):

    class FromPosterior(Continuous):

        def __init__(self, *args, **kwargs):
            self.logp = logp
            super(FromPosterior, self).__init__(*args, **kwargs)

    smin, smax = np.min(samples), np.max(samples)
    x = np.linspace(smin, smax, 100)
    y = stats.gaussian_kde(samples)(x)
    y0 = np.min(y) / 10 # what was never sampled should have a small probability but not 0

    @as_op(itypes=[tt.dscalar], otypes=[tt.dscalar])
    def logp(value):
        # Interpolates from observed values
        return np.array(np.log(np.interp(value, x, y, left=y0, right=y0)))

    return FromPosterior(param, testval=np.median(samples))

然后,您通过调用 from_posterior 函数来定义模型参数的先验(比如 alpha),并使用参数名称和上一次迭代后验的跟踪样本:

alpha = from_posterior('alpha', trace['alpha'])

【讨论】:

答案中的笔记本现在住在这里:github.com/pymc-devs/pymc-examples/blob/main/examples/…

以上是关于使用 PyMC3 进行增量模型更新的主要内容,如果未能解决你的问题,请参考以下文章

Python用PyMC3实现贝叶斯线性回归模型

pymc3:具有多个观察变量的层次模型

在 pymc3 中创建三级逻辑回归模型

python 空间疾病传播模型,翻译为PyMC3

python 空间疾病传播模型,翻译为PyMC3

python 空间疾病传播模型,翻译为PyMC3