compound model의 매개 변수 추정치를 얻기 위해 PyMC 2.3을 사용하려고합니다. "화합물"이란 매개 변수가 다른 임의의 변수 인 분포를 따르는 임의의 변수를 의미합니다. ("중첩 된"또는 "계층 적"은이 상황을 언급하기 위해 때때로 사용되지만, 덜 구체적이고이 상황에서 더 많은 혼란을 일으킨다 고 생각합니다).PyMC의 합성 모델
예를 들어 보겠습니다. "실제"데이터는 지수 분포로 분포 된 매개 변수가있는 포아송 인 복합 분포에서 생성됩니다. 내가 모델 매개 변수 tau_true
의 추정치를 획득 할
import numpy as np
from scipy.stats import distributions
np.random.seed(3) # for repeatability
nsamples = 1000
tau_true = 50
orig_lambda_sample = distributions.expon(scale=tau_true).rvs(nsamples)
data = distributions.poisson(orig_lambda_sample).rvs(nsamples)
다음과 같이 일반 scipy의 데이터가 생성됩니다. 내 접근 방식은 지금까지 PyMC에서이 문제를 모델링은 다음이다 : 나는 size=nsamples
를 사용
tau = pm.Uniform('tau', 0, 100)
count_rates = pm.Exponential('count_rates', beta=1/tau, size=nsamples)
counts = pm.Poisson('counts', mu=count_rates, value=data, observed=True)
참고 각 샘플에 대한 새로운 확률 변수를 가지고. (천천히> 10^5 반복하지만) 분포로 50 (tau_true
) 중심
model = pm.Model([count_rates, counts, tau])
mcmc = pm.MCMC(model)
mcmc.sample(40000, 10000)
모델 수렴 :
마지막으로 I는 MCMC을 실행. 그러나 단일 매개 변수를 사용하여 단일 분포에 적합하도록 1000 개의 확률 변수를 정의하는 것은 과도한 것처럼 보입니다.
PyMC에서 복합 모델을 설명하는 더 좋은 방법이 있습니까?
PS 나는 또한 더 많은 정보를 이전 (tau = pm.Normal('tau', mu=51, tau=1/2**2)
)을 시도했지만 결과는 유사하며 컨버전스는 여전히 느립니다.
이것이 올바른지 확인해 주셔서 감사합니다. PyMC. 네, 이것이 단지 음 이항 분포라는 것을 압니다. 하지만 내 질문은 복합 변수를 정의하는 방법에 대한 일반적인 질문입니다. 실제 경우 첫 번째 분포는 순수한 감마가 아닙니다 (잘 렸습니다). – user2304916
여전히 (거의 비) 수렴은 쇼 스토퍼입니다 (음 이항을 사용하지 않는 한). 이 경우, MCMC 베이지안 추론은 1000s의 데이터 요소가있을 때 복합 모델에 적합한 도구가 아닐 수도 있습니다. 어떻게 생각해? – user2304916
MCMC는 모델 크기 (많은 매개 변수)로 잘 조정되지만 데이터 크기 (많은 관측 값)와 잘 맞지 않습니다. 관측치가 많다면 컨버전스가 문제가되지 않아야합니다 (단순 모델의 경우). 그러나 속도는 문제가 될 수 있습니다. 이와 같은 단순한 모델을 사용하는 경우 MAP 및 NormApprox와 같은 비 반복적 접근 방법을 시도 할 수 있습니다. –