2014-10-21 6 views
0

어리석은 짓을하거나 pymc3에 버그가 있지만 T 분포를 보통으로 맞추려고하면 잘 모르겠다. 자유도 (0.18에서 0.25까지, 나는 높은 것을 기대한다. , 적어도 4-5). 나는 자유도 적당한 수의 T 분포를하려고하면 물론 당신이 일부 수정 (전과 변경, 샘플링 방법)을 제안 할 수 3학생의 t 분포에 맞게 pymc3 사용하기

import pymc3 as pm 
Nsample = 200000 
tst = np.random.normal(loc = 1e4, scale = 5e4, size = 250) 
with pm.Model() as m: 
    mean = pm.Normal('mean',mu=0,sd = 1e5) 
    sigma = pm.Flat('sigma') # I tried uniform, gamma, exponential 
    df = pm.Flat("df") # the same 
    v = pm.T("pl",nu=df,mu = mean, lam = 1.0/sigma, observed = tst) 

    start = {'df':5,'mean': 1e4, 'sigma':5e4} #start = pm.find_MAP() 

    step = pm.Metropolis() 
    trace = pm.sample(Nsample, step,start=start, progressbar=True) 

pm.traceplot(trace[100000:],vars = ['df', 'sigma', 'mean']); 

5.처럼 같은 오류가 무엇입니까?

답변

0

df가 약 4-5 인 이유는 무엇입니까? df-> inf 인 T 분포는 정규 분포와 같습니다. 귀하의 모델을 실행할 때 : print trace['df'][10000:].mean() 나는 매우 큰 무언가를 1.19876070951e+13, 얻을.

뭔가 다른 것을 볼 수있는 한 가지 이유는 공동 공간 (pymc3에서 기본값이었던)에서 샘플링을 시도하는 경우 Metropolis sampler가 실패 할 가능성이 높기 때문입니다. 최근 master에서 pymc3을 업데이트하지 않은 경우 Metropolis이 기본적으로 비 블로킹이고 각 변수를 개별적으로 샘플링하므로 모델을 다시 업데이트하고 실행 해보십시오.

+0

내가 원래 계획대로 내가 TST = np.random.standard_t (3.0, 크기 = 250) * 20000 + 1E4 와 TST 교체하더라도 그것은, 지금은 잘 작동합니다. 감사! 나는 왜 이전 버전이 작동하지 않았는지 이해하지 못합니다. 연구로 돌아 가라. –

+0

NUTS는 여전히 어리석은 답을줍니다. (df ~ 0.22) –

+0

'start = find_MAP(); sampler = NUTS (scaling = start)'? 그것들은 거의 항상 요구됩니다. – twiecki