2014-12-18 2 views
4

PyMC3에서 어떻게 사용자 정의 가능성을 정의 할 수 있습니까? PyMC2에서는 @pymc.potential을 사용할 수 있습니다. 나는 PyMC3에서 pymc.Potential을 사용하려고 시도했지만, 부울 연산이 매개 변수에 적용될 수없는 것으로 보인다. (내가 할 때 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 {LT, 제작, EQ, NEQ,한다 수 없습니다. , 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)) 

당신은 있지만 쉽게 Stochastics를 들어, @theano.compile.ops.as_op 장식을 사용하여 deterministics 임의의 비 Theano을 만들 수 있습니다.

+0

그리고 클래스에 속해 있기 때문에 서명에 'self'가있는 결정 론적 함수를 정의하는 방법은 무엇입니까? 제발 저의 관련 게시물을보십시오 –

+0

결정된 함수에 대해 아무 것도하지 않아도됩니다. 샘플링 된 값을 트레이스에 보관하고 싶지 않은 경우에는 'Determinstic' 호출로 래핑 할 수 있습니다. 문서를 참조하십시오. –

+0

불행히도 이것은 간단하지 않고 doc에서 정보를 찾지 못했습니다 ... '건설 중'이라고합시다. –