ここで与えられた混合ガウスの例をコピーして、指数関数の混合をモデル化しようとしました。コードは以下です。ここでの推論にはいくつかのファンキーな側面があることは知っていますが、私の質問は、このようなモデルで計算をデバッグする方法についてです。
アイデアは、3 つの指数の混合であり、ガンマから取得されたスケール パラメータが に割り当てられているということscales
です。ただし、すべての観測値は、ElemwiseCategoricalStep
. を見ると、観測値の指数成分への割り当てが最初は多様であることがわかります。また、が 0 しか含まれていないinitial_assignments
ことから、すべての観測値がすべての相互関係でゼロ番目の成分に割り当てられていることがわかります。set(tr['exp'].flatten())
これは、p
in の式array([logp(v * self.sh) for v in self.values])
で代入されるすべての値ElemwiseCategoricalStep.astep
が負の無限大であるためだと思います。その理由と修正方法を知りたいのですが、さらに、この種のデバッグに使用できるツールを知りたいです。の計算をステップ実行してlogp(v * self.sh)
、結果がどのように決定されるかを確認する方法はありますか? pdbでやろうとすると、ネイティブ関数なので踏み込めないoutputs = self.fn()
inで詰まると思います。theano.compile.function_module.Function.__call__
与えられた一連のモデル パラメーターの pdf を計算する方法を知っていても、最初は役に立ちます。
import numpy as np
import pymc as pm
from pymc import Model, Gamma, Normal, Dirichlet, Exponential
from pymc import Categorical
from pymc import sample, Metropolis, ElemwiseCategoricalStep
durations = np.concatenate(
[np.random.exponential(1/lam, 10)
for lam in [1e-3,7e-5,2e-6]])
initial_assignments = np.random.randint(0, 3, len(durations))
print 'initial_assignments', initial_assignments
with Model() as model:
scales = Gamma('hp', 1, 1, shape=3)
props = Dirichlet('props', a=np.array([1., 1., 1.]), shape=3)
category = Categorical('exp', p=props, shape=len(durations))
points = Exponential('obs', lam=scales[category], observed=durations)
step1 = pm.Metropolis(vars=[props,scales])
step2 = ElemwiseCategoricalStep(var=category, values=[0,1,2])
start = {'exp': initial_assignments,
'hp': np.ones(3),
'props': np.ones(3),}
tr = sample(3000, step=[step1, step2], start=start)
print set(tr['exp'].flatten())