我遇到了一个常见问题,想知道是否有人可以帮忙。我经常想以两种模式使用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中进行此操作的hack;由于Theano,pymc3中更难)