Bu benim sık sık kamptan gelen ve Bayesci veri analizi yapmak için ilk denemem. A. Gelman'ın Bayesian Veri Analizinden bir dizi ders ve birkaç bölüm okudum.
Seçtiğim ilk az ya da çok bağımsız veri analizi örneği tren bekleme süreleridir. Kendi kendime sordum: bekleme sürelerinin dağılımı nedir?
Veri kümesi bir blogda sağlanmıştır ve PyMC dışında biraz farklı analiz edilmiştir.
Amacım, bu 19 veri girişi göz önüne alındığında beklenen tren bekleme sürelerini tahmin etmektir.
Yaptığım model şöyledir:
burada μ olan veriler ortalama ve σ 1000 ile çarpılır veriler standart sapmadır.
Beklenen bekleme süresini Poisson dağılımını kullanarak olarak modelledim . Bu dağılım için oran parametresi, Poisson dağılımına eşlenik dağılım olduğu için Gamma dağılımı kullanılarak modellenmiştir. Hiper önceki μ ve σ sırasıyla Normal ve Yarı-Normal dağılımları ile modellenmiştir. Standart sapma σ , mümkün olduğunca yaygın olmamak üzere mümkün olduğunca geniş hale getirildi.
Bir sürü sorum var
- Bu model görev için uygun mu (modellemenin birkaç olası yolu?)?
- Acemi hata yaptım mı?
- Model basitleştirilebilir mi (basit şeyleri karmaşıklaştırma eğilimindeyim)?
- Rate parametresi ( ) için posteriorun verilere uyup uymadığını nasıl doğrulayabilirim ?
- Örnekleri görmek için takılı Poisson dağılımından nasıl bazı örnekler alabilirim?
5000 Metropolis adımından sonraki posteriorlar şöyle görünür:
Kaynak kodunu da gönderebilirim. Model montaj aşamasında, NUTS kullanarak ve σ parametreleri için adımlar yaparım . Sonra ikinci adımda ρ oran parametresi için Metropolis yapıyorum . Sonunda izi dahili araçları kullanarak çiziyorum.
Daha olasılıklı bir programlama yapmamı sağlayacak yorum ve yorumlar için çok minnettar olurum. Denemeye değer daha klasik örnekler olabilir mi?
İşte PyMC3 kullanarak Python'da yazdığım kod. Veri dosyasını burada bulabilirsiniz .
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()