我试图通过复制给定here的高斯混合示例来模拟指数的混合。代码如下。我知道这里的推理有一些时髦的方面,但我的问题更多是关于如何在这样的模型中调试计算。
这个想法是它是三个指数的混合,其中的比例参数取自分配给scales
的Gamma。但是,所有观察结果都会在ElemwiseCategoricalStep
期间分配给第0个指数。通过查看initial_assignments
,您可以看到对指数分量的观测值的分配最初是多样的,并且您可以看到所有观测值都是根据set(tr['exp'].flatten())
的事实分配给所有相互作用的第0个分量。仅包含0。
我认为这是因为p
中array([logp(v * self.sh) for v in self.values])
中ElemwiseCategoricalStep.astep
分配给logp(v * self.sh)
的所有值均为负无穷大。我想知道为什么会这样以及如何纠正它,但更重要的是,我想知道有哪些工具可用于调试此类事情。我有什么方法可以逐步计算outputs = self.fn()
以查看结果是如何确定的?如果我尝试使用pdb来做这件事,我想我在theano.compile.function_module.Function.__call__
的{{1}}遇到了阻碍,我想我无法介入,因为它是一个原生函数。
即使知道如何计算给定模型参数集的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())
答案 0 :(得分:2)
很好的问题。您可以做的一件事是查看每个组件的pdf。
模型和每个变量应该同时具有.logp和.elemwise_logp属性,它们返回一个可以获取点或参数值的函数。
因此,您可以说print scales.logp(start)
或print model.logp(start)
或print scales.dlogp()(start)
。
现在,我认为你不得不指定所有参数值(即使是那些不影响特定变量结果的参数值)。
Model,FreeRV和ObservedRV都继承自Factor,它提供此功能并具有一些其他方法。你可能想要非fast
版本,因为它们在他们接受的各种参数中更宽容。
这有帮助吗?如果您对可能有助于调试的事情有其他想法,请告诉我。这是我们知道pymc3和theano需要一些工作的一个领域。