Ini adalah upaya pertama saya untuk seseorang yang datang dari kamp frequentist untuk melakukan analisis data Bayesian. Saya membaca sejumlah tutorial dan beberapa bab dari Bayesian Data Analysis oleh A. Gelman.
Sebagai contoh analisis data pertama yang kurang lebih independen saya memilih adalah kereta menunggu waktu. Saya bertanya pada diri sendiri: apa distribusi waktu tunggu?
Dataset disediakan di blog dan dianalisis sedikit berbeda dan di luar PyMC.
Tujuan saya adalah memperkirakan waktu tunggu kereta yang diharapkan diberikan 19 entri data.
Model yang saya buat adalah sebagai berikut:
di mana berarti data dan adalah standar deviasi data dikalikan dengan 1000.
Saya dimodelkan waktu tunggu yang diharapkan sebagai menggunakan distribusi Poisson. Parameter laju untuk distribusi ini dimodelkan menggunakan distribusi Gamma karena merupakan distribusi konjugat ke distribusi Poisson. Hyper-priors dan dimodelkan masing-masing dengan distribusi Normal dan Setengah-Normal. Standar deviasi dibuat seluas mungkin untuk menjadi non-komital mungkin ..
Saya punya banyak pertanyaan
- Apakah model ini masuk akal untuk tugas tersebut (beberapa cara untuk membuat model?)?
- Apakah saya membuat kesalahan pemula?
- Bisakah modelnya disederhanakan (saya cenderung mempersulit hal-hal sederhana)?
- Bagaimana saya bisa memverifikasi jika posterior untuk parameter tingkat ( ) benar-benar cocok dengan data?
- Bagaimana saya bisa menggambar beberapa sampel dari distribusi Poisson yang dipasang untuk melihat sampel?
Posisi setelah 5000 langkah Metropolis terlihat seperti ini:
Saya dapat memposting kode sumber juga. Pada tahap pemasangan model saya melakukan langkah-langkah untuk parameter dan menggunakan NUTS. Kemudian pada langkah kedua saya melakukan Metropolis untuk parameter rate . Akhirnya saya memplot jejak menggunakan alat inbuilt.σ ρ
Saya akan sangat berterima kasih atas komentar dan komentar yang memungkinkan saya memahami pemrograman yang lebih probabilistik. Mungkin ada contoh lebih klasik yang layak untuk dicoba?
Berikut adalah kode yang saya tulis dalam Python menggunakan PyMC3. File data dapat ditemukan di sini .
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()