Можно ли создать иерархическую модель в PyMC3 с использованием категориальных случайных величин?

Я пытаюсь сравнить две модели (пример из блога Джейка Вандерпласа) с использованием PyMC3, но я не могу заставить мой модифицированный код работать (функции best_theta() и logL() объясняются в блоге Джейка, который доступен по адресу IPython Notebook form):

degrees = [1, 2, 3]

# best_theta() finds the best set of parameters for a given model
thetas = [best_theta(d) for d in degrees]

n = len(degrees)
prob = np.array([ 1 for _ in degrees ])

# model specs
from pymc3 import Model, Dirichlet, Categorical, DensityDist

with Model() as bfactor:
    choices = Dirichlet('choices', prob, shape=prob.shape[0])

    choice = Categorical('choice', choices)

    indmodel = [0] * len(degrees)
    for i, d in enumerate(degrees):
        # logL() calculates the log-likelihood for a given model
        indmodel[i] = DensityDist('indmodel', lambda value: logL(thetas[i]))

    fullmodel = DensityDist('fullmodel', lambda value: indmodel[choice].logp(value))

Это вызывает исключение, поскольку переменная choice является объектом RV, а не целым числом (в отличие от PyMC2), как описано в этот вопрос. Однако в моем коде значение choice важно для его работы.

Мой вопрос: есть ли способ получить доступ к значению RV choice или, в более общем смысле, настроить иерархическую модель с использованием категориальных случайных переменных (т. е. использовать значение категориального RV для расчета логарифмической вероятности другого RV)?


person LmnICE    schedule 26.08.2015    source источник


Ответы (1)


Я сделал быстрый удар по этому поводу. Однако подход пришлось немного изменить, так как зачастую удобнее векторизовать модель. Это также выявило ошибку, которую я исправил (https://github.com/pymc-devs/pymc3/commit/c784c478aa035b5113e175145df8751b0dea0df3), поэтому вам нужно будет обновить текущий мастер, чтобы это работало.

Вот полный NB: https://gist.github.com/anonymous/c1ada3388a40ae767a8d

Похоже, это еще не совсем работает, поскольку результаты не идентичны, но это шаг в правильном направлении.

person twiecki    schedule 27.08.2015
comment
Эй, спасибо! Мне нравится ваше решение, спецификация модели понятнее моей. Как вы, наверное, заметили, я только начинаю работать с PyMC3. Итак, насколько я могу судить, вы можете ссылаться на объекты RV так же, как на их текущие значения на текущем шаге MCMC, но только в контексте другого RV. Другими словами, ваш фрагмент coeffs[choice, :(choice+1)] является законным, потому что coeffs сам по себе является (набором) RV, тогда как мой фрагмент indmodel[choice] является незаконным, потому что indmodel является обычным старым списком. Это правильно? - person LmnICE; 27.08.2015