필자는 매개 변수를 추정하고자하는 관찰 데이터를 가지고 있으며 PYMC3을 시험해 볼 수있는 좋은 기회라고 생각했습니다.pymc3 : 다중 관측 값
내 데이터는 일련의 레코드로 구성됩니다. 각 레코드는 고정 된 1 시간 기간과 관련된 한 쌍의 관찰을 포함합니다. 하나의 관찰은 주어진 시간 동안 발생하는 총 이벤트 수입니다. 다른 관찰은 그 기간 내의 성공 횟수입니다. 예를 들어, 데이터 포인트는 주어진 1 시간 동안 총 1000 개의 이벤트가 있었고 1000, 100 개의 이벤트는 성공한 이벤트라고 지정할 수 있습니다. 다른 기간에는 총 1000000 개의 이벤트가있을 수 있으며 그 중 120000 개가 성공한 이벤트입니다. 관측 값의 분산은 일정하지 않으며 총 이벤트 수에 따라 달라지며 부분적으로는 제어 및 모델링하려는이 효과입니다.
기본 성공률을 평가하기위한 첫 번째 단계. 나는 scipy를 사용하여 그것을 생성함으로써 '관찰 된'데이터의 두 세트를 제공함으로써 상황을 모방하려는 아래의 코드를 준비했다. 그러나 제대로 작동하지 않습니다.
내가 그것을 찾아 낼 것으로 예상 할 것은 :
- loss_lambda_factor 대략 0.1
- total_lambda (및 total_lambda_mu가) 대신 약 120
입니다, 모델이 매우 빠르게 수렴하지만, 예상치 못한에 대답.
- total_lambda 및 total_lambda_mu는 각각 5e5 부근의 날카로운 피크이다. 상기 입력 데이터와 일치하지 않는 번호로 빠르게 수렴, 날카로운 피크 -
- loss_lambda_factor은 (I 인해 10 이하 평판에 게시 할 수 있음) traceplot 상당히 재미가 대략 0
이다. 내가 취하고있는 접근 방식에 근본적으로 잘못된 것이 있는지 궁금합니다. 올바른/예상 된 결과를 얻기 위해 다음 코드를 어떻게 수정해야합니까?
from pymc import Model, Uniform, Normal, Poisson, Metropolis, traceplot
from pymc import sample
import scipy.stats
totalRates = scipy.stats.norm(loc=120, scale=20).rvs(size=10000)
totalCounts = scipy.stats.poisson.rvs(mu=totalRates)
successRate = 0.1*totalRates
successCounts = scipy.stats.poisson.rvs(mu=successRate)
with Model() as success_model:
total_lambda_tau= Uniform('total_lambda_tau', lower=0, upper=100000)
total_lambda_mu = Uniform('total_lambda_mu', lower=0, upper=1000000)
total_lambda = Normal('total_lambda', mu=total_lambda_mu, tau=total_lambda_tau)
total = Poisson('total', mu=total_lambda, observed=totalCounts)
loss_lambda_factor = Uniform('loss_lambda_factor', lower=0, upper=1)
success_rate = Poisson('success_rate', mu=total_lambda*loss_lambda_factor, observed=successCounts)
with success_model:
step = Metropolis()
success_samples = sample(20000, step) #, start)
plt.figure(figsize=(10, 10))
_ = traceplot(success_samples)
놀라운 답변 아브라함, 정말 고마워요! – sozen