2014-04-07 5 views
1

동일한 절편을 공유하는 여러 줄을 맞추려고합니다.PyMC 다중 선형 회귀

import numpy as np 
import pymc 

# Observations 
a_actual = np.array([[2., 5., 7.]]).T 
b_actual = 3. 
t = np.arange(100) 
obs = np.random.normal(a_actual * t + b_actual) 


# PyMC Model 
def model_linear(): 
    b = pymc.Uniform('b', value=1., lower=0, upper=200) 

    a = [] 
    s = [] 
    r = [] 
    for i in range(len(a_actual)): 
     s.append(pymc.Uniform('sigma_{}'.format(i), value=1., lower=0, upper=100)) 
     a.append(pymc.Uniform('a_{}'.format(i), value=1., lower=0, upper=200)) 
     r.append(pymc.Normal('r_{}'.format(i), mu=a[i] * t + b, tau=1/s[i]**2, value=obs[i], observed=True)) 

    return [pymc.Container(a), b, pymc.Container(s), pymc.Container(r)] 

model = pymc.Model(model_linear()) 
map = pymc.MAP(model) 
map.fit() 
map.revert_to_max() 

계산 된 MAP 추정치는 실제 값과는 거리가 .니 다. 이 값은 sigmasa의 상한 및 하한에 매우 민감하므로 a의 실제 값 (예 : a = [.2, .5, .7]은 좋은 추정치를 제공합니다) 또는 회귀를 수행 할 회선 수에 매우 민감합니다.

내 선형 회귀를 수행하는 올바른 방법입니까?

ps : sigmas에 대한 지수 사전 배포를 사용하려고했지만 결과가 좋지 않았습니다.

+0

3 가지 별도의 선형 회귀 분석을 실행할 수 있습니까? – nstjhp

+0

각각의 관측치가 같은 요격 ('b')을 공유해야하기 때문에 나는 할 수 없다. 내 실제 모델은 그것보다 복잡합니다. 이것은 내 문제의 단순화 된 버전입니다. – synapski

답변

1

MAP을 사용하는 것이 최선의 방법이 아닌 것 같습니다. 당신이 적절한 샘플링을 할 수 있다면 다음이 매개 변수에 대한 매우 정확한 추론을 제공하기위한

MCMClinear = pymc.MCMC(model) 
MCMClinear.sample(10000,burn=5000,thin=5) 
linear_output=MCMClinear.stats() 

linear_output를 인쇄하여 예제 코드의 마지막 3 라인 교체를 고려.

+0

예, MCMC 샘플링이 잘 작동하고 좋은 결과를 제공합니다. MAP 견적이 왜 단순한 모델에서 변수 경계 나 관측 값에 너무 민감한 지 궁금합니다. [lmfit] (http://cars9.uchicago.edu/software/python/lmfit/) 라이브러리 (scipy의 최적화 패키지를 기반으로 함)를 사용하면 같은 문제에 대해 좋은 결과를 얻을 수 있습니다. – synapski