Я сталкиваюсь с распространенной проблемой, мне интересно, может ли кто-нибудь помочь. Я часто хотел бы использовать 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; в pymc3 это сложнее из-за theano.)