我正在尝试使用 PyMC3 比较两个模型(来自 Jake Vanderplas 博客的示例),但我无法让我修改后的代码正常工作(这些函数best_theta()
并logL()
在 Jake 的博客文章中进行了解释,该文章以IPython Notebook形式提供):
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 的对数似然)?