2016-11-29 77 views
3

是否可以增量更新pyMC3中的模型?目前我无法找到关于此的信息。所有文档始终与先前已知的数据一起工作。增量模型更新pyMC3

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

谢谢:)

+0

AFAIK,这在PyMC3中没有实现。尽管如此,你可以这么做_manually_,只是使用一些数据和事先使用PyMC3来更新来计算后验,然后使用后验。你可能想问这个问题[这里](https://gitter.im/pymc-devs/pymc) – aloctavodia

+0

不,主要的限制是每次更新之后,你必须在合并之前将你的后辈转换为先验下一批数据。 –

+0

澄清: 我想建立一个模型,预测何时发生某些事件。每当发生实际事件时,我想更新我的信念。我可以在pymc3中做到这一点吗?据我了解,图书馆大多支持MCMC,因此并不真正适用于简单的贝叶斯更新,还是它?我基本上试图使用库,因为我可以建立复杂的模型,例如我的多个事件共享某些知识。 – Christian

回答

3

继@ ChrisFonnesbeck的意见,我写了增量更新之前,一个小教程笔记本。它可以在这里找到:

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

基本上,你需要用你的后路样品中,从他们的计算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)) 

然后你之前你的模型参数(比如alpha)通过调用from_posterior功能与参数名称,并从以前的迭代后的跟踪样本定义:

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