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 の対数尤度を計算します)?