我遇到了一个常见问题,我想知道是否有人可以提供帮助。我经常想在两种模式下使用 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])
可以简单地通过 theano 计算图运行新数据的函数。
我想我的部分问题与 pymc3 如何实现 theano 计算图有关。我注意到该函数model.Y_sim.eval
似乎与我想要的相似,但它需要Y_sim
作为输入并且似乎只是返回你给它的任何东西。
我想这个过程非常普遍,但我似乎找不到任何方法来做到这一点。任何帮助是极大的赞赏。(另请注意,我在 pymc2 中有一个技巧可以做到这一点;由于 theano,在 pymc3 中更难。)