2014-12-30 4 views
0

PyMC를 가르치기 위해 간단한 회귀 회귀를 정의하려고합니다. 하지만 ZeroProbability 오류가 발생하고 이것이 왜 발생하는지 또는 피하는 방법을 정확히 이해하지 못합니다. 여기 PyMC를 이용한 물류 회귀 분석 : ZeroProbability 오류

내 코드입니다 :

import pymc 
import numpy as np 

x = np.array([85, 95, 70, 65, 70, 90, 75, 85, 80, 85]) 
y = np.array([1., 1., 0., 0., 0., 1., 1., 0., 0., 1.]) 

w0 = pymc.Normal('w0', 0, 0.000001) # uninformative prior (any real number) 
w1 = pymc.Normal('w1', 0, 0.000001) # uninformative prior (any real number) 

@pymc.deterministic 
def logistic(w0=w0, w1=w1, x=x): 
    return 1.0/(1. + np.exp(-(w0 + w1 * x))) 

observed = pymc.Bernoulli('observed', logistic, value=y, observed=True) 

그리고 여기에 추적 다시 오류 메시지입니다 : 그것은 inf을 반환 이후

Traceback (most recent call last): 
    File "/Library/Python/2.7/site-packages/IPython/core/interactiveshell.py", line 2883, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-2-43ed68985dd1>", line 24, in <module> 
    observed = pymc.Bernoulli('observed', logistic, value=y, observed=True) 
    File "/usr/local/lib/python2.7/site-packages/pymc/distributions.py", line 318, in __init__ 
    **arg_dict_out) 
    File "/usr/local/lib/python2.7/site-packages/pymc/PyMCObjects.py", line 772, in __init__ 
    if not isinstance(self.logp, float): 
    File "/usr/local/lib/python2.7/site-packages/pymc/PyMCObjects.py", line 929, in get_logp 
    raise ZeroProbability(self.errmsg) 
ZeroProbability: Stochastic observed's value is outside its support, 
or it forbids its parents' current values. 

나는, 문제의 원인이 될 np.exp을 의심 할 때 선형 방정식이 너무 높아진다. 나는 PyMC (her is one)를 사용하여 로지스틱 회귀 분석을 정의하는 다른 방법이 알고 있지만, 나는이 방법이 작동하지 않는 이유를 알고에 관심이, 그리고 나는 Bernoulli 객체를 사용하는 대신 bernoulli_like

답변

3

보통 stochastastic을 pymc.Normal('w0', 0, 0.000001)으로 만들면 PyMC2는 이전 분포에서 무작위로 값을 초기화합니다. 과거가 너무 분산되어 있기 때문에 후부가 실제로 제로가 아닐 가능성이있는 값이 될 수 있습니다. 여기

w0 = pymc.Normal('w0', 0, 0.000001, value=0) 
w1 = pymc.Normal('w1', 0, 0.000001, value=0) 

a notebook with a few more details입니다 : 당신의 Normal을위한 합리적인 초기 값을 요청, 수정합니다.

0

를 사용하여 회귀 분석을 정의 할 수있는 방법 물류 기능에 의해 반환되는 확률에 일종의 경계를 두어야합니다.

아마

@pymc.deterministic 
def logistic(w0=w0, w1=w1, x=x): 
    tol = 1e-9 
    res = 1.0/(1. + np.exp(-(w0 + w1 * x))) 
    return np.maximum(np.minimum(res, 1 - tol), tol) 

같은 당신도 특급() 함수 내부의 부정적인 잊었다 생각합니다.

+0

누락 된 음수 부호에주의 해 주셔서 감사합니다. 귀하의 솔루션은 Abrahams 솔루션과 동일한 문제를 해결하지만 Abraham이 제안한 솔루션은 다음 두 가지 이유로 바람직합니다. 1) 더 짧습니다. 2) 코드가 이해하기 쉽습니다. – elgehelge

0

@ hahdawg의 대답은 좋지만 고려해야 할 사항이 있습니다.

귀하의 정보가 모르는 제임스에게 w0w1에 대한 정보를 제공하려면 먼저 안구 착용을 한 다음 제한이있는 유니폼을 사용하십시오. 분명히 w1은 약 1/15 = .07이기 때문에 .04 ~ 1.2와 같은 범위로 설정할 수 있습니다. w0의 범위는 -80/15 = -5.3이므로 -7 ~ -3과 같은 값이 가능합니다.

exp은 바나나를 쉽게 먹을 수 있기 때문에이 말을하고 있습니다. 따라서 먹을 것을 조심해야합니다. inverse logit 함수가 0 또는 1에 너무 가까운 값으로 나오면 로지스틱 회귀가 중단됩니다.

0

호기심에 맞지 않으신 분 sample으로 전화하시는 중에 thin 인수를 사용하고 있습니까? 그와 관련된 버그가 있었고 여기 범인 일 수도 있습니다.

게다가, 어떤 경우에도 간헐성은 가치가 없습니다.

+0

이 댓글은 잘못된 페이지로 끝 냅니까? –

+0

'observed' 변수를 정의 할 때 이미 오류가 발생합니다. 샘플링 할 때가 아닙니다. 따라서 'thin'인수는이 오류와 아무 관련이 없습니다. – elgehelge