Початківець 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")?

Саме питання у мене було! Цікаво, чи спрощена вибірка спрощена у 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.


Як ви створюєте масив з 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 зразків у кожному), кожен з яких використовує інше налаштування параметрів із заднього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.