Я пытаюсь сравнить две модели (пример из блога Джейка Вандерпласа) с использованием 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)?