使用 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 进行增量模型更新的主要内容,如果未能解决你的问题,请参考以下文章