Перенос смешанных моделей на pymc3

Я пытаюсь перенести модель гауссовой смеси, как определено в: Как смоделировать смесь 3 нормалей в PyMC? перейти к pymc3

Код

import numpy as np
from pymc import Model, Gamma, Normal, Dirichlet
from pymc import Multinomial
from pymc import sample, Metropolis

k = 3
ndata = 500

v = np.random.randint(0, k, ndata)
data = ((v == 0)*(50 + np.random.randn(ndata))
        + (v == 1)*(-50 + np.random.randn(ndata))
        + (v == 2)*np.random.randn(ndata))

model = Model()

with model:
    dd = Dirichlet('dd', k=k, a=1, shape=k)
    precs = Gamma('precs', alpha=0.1, beta=0.1, shape=k)
    means = Normal('means', 0, 0.001, shape=k)
    category = Multinomial('category',
                           n=1,
                           p=dd,
                           shape=ndata)

    points = Normal('obs',
                    means[category],
                    precs[category],
                    observed=data)
    tr = sample(3000, step=Metropolis())

Я получаю следующую ошибку кода:

AttributeError: <pymc.quickclass.Multinomial object at 0x4804210> has no default value to use, checked for: ['mode'] pass testval argument or provide one of these.

Что я делаю не так?


person zaxtax    schedule 15.12.2013    source источник


Ответы (1)


Это связано с тем, что в модели не были переданы начальные значения для переменных. Обычно это не проблема, потому что модель просто берет среднее/медиану/моду каждого распределения и использует их. Многочлен сложен, потому что среднее обычно дает значения за пределами поддержки (т. Е. Нецелые значения), а моду сложно вычислить.

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

person Chris Fonnesbeck    schedule 16.12.2013
comment
Когда я добавляю testval=1 к Multinomial, я получаю: ValueError: («Несоответствие входного размера. (input[0].shape[0] = 500, input[1].shape[0] = 3)», Elemwise {mul,no_inplace}(категория, ‹TensorType(float64, vector)›), [Elemwise{mul,no_inplace}.0]) - person zaxtax; 17.12.2013
comment
Я не думаю, что целое число является подходящим тестовым значением для многочлена (должен быть вектор размера k). В любом случае, это то, что нам нужно исправить. - person Chris Fonnesbeck; 18.12.2013