Нарисуйте категориальные векторы из pyMC3 с помощью дирихле до

Я хочу нарисовать категориальные векторы, где их априор является произведением распределений Дирихле. Категории фиксированы, и каждый элемент в категориальном векторе соответствует другому априору Дирихле. Вот категориальный вектор длины 33 с 4 категориями, настроенный с помощью априорной Дирихле.

import pymc3 as pm

with pm.Model() as model3:
    theta = pm.Dirichlet(name='theta',a=np.ones((33,4)), shape=(33,4))
    seq = [pm.Categorical(name='seq_{}'.format(str(i)), p=theta[i,:], shape=(1,)) for i in range(33)]
    step1 = pm.Metropolis(vars=[theta])
    step2 = [pm.CategoricalGibbsMetropolis(vars=[i]) for i in seq]
    trace = pm.sample(50, step=[step1] + [i for i in step2])

Однако этот подход громоздкий, так как мне нужно выполнить некоторую индексацию массива, чтобы получить категориальные векторы. Есть ли лучшие способы сделать это?


person skc    schedule 22.11.2019    source источник
comment
Это также может быть полезно опубликовать на сайте PyMC Discourse. В то время как некоторые разработчики (например, @colcarroll) часто делают SO, большинство из них следуют дискурсу.   -  person merv    schedule 23.11.2019


Ответы (1)


Вам не нужно указывать форму. Обратите внимание, что способ, которым вы его настроили, имеет 33 различных категориальных переменных; Я предполагаю, что это то, что вы намеревались. Вот более простой способ сделать это:

with pm.Model() as model: 
    theta = pm.Dirichlet(name='theta',a=np.ones(4)) 
    children = [pm.Categorical(f"seq_{i}", p=theta) for i in range(33)] 
person Elenchus    schedule 26.07.2020
comment
Я понимаю, что этот пост был сделан некоторое время назад, но этот вопрос был одним из ресурсов, которые я использовал, чтобы попытаться решить его; Я не мог найти много примеров для такого рода вещей - person Elenchus; 26.07.2020