2014-02-19 2 views
1

필자가 작성한 모델의 한 단계에서 수량의 오차 함수를 계산해야합니다. 난 할 노력하고있어 다음과 같습니다 : erf이 배열에서 작동하지 않기 때문에PyMC에서 변수에 사용자 정의 함수를 적용하는 방법은 무엇입니까?

from math import erf 
import numpy as np 
import pymc as pm 

sig = pm.Exponential('sig', beta=0.1, size=10) 
x = erf(sig ** 2) 

이 실패합니다.

@pm.deterministic 
def x(sig=sig): 
    return [erf(s) for s in sig] 

을하지만 성공, 나는 그것이와 결과를 얻을 수 알고 : 나는 시도

np_erf = np.vectorize(erf) 
x = np_erf((sig ** 2).value) 

을하지만이 pm.Deterministic를 생성하지 않기 때문에 이것은 올바른 방법은 아닌 것 같아 단지 np.array 일뿐입니다. 대신 어떻게 할 수 있습니까?


편집 (PyMC 버전 2.3) : 위의 예는 명확성을 위해 단순화하고, 여기에 관련된 구절이 실제 코드에서 보면 무엇입니다. 이상적으로, 나는 이것을 원합니다 :

mu = pm.LinearCombination('mu', [...], [...]) 
sig2 = pm.exp(mu) ** 2 
f = 1/(pm.sqrt(np.pi * sig2/2.0) * erf(W/sig2)) 

TypeError: only length-1 arrays can be converted to Python scalars과 함께 실패한 경우. np.vectorize 라우트

np_erf = np.vectorize(erf) 
f = 1/(pm.sqrt(np.pi * sig2/2.0) * np_erf(W/sig2)) 

같은 오류 메시지가 표시되면서 충돌합니다. 목록의 이해는

@pm.deterministic 
def f(sig2=sig2): 
    return [1/(pm.sqrt(np.pi * s/2.0) * erf(W/s)) for s in sig2] 

같은 작동하지만 리드 나중에 코드에서 오류이 자리에서 :

@pm.observed(plot=True) 
def y(value=df['dist'], sig2=sig2, f=f): 
    return (np.log(np.exp(-(value ** 2)/2.0/sig2) * f)).sum() 

및 오류가 AttributeError: log입니다.

숫자 근사값을 사용하여 오류 함수를 계산 했으므로 일반 설정이 올바른 것입니다. erf 함수를 직접 사용하는 것이 더 좋고 명확 할 것입니다.

답변

1

해결책을 찾았습니다. pymc.deterministic 데코레이터를 사용하여 변수를 만들면 함수에 전달 된 매개 변수는 pymc.Distribution이 아니라 numpy.array이된다는 것을 알지 못합니다. 그리고 이것은 함수 numpy.vectorize을 허용하고 그것을 변수에 적용합니다. 그래서 그 대신

sig = pm.Exponential('sig', beta=0.1, size=10) 
x = erf(sig ** 2) 

의 당신은

sig = pm.Exponential('sig', beta=0.1, size=10) 
np_erf = np_vectorize(erf) 

@pm.deterministic 
def x(sig=sig): 
    return np_erf(sig ** 2) 

를 사용해야하고 그것을 작동합니다.

+0

아하! 다행 이네. 전자는 몇 가지 간단한 기능으로 작동하지만 전부는 아닙니다. –

0

"성공하지 못함"이란 정확히 무엇을 의미합니까? 오류가 무엇입니까?

나는 당신이 목록의 이해력에 당신의 sigmas를 정하지 않았 음을 알아. 그게 문제 야?

+0

크리스, 답장을 보내 주셔서 감사합니다. 나는 명확성을 위해 질문에서 예제를 줄였으며, 실제 코드도 추가했다. 다시 한번보세요. – elpres

+0

내가 실행할 수있는 몇 가지 테스트 데이터로 코드의 요지를 작성할 수 있습니까? 파이썬 스크립트 나 IPython 노트북 중 하나 일 수 있습니다. –

+0

예, 코드 [여기]를 입력합니다 (https : //gist.github.co.kr/elpres/27763fa1b47a40536400). – elpres

관련 문제