Как улучшить подгонку модели Пуассона в PyMC3?

У меня есть некоторые данные, которые выглядят так:

мои данные

Я хочу попытаться смоделировать эти данные, используя модель смеси Пуассона с 2 компонентами. Поскольку я новичок в PyMC3, я использовал ссылки здесь: Учебное пособие по PyMC3 GMM и здесь: PyMC3 Mixture API, чтобы попытаться сделать это. Мой код здесь:

with pm.Model() as model:
    lam1 = pm.Exponential('lam1', lam=1)
    lam2 = pm.Exponential('lam2', lam=1)
    pois1 = pm.Poisson.dist(mu=lam1)
    pois2 = pm.Poisson.dist(mu=lam2)
    w = pm.Dirichlet('w', a=np.array([1, 1]))
    like = pm.Mixture('like', w=w, comp_dists=[pois1, pois2], observed=data)
with model:
    trace = pm.sample(5000, n_init=10000, tune=10000, random_seed=SEED)[1000:]
with model:
    ppc_trace = pm.sample_ppc(trace, 5000, random_seed=SEED)
fig, ax = plt.subplots(figsize=(8, 6))
ax.hist(data, bins=30, normed=True,
        histtype='step', lw=2,
        label='Observed data')
ax.hist(ppc_trace['like'], bins=30, normed=True,
        histtype='step', lw=2,
        label='Posterior predictive distribution')
ax.legend(loc=1)
plt.show()

Но результат таков: плохой результат

Как мне улучшить посадку? Я пытался возиться с лямбдами, но безрезультатно.

0 ответов

Похоже, вы строите апостериорные параметры. Не путайте это с распределением случайных выборок на основе модели. Тем не менее, должно быть ясно, что оранжевая линия не является "подгонкой" синей, а скорее указывает, где находятся параметры ваших компонентов. Я не знаком с pymc, но также должен быть способ сделать выборку из модели вместо выборки модели. Одним из альтернативных вариантов будет считывание максимумов апостериорного значения (решение MAP) и использование для этого выборки функций numpy.random.

Другие вопросы по тегам