2

PyMC3 を使用して 2 つのモデル ( Jake Vanderplas のブログのbest_theta()) を比較しようとしていますが、変更したコードを機能させることができません (関数とlogL()Jake のブログ投稿で説明されており、IPython ノートブック形式で入手できます):

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で説明されているように、変数は (PyMC2 とは異なり) 整数ではなく RV オブジェクトであるため、例外が発生します。ただし、私のコードでは、それを機能させるために の値が重要です。choice

私の質問は、 RV の値にアクセスする方法choice、またはより一般的にはカテゴリ確率変数を使用して階層モデルを設定する方法はありますか (つまり、カテゴリ RV の値を使用して別の RV の対数尤度を計算します)?

4

1 に答える 1

3

私はこれに素早く突き刺しました。ただし、モデルをベクトル化する方が便利な場合が多いため、アプローチをかなり変更する必要がありました。これにより、私が修正したバグ ( https://github.com/pymc-devs/pymc3/commit/c784c478aa035b5113e175145df8751b0dea0df3 ) も明らかになったため、これを機能させるには現在のマスターから更新する必要があります。

ここに完全なNBがあります: https://gist.github.com/anonymous/c1ada3388a40ae767a8d

結果は同じではないため、まだうまく機能していないようですが、正しい方向への一歩です.

于 2015-08-27T12:44:12.417 に答える