我正在尝试使用 pymc3 编写我自己的stochastic
和deterministic
变量,但 pymc2.3 的旧发布配方解释了如何我们可以参数化我们的变量不再有效。例如,我试图使用这种direct
方法,但它失败了:
def x_logp(value, x_l, x_h):
if ((value>x_h) or (value<x_l)):
return -np.inf
else:
return -np.log(x_h-x_l+1)
def x_rand(x_l,x_h):
return np.round((x_h-x_l)*np.random.random_sample())+x_l
Xpos=pm.stochastic(logp=x_logp,
doc="X position of halo center ",
observed=False,
trace=True,
name='Xpos',
random=x_rand,
value=25.32,
parents={'x_l':0,'x_h'=500},
dtype=float64,
plot=True,
verbose=0)
我收到以下错误消息:
ERROR: AttributeError: 'module' object has no attribute 'Stochastic' [unknown]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'Stochastic'
我想知道如何在pymc3
中定义自己的先验或可能性,例如,使用装饰器和可用的pymc
分布?
答案 0 :(得分:4)
基本上有两种方法可以添加自定义密度:
Theano表达式(可以使用基于渐变的采样器)
您可以使用DensityDist
,例如:
https://github.com/pymc-devs/pymc/blob/master/pymc/examples/custom_dists.py
Blackbox python函数(只有Metropolis或Slice等非渐变采样器)
Theano
有一个你可以使用的装饰器:
@theano.compile.ops.as_op(itypes=[t.lscalar, t.dscalar, t.dscalar],otypes=[t.dvector])
def rate(switchpoint,early_mean, late_mean):
''' Concatenate Poisson means '''
out = empty(years)
out[:switchpoint] = early_mean
out[switchpoint:] = late_mean
return out
确定性可以通过组合随机变量直接完成,或者,如果您希望它们显示在跟踪中,例如使用pm.Determinstic('sum', alpha + beta)
。