2014-08-27 7 views
1

Я пытаюсь использовать писать свои собственные stochastic и deterministic переменные с pymc3, но старый опубликовал рецепт pymc2.3 объяснил, как мы можем параметризуем наши переменные больше не работает. Например, я пытался использовать этот direct подход и не удалось:Определение стохастические и детерминированные переменные с pymc3

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. Theano выражения (можно использовать пробоотборники на основе градиента)

    Вы можете использовать DensityDist для этого, например: https://github.com/pymc-devs/pymc/blob/master/pymc/examples/custom_dists.py

  2. Функции python Blackbox (только неградиентные пробоотборники, такие как 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

Deterministics может производиться либо непосредственно путем объединения случайных величин, или, если вы хотите, чтобы они отображаются в трассе, используя, например, pm.Determinstic('sum', alpha + beta).

+0

Hi Thomas, я намерен использовать подход декоратора Theano (см. Также https://github.com/pymc-devs/pymc/issues/507), чтобы позволить мне использовать emcee sampler, интегрированный с PyMC3. У меня пока нет конкретных вопросов, но можете ли вы намекнуть, что это правильный путь? Cheers, Jon – jonsedar

+0

Да, emcee не требует градиента, поэтому декоратор-украшатель может быть наименьшим сопротивлением. Если вы получаете emcee для работы с pymc3, определенно сообщите нам, так как было бы неплохо совместить эти два. – twiecki

+1

Ну, у меня есть какой-то успех - просто следуйте шаблону дизайна в [вашем блоге] (http://nbviewer.ipython.org/github/twiecki/WhileMyMCMCGentlySamples/blob/master/content/downloads/notebooks/emcee.ipynb) и создал пользовательскую функцию lnprob для обновления модели PyMC3 и вывода logp обратно в пробоотборник emcee. Протестированы близкие результаты к PyMC3 и OLS и ~ 100 раз быстрее, чем NUTS на моем наборе данных 6500 x 11! Я подозреваю, что идем наоборот, и использовать emcee sampler из вызова PyMC3 будет еще быстрее, но я вникнул в код Theano, PyMC3 и emcee, и это довольно тяжело. – jonsedar