从pymc3中的推断参数生成预测

2024-05-17 06:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个常见的问题,我在想是否有人能帮忙。我通常希望在两种模式下使用pymc3:训练(即实际运行参数推断)和评估(即使用推断参数生成预测)。

一般来说,我喜欢后验预测,而不仅仅是点估计(这是贝叶斯框架的一部分好处,不是吗?)。当您的训练数据是固定的,这通常是通过添加一个类似形式的模拟变量到观察到的变量来完成的。例如

from pymc3 import *

with basic_model:

    # Priors for unknown model parameters
    alpha = Normal('alpha', mu=0, sd=10)
    beta = Normal('beta', mu=0, sd=10, shape=2)
    sigma = HalfNormal('sigma', sd=1)

    # Expected value of outcome
    mu = alpha + beta[0]*X1 + beta[1]*X2

    # Likelihood (sampling distribution) of observations
    Y_obs = Normal('Y_obs', mu=mu, sd=sigma, observed=Y)
    Y_sim = Normal('Y_sim', mu=mu, sd=sigma, shape=len(X1))

    start = find_MAP()
    step = NUTS(scaling=start)
    trace = sample(2000, step, start=start)

但是如果我的数据改变了呢?假设我想基于新的数据生成预测,但不需要再次进行推理。理想情况下,我会有一个像predict_posterior(X1_new, X2_new, 'Y_sim', trace=trace)甚至predict_point(X1_new, X2_new, 'Y_sim', vals=trace[-1])这样的函数,它只需通过ano计算图运行新数据。

我想我的问题的一部分与pymc3如何实现无计算图有关。我注意到函数model.Y_sim.eval似乎与我想要的类似,但它需要Y_sim作为输入,并且似乎只是返回您所给的任何内容。

我想这个过程是非常普遍的,但我似乎找不到任何方法。任何帮助都非常感谢。(还要注意,我在pymc2中有一个技巧可以做到这一点;在pymc3中因为theano而更难做到。)


Tags: 数据alphanewmodeltracesimsdstart