Пользовательская вероятность в pymc3

Как я могу определить пользовательскую вероятность в PyMC3? В PyMC2 я мог бы использовать @pymc.potential. Я пытался использовать pymc.Potential в PyMC3, однако кажется, что логические операции нельзя применять к параметрам (я получаю сообщение об ошибке типа это, когда я делаю это). Например, следующий код не работает:

from pymc import *

with Model() as model:
    x = Normal('x', 1, 1)

    def z(u):
        if u > 0: #comparisons like this are not supported
        # if theano.tensor.lt(0,u): this is how comparison should be done
            return u ** 2
        return -u**3

    x2 = Potential('x2', z(x))

    start = model.test_point
    h = find_hessian(start)
    step = Metropolis(model.vars, h)
    sample(100, step, start)

Я не могу изменить все сравнения внутри вероятности на синтаксис Theano (т.е. theano.tensor.{lt,le,eq,neq,gt,ge}). Можно ли в любом случае использовать определение функции правдоподобия, аналогичной PyMC2?


person Amir Dezfouli    schedule 18.12.2014    source источник


Ответы (1)


Вам нужно использовать функцию DensityDist, чтобы обернуть вашу вероятность журнала. Из примеров в комплекте с исходником:

with Model() as model:
    lam = Exponential('lam', 1)

    failure = np.array([0, 1])
    value = np.array([1, 0])

    def logp(failure, value):
        return sum(failure * log(lam) - lam * value)

    x = DensityDist('x', logp, observed=(failure, value))

Вы можете создавать произвольные не теано-детерминистические методы, используя декоратор @theano.compile.ops.as_op, но не так просто для стохастиков.

person Chris Fonnesbeck    schedule 31.12.2014
comment
и как определить детерминированную функцию, которая имеет «я» в подписи, потому что она принадлежит классу? пожалуйста, посмотрите мой связанный пост - person Stéphane; 15.02.2017
comment
Вам не нужно ничего делать для детерминированной функции, если только вы не хотите сохранять их выборочные значения в трассировке, и в этом случае вы можете обернуть ее вызовом Determinstic. См. документы. - person Chris Fonnesbeck; 16.02.2017
comment
к сожалению, это не так просто, и я не нашел информацию в документе... скажем, "в разработке". - person Stéphane; 17.02.2017
comment
Детерминированной может быть любая функция других стохастиков в модели. Если вы используете свой собственный класс (я предполагаю, что это потому, что это пользовательская функция вероятности), то он должен наследоваться от класса PyMC. - person Chris Fonnesbeck; 18.02.2017
comment
нет, извините, это все еще не работает... я все еще не могу использовать pymc3, и я застрял на pymc2. Должно быть, я упускаю что-то очевидное. Не могли бы вы взглянуть на stackoverflow.com/questions/42205123/? Мне нужно определить операцию theano, но мои попытки объединить theano/pymc3 неверны. - person Stéphane; 01.04.2017