PyMC débutant: comment échantillonner réellement à partir du modèle ajusté

12

J'essaie un modèle très simple: ajuster un Normal où je suppose que je connais la précision, et je veux juste trouver la moyenne. Le code ci-dessous semble correspondre correctement à la normale. Mais après l'ajustement, je veux échantillonner à partir du modèle, c'est-à-dire générer de nouvelles données similaires à ma datavariable. Je sais que je peux utiliser trace("mean")pour obtenir des échantillons pour la variable moyenne. Mais comment puis-je obtenir de nouveaux échantillons du modèle lui-même?

J'ai regardé des documents, par exemple http://pymc-devs.github.io/pymc/database.html#accessing-sampled-data . J'ai également regardé pas mal d'exemples, par exemple les catastrophes minières, et plusieurs des cahiers de programmation probabiliste, et aucun ne le mentionne. Je (plus ou moins un débutant MCMC) m'attendais à ce que l'échantillonnage à partir du modèle ajusté soit tout l'intérêt! Qu'est-ce que je rate?

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
la source
Exactement la question que j'avais! Vous vous demandez si l'échantillonnage prédictif est simplifié dans pymc3 ...
Vladislavs Dovgalecs

Réponses:

15

Vous regardez ce qu'on appelle la distribution prédictive . L'inclure est très simple. Avant de créer le Model, ajoutez la variable stochastique supplémentaire:

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

...

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

Données artificielles du modèle ajusté

Cela générera des données artificielles à partir du modèle ajusté. Merci d'avoir porté cette omission à mon attention, je vais l'inclure dans le projet BMH.

Cam.Davidson.Pilon
la source
Comment créez-vous un tableau de n variables aléatoires dans lesquelles n est aléatoire? stackoverflow.com/questions/45283843/… (Désolé, c'est trop ...)
drake
4

J'ai atterri ici plusieurs années plus tard lorsque je cherchais la même chose en utilisant PyMC3, donc je vais laisser une réponse pertinente pour la nouvelle version: (de Postior Predictive Checks ).

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

Maintenant, ppc contient 500 ensembles de données générés (contenant 100 échantillons chacun), chacun utilisant un réglage de paramètre différent de celui postérieur.

Jan Kukacka
la source