Я пытаюсь смоделировать простой пример вероятностного программирования, используя pymc 2. Я играл с другими языками, такими как церковный и англиканский, и могу без труда смоделировать эту проблему. Однако я не могу понять это в Python.
Вот код на англиканском, я думаю, это довольно очевидно:
[assume a (- (poisson 100) 100)]
[assume b (- (poisson 100) 100)]
[observe (normal (+ a b) .00001) 7]
[predict (list a b)]
Используя сэмплер Metropolis-Hastings, я получаю:
1 (10 1)
2 (10 8)
9977 (7 0)
20 (7 1)
С Particle Gibbs я получаю:
669 (-1 8)
71 (-10 17)
66 (-11 18)
208 (-12 19)
19 (-13 20)
84 (-14 21)
72 (-15 22)
441 (-2 9)
...and so on...
Я пытаюсь смоделировать это в pymc так:
def make_model():
a = (pymc.Poisson("a", 100) - 100)
b = (pymc.Poisson("b", 100) - 100)
precision = pymc.Uniform('precision', lower=.0001, upper=1.0)
@pymc.deterministic
def mu(a=a, b=b):
return a+b
y = pymc.Normal("y", mu=mu, tau=precision, observed=True, value=7)
return pymc.Model(locals())
def run_mcmc(model):
mcmc = pymc.MCMC(model)
mcmc.sample(5000, burn=1000, thin=2)
return mcmc
result = run_mcmc(make_model())
pymc.Matplot.plot(result)
Я получаю трассировки, где a и b составляют около 100. Однако, если я запускаю (pymc.Poisson("a", 100) - 100).value
, я получаю числа ближе к 0.
Я что-то упустил здесь? Я в восторге от возможностей, но в данный момент очень сбит с толку! Спасибо за любую помощь!
9977 (7 0)
означает, что a=7, b=0 появлялись 9977 раз из 10000 образцов. - person stratospark   schedule 11.02.2015