2014-12-18 6 views
4

Как определить пользовательскую вероятность в PyMC3? В PyMC2 я мог бы использовать @pymc.potential. Я попытался использовать pymc.Potential в PyMC3, однако, кажется, что логические операции не могут быть применены к параметрам (я получаю ошибку, например this, когда я это делаю). Например, следующий код не работает:Пользовательская вероятность в 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 {л, ль, эк, NEQ, gØ. , GE}). Нужно ли использовать функцию правдоподобия, аналогичную PyMC2?

ответ

9

Вам необходимо использовать функцию 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 deterministics с использованием @theano.compile.ops.as_op декоратора, но не так легко для стохастики.

+0

и как определить детерминированную функцию, которая имеет «я» в сигнатуре, потому что она принадлежит классу? пожалуйста, посмотрите мой связанный пост –

+0

Вам не нужно ничего делать для детерминированной функции, если вы не хотите сохранять свои выборочные значения в трассировке, и в этом случае вы можете обернуть ее в вызов «Определить». См. Документы. –

+0

, к сожалению, это не так просто, и я не нашел информацию в документе ... скажем, это «в строительстве». –