Начинающий PyMC: как на самом деле сделать выборку из подобранной модели

12

Я пробую очень простую модель: подгонка к нормальному, где я предполагаю, что знаю точность, и я просто хочу найти среднее. Код ниже, кажется, соответствует нормальному. Но после подгонки я хочу взять образец из модели, т.е. сгенерировать новые данные, которые похожи на мою dataпеременную. Я знаю, что могу использовать, trace("mean")чтобы получить образцы для средней переменной. Но как я могу получить новые образцы от самой модели?

Я посмотрел на документы, например, http://pymc-devs.github.io/pymc/database.html#accessing-sampled-data . Я также рассмотрел довольно много примеров, например, горные бедствия, и несколько из записных книжек по вероятностному программированию, и ни один из них не упоминает об этом. Я (более или менее начинающий MCMC) ожидал, что выборка из подобранной модели - это весь смысл! Что мне не хватает?

from pymc import *
data = np.array([-1, 0, 4, 0, 2, -2, 1, 0, 0, 2, 1, -3, -1, 0, 0, 1, 0, 1])
mean = Uniform("mean", -4, 4)
precision = 2.0**-2
obs = Normal("obs", mean, precision, value=data, observed=True)
model = Model( {"mean": mean, "obs": obs})
mcmc = MCMC(model)
mcmc.sample(10000, 1000, 1)
# I can get samples for the "mean" variable
mean_samples = mcmc.trace("mean")[:]
hist(mean_samples)
# but how can I do the equivalent of mcmc.trace("obs")?
jmmcd
источник
Именно этот вопрос у меня был! Интересно, упрощена ли прогнозная выборка в pymc3 ...
Владислав Довгальец

Ответы:

15

Вы ищете то, что называется прогнозным распределением . Включить это очень просто. Перед созданием Modelдобавьте дополнительную стохастическую переменную:

predictive = mc.Normal( "predictive", mean, precision )
model = Model( {"mean": mean, "obs": obs, "pred":predictive})

...

predictive_traces = mcmc.trace("predictive")[:]
hist( predictive_traces )

Искусственные данные из подобранной модели

Это создаст искусственные данные из подобранной модели. Спасибо за то, что привлекли мое внимание к этому упущению, я включу его в проект BMH.

Cam.Davidson.Pilon
источник
Как создать массив из n случайных величин, в которых n случайно? stackoverflow.com/questions/45283843/... ( К сожалению это слишком много ...)
селезень
4

Пришел сюда несколько лет спустя, когда искал то же самое с помощью PyMC3, поэтому я собираюсь оставить ответ, относящийся к новой версии: (из Posterior Predictive Checks ).

ppc = pm.sample_ppc(trace, samples=500, model=model, size=100)

Теперь PPC содержит 500 сгенерированных наборов данных (по 100 выборок в каждом), каждый из которых использует различные настройки параметров сзади.

Ян Кукацка
источник