1

我正在尝试使用 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分布的情况下定义自己的先验或可能性?

4

1 回答 1

4

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

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

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

  2. 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

取自这个例子:https ://github.com/pymc-devs/pymc/blob/master/pymc/examples/disaster_model_arbitrary_determinisitc.py

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

于 2014-09-15T10:37:49.377 回答