2017-02-13 6 views
2

어떻게 결정 론적 벡터 연산을 PYMC3에서 구현할 수 있습니까? 예 : 모델 :PYMC3에서 결정적인 벡터 연산을 추가하는 방법은 무엇입니까?

M ~ Unif(-5, 5) 
S ~ Unif(0, |1/M|) 
data ~ Normal(M, S) 

M은 가우스 관측 값의 평균이고 S는 표준 편차입니다. 표준 편차는 [0, | 1/M |] (M이 음수 일 때 필요한 절대 값)에 균일하게 분포한다고 가정합니다.

이 코드 :

File "/Users/mvd/anaconda/lib/python2.7/site-packages/pymc3/distributions/distribution.py", line 67, in get_test_val 
    str(defaults) + " pass testval argument or adjust so value is finite.") 
AttributeError: <pymc3.distributions.continuous.Uniform object at 0x10d1e1f10> has no finite default value to use, checked: ['median', 'mean', 'mode'] pass testval argument or adjust so value is finite. 

내가 벡터에이 작업을 달성하기 위해 theano를 사용할 필요가 수행

import pymc3 as pm 
import numpy as np 
size = 20 
with pm.Model() as model: 
    # M ~ Unif(-5, 5) 
    M = pm.Uniform("M", -5., 5., shape=size) 
    # S ~ Unif(0, |1/M|) 
    # how to divide by vector and take abs val? 
    S = pm.Uniform("S", np.zeros(size), abs(1./M), shape=size) 
    data = pm.Normal("data", M, sd=S, shape=size) 

는 오류가?

답변

1

모델의 문제가있는 부분은 1/M입니다. 이것은 M이 0에 접근 할 때 무한대로 이동하기 때문입니다. 실제로 예제에서 M에 대한 첫 번째 제안 된 값은 0 (상한 및 하한 경계의 평균)이므로 "제한된 값 없음"오류입니다 (오류 변수 S에서옵니다). 이 문제를 해결하는

한 가지 방법은 예를 들어, (0이지만,이 경우 아무것도) M에 적당한 testval 값을 전달하는 것이다

M = pm.Uniform("M", -5., 5., shape=size, testval=0.1) 

이제 M 0.1 (0 대신) 초기화한다

덧붙여서, 직감적으로 NUTS는이 모델에서 올바르게 샘플링하는 데 문제가있을 것이라고 생각합니다. 따라서 메트로폴리스가 더 나은 선택이 될 수 있다고 생각하지만 다른 샘플러로 자유롭게 실험 해보십시오.

+0

감사합니다. 또한 : PYMC3에서''abs (1./M)''처럼 무작위 변수의 결정 론적 표현을 언제 사용할 수 있습니까? 왜''pm.Uniform ("S", np.zeros (size), abs (1./M), shape = size)''단순히 작동합니까? – jll

+0

당신은 오신 것을 환영합니다. Theano는'/'와 같은 연산자를 이해하고 파이썬/NumPy와 theano 변수를 일반적으로 혼합 할 수 있습니다. 직접 할 수없는 일은 python/NumPy 변수를 기대하는 함수에 theano 변수를 사용하는 것입니다. 이 경우'as_op' 데코레이터를 사용할 수 있습니다. – aloctavodia