Определение стохастических и детерминированных переменных с помощью pymc3

Я пытаюсь использовать собственные переменные stochastic и deterministic с pymc3, но старый опубликованный рецепт для 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?


person Dalek    schedule 27.08.2014    source источник


Ответы (1)


По сути, есть два способа добавить пользовательскую плотность:

  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

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

person twiecki    schedule 15.09.2014
comment
Привет, Томас, я собираюсь использовать подход декоратора Theano (см. также github.com/ pymc-devs/pymc/issues/507), чтобы я мог использовать сэмплер ведущего, интегрированный с PyMC3. У меня пока нет конкретных вопросов, но можете ли вы намекнуть, что это правильный путь? Привет, Джон - person jonsedar; 16.09.2014
comment
Да, ведущий не требует градиента, поэтому декоратор theano может быть путем наименьшего сопротивления. Если вы заставите ведущего работать с pymc3, обязательно сообщите нам, так как было бы неплохо объединить их. - person twiecki; 16.09.2014
comment
Ну, я добился некоторого успеха - просто следовал шаблону проектирования в ваш блог и создал пользовательскую функцию lnprob для обновления модели PyMC3 и вывода logp обратно в сэмплер ведущего. Протестированы близкие результаты к PyMC3 и OLS и примерно в 100 раз быстрее, чем NUTS на моем наборе данных 6500 x 11! Я подозреваю, что пойти наоборот и использовать сэмплер ведущего из вызова PyMC3 было бы еще быстрее, но я копался в коде Theano, PyMC3 и ведущего, и это довольно тяжело. - person jonsedar; 19.09.2014