이것은 잦은 야영지에서 누군가 베이지안 데이터 분석을하기위한 첫 시도입니다. A. Gelman의 Bayesian Data Analysis에서 여러 자습서와 몇 개의 장을 읽었습니다.
내가 선택한 첫 번째 다소 독립적 인 데이터 분석 예제는 기차 대기 시간입니다. 나는 나 자신에게 물었다 : 대기 시간의 분포는 무엇인가?
데이터 세트는 블로그 에서 제공되었으며 PyMC 외부와 약간 다르게 분석되었습니다.
저의 목표는 19 개의 데이터 항목이 제공된 예상 열차 대기 시간을 추정하는 것입니다.
내가 만든 모델은 다음과 같습니다.
여기서 는 데이터 평균이고 는 데이터 표준 편차에 1000을 곱한 값입니다.
Poisson 분포를 사용하여 예상 대기 시간을 로 모델링했습니다 . 이 분포에 대한 비율 모수는 포아송 분포에 대한 공액 분포이므로 감마 분포를 사용하여 모델링됩니다. 하이퍼-프라이어 및 는 각각 정규 및 반 정규 분포로 모델링되었습니다. 표준 편차 는 최대한 커밋되지 않도록 최대한 넓게 만들어졌습니다.
나는 많은 질문이있다
- 이 모델이 작업에 합리적입니까 (여러 가지 가능한 모델링 방법)?
- 초보자 실수를 했습니까?
- 모델을 단순화 할 수 있습니까 (단순한 것을 복잡하게 만드는 경향이 있습니까)?
- rate 매개 변수의 사후 ( )가 실제로 데이터에 적합한 지 어떻게 확인할 수 있습니까?
- 적합 Poisson 분포에서 일부 표본을 추출하여 표본을 보려면 어떻게해야합니까?
5000 Metropolis 단계 이후의 후부는 다음과 같습니다.
소스 코드도 게시 할 수 있습니다. 모델 피팅 단계에서는 NUTS를 사용하여 매개 변수 및 대한 단계를 수행합니다 . 그런 다음 두 번째 단계에서 속도 매개 변수 대해 Metropolis를 수행합니다 . 마지막으로 내장 도구를 사용하여 추적을 플로팅합니다.
좀 더 확률적인 프로그래밍을 파악할 수있는 발언과 의견에 매우 감사하겠습니다. 실험 할 가치가있는 더 고전적인 예가있을 수 있습니까?
다음은 PyMC3을 사용하여 Python으로 작성한 코드입니다. 데이터 파일은 여기 에서 찾을 수 있습니다 .
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import pymc3
from scipy import optimize
from pylab import figure, axes, title, show
from pymc3.distributions import Normal, HalfNormal, Poisson, Gamma, Exponential
from pymc3 import find_MAP
from pymc3 import Metropolis, NUTS, sample
from pymc3 import summary, traceplot
df = pd.read_csv( 'train_wait.csv' )
diff_mean = np.mean( df["diff"] )
diff_std = 1000*np.std( df["diff"] )
model = pymc3.Model()
with model:
# unknown model parameters
mu = Normal('mu',mu=diff_mean,sd=diff_std)
sd = HalfNormal('sd',sd=diff_std)
# unknown model parameter of interest
rate = Gamma( 'rate', mu=mu, sd=sd )
# observed
diff = Poisson( 'diff', rate, observed=df["diff"] )
with model:
step1 = NUTS([mu,sd])
step2 = Metropolis([rate])
trace = sample( 5000, step=[step1,step2] )
plt.figure()
traceplot(trace)
plt.savefig("rate.pdf")
plt.show()
plt.close()