Iniciante no PyMC: como realmente obter amostras do modelo ajustado

12

Estou tentando um modelo muito simples: encaixando um Normal onde suponho que conheço a precisão e só quero encontrar a média. O código abaixo parece se encaixar no Normal corretamente. Porém, após o ajuste, quero fazer uma amostra do modelo, ou seja, gerar novos dados semelhantes à minha datavariável. Eu sei que posso usar trace("mean")para obter amostras para a variável média. Mas como posso obter novas amostras do próprio modelo?

Analisei documentos, por exemplo, http://pymc-devs.github.io/pymc/database.html#accessing-sampled-data . Também observei alguns exemplos, por exemplo, os desastres de mineração e vários dos cadernos de programação probabilística, e nenhum menciona isso. Eu (mais ou menos um iniciante do MCMC) esperava que a amostragem do modelo ajustado fosse o ponto principal! o que estou perdendo?

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
fonte
Exatamente a pergunta que eu tinha! Querendo saber se a amostragem preditivo é simplificada em pymc3 ...
Vladislavs Dovgalecs

Respostas:

15

Você está procurando o que é chamado de distribuição preditiva . Incluir isso é muito simples. Antes de criar o Model, adicione a variável estocástica adicional:

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

...

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

Dados artificiais do modelo ajustado

Isso irá gerar dados artificiais a partir do modelo ajustado. Obrigado por chamar minha atenção para essa supervisão, vou incluí-la no projeto BMH.

Cam.Davidson.Pilon
fonte
Como você cria uma matriz de n variáveis ​​aleatórias em que n é aleatório? stackoverflow.com/questions/45283843/... (Desculpe é que isto é demais ...)
Drake
4

Chegou aqui vários anos depois, ao procurar a mesma coisa usando o PyMC3, por isso vou deixar uma resposta relevante para a nova versão: (das verificações preditivas posteriores ).

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

Agora, o ppc contém 500 conjuntos de dados gerados (contendo 100 amostras cada), cada um usando uma configuração de parâmetro diferente da posterior.

Jan Kukacka
fonte