用pymc3定义随机和确定性变量

时间:2014-08-27 16:19:47

标签: python pymc pymc3

我正在尝试使用 pymc3 编写我自己的stochasticdeterministic变量,但 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分布?

1 个答案:

答案 0 :(得分:4)

基本上有两种方法可以添加自定义密度:

  1. Theano表达式(可以使用基于渐变的采样器)

    您可以使用DensityDist,例如: https://github.com/pymc-devs/pymc/blob/master/pymc/examples/custom_dists.py

  2. Blackbox python函数(只有Metropolis或Slice等非渐变采样器)

    Theano有一个你可以使用的装饰器:

  3. 
    @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
    

    取自此示例:https://github.com/pymc-devs/pymc/blob/master/pymc/examples/disaster_model_arbitrary_determinisitc.py

    确定性可以通过组合随机变量直接完成,或者,如果您希望它们显示在跟踪中,例如使用pm.Determinstic('sum', alpha + beta)