Я сталкиваюсь с общей проблемой, о которой я спрашиваю, может ли кто-то помочь. Я часто хотел бы использовать 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])
, которая просто запускала бы новые данные с помощью графика вычислений anano.
Я полагаю, что часть моего вопроса связана с тем, как pymc3 реализует диаграмму вычисления anano. Я заметил, что функция model.Y_sim.eval
кажется похожей на то, что я хочу, но она требует Y_sim
в качестве ввода и, кажется, просто возвращает все, что вы ей даете.
Я предполагаю, что этот процесс чрезвычайно распространен, но я не могу найти способ сделать это. Любая помощь приветствуется. (Обратите внимание, что у меня есть взломать это в pymc2, это сложнее в pymc3 из-за theano.)