2016-10-16 7 views
3

example of Bayesian correlation for PyMC2을 PyMC3으로 변환하려고했지만 완전히 다른 결과를 얻습니다. 가장 중요한 점은 다변량 정규 분포의 평균은 빠르게 0으로 떨어지는 반면 PyMC2의 경우는 약 400 일 것입니다. 결과적으로, 추정 된 상관 관계는 빠르게 1로 향하는 데, 이는 잘못된 것이다.베이지안 상관 관계 (PyMC3 포함)

전체 코드는 notebook for PyMC2notebook for PyMC3에서 사용할 수 있습니다. 예상 된 결과를 반환하지 않습니다 명확하게

def precision(sigma, rho): 
    C = T.alloc(rho, 2, 2) 
    C = T.fill_diagonal(C, 1.) 
    S = T.diag(sigma) 
    return T.nlinalg.matrix_inverse(T.nlinalg.matrix_dot(S, C, S)) 


def analyze(data): 
    with pm.Model() as model: 
     # priors might be adapted here to be less flat 
     mu = pm.Normal('mu', mu=0., sd=0.000001, shape=2, testval=np.mean(data, axis=1)) 
     sigma = pm.Uniform('sigma', lower=1e-6, upper=1000., shape=2, testval=np.std(data, axis=1)) 
     rho = pm.Uniform('r', lower=-1., upper=1., testval=0) 

     prec = pm.Deterministic('prec', precision(sigma, rho)) 
     mult_n = pm.MvNormal('mult_n', mu=mu, tau=prec, observed=data.T) 

    return model 

model = analyze(data) 
with model: 
    trace = pm.sample(50000, tune=25000, step=pm.Metropolis()) 

PyMC3 버전이 실행되지만 : PyMC3은 다음과 같습니다에

PyMC2의 관련 코드는 위의 코드의

def analyze(data): 
    # priors might be adapted here to be less flat 
    mu = pymc.Normal('mu', 0, 0.000001, size=2) 
    sigma = pymc.Uniform('sigma', 0, 1000, size=2) 
    rho = pymc.Uniform('r', -1, 1) 

    @pymc.deterministic 
    def precision(sigma=sigma,rho=rho): 
     ss1 = float(sigma[0] * sigma[0]) 
     ss2 = float(sigma[1] * sigma[1]) 
     rss = float(rho * sigma[0] * sigma[1]) 
     return np.linalg.inv(np.mat([[ss1, rss], [rss, ss2]])) 

    mult_n = pymc.MvNormal('mult_n', mu=mu, tau=precision, value=data.T, observed=True) 

    model = pymc.MCMC(locals()) 
    model.sample(50000,25000) 

내 포트입니다. 어떤 도움을 주시면 감사하겠습니다.

답변

3

pymc.Normal의 호출 서명 pymc.Normal의 세번째 위치 인수 tau 아니라 표준 편차 sd 것을

In [125]: pymc.Normal? 
Init signature: pymc.Normal(self, *args, **kwds) 
Docstring: 
N = Normal(name, mu, tau, value=None, observed=False, size=1, trace=True, rseed=True, doc=None, verbose=-1, debug=False) 

공지이다. 따라서

해당 pymc3 코드 tau = 1/sigma**2 때문에

mu = pm.Normal('mu', mu=0., tau=0.000001, shape=2, ...) 

또는

mu = pm.Normal('mu', mu=0., sd=math.sqrt(1/0.000001), shape=2, ...) 

사용해야

mu = Normal('mu', 0, 0.000001, size=2) 

pymc 코드를 사용하기 때문이다. 이 하나의 변화와


, 당신의 pymc3 코드는 무의 이전이 misspecified 경우 예상대로 작동하지 않습니다 의미가 있습니다 (같은)

enter image description here

+0

바보 같은 실수를 생산하고 있습니다. 이 점을 지적 해 주셔서 감사합니다. – sebp