2

我正在尝试使用 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 的对数似然)?

4

1 回答 1

3

我对此进行了快速尝试。然而,这种方法需要进行相当大的改变,因为它通常更方便地对模型进行矢量化。这也揭示了我修复的一个错误(https://github.com/pymc-devs/pymc3/commit/c784c478aa035b5113e175145df8751b0dea0df3),因此您需要从当前主服务器进行更新才能使其正常工作。

这是完整的注意事项: https ://gist.github.com/anonymous/c1ada3388a40ae767a8d

它似乎还没有完全奏效,因为结果并不相同,但这是朝着正确方向迈出的一步。

于 2015-08-27T12:44:12.417 回答