นี่เป็นความพยายามครั้งแรกของฉันสำหรับใครบางคนที่มาจากค่ายบ่อย ๆ เพื่อทำการวิเคราะห์ข้อมูลแบบเบย์ ฉันอ่านบทช่วยสอนจำนวนหนึ่งและบทไม่กี่บทจากการวิเคราะห์ข้อมูลแบบเบย์โดย A. Gelman
เนื่องจากตัวอย่างการวิเคราะห์ข้อมูลอิสระมากขึ้นหรือน้อยลงอย่างแรกที่ฉันเลือกคือเวลาในการรอรถไฟ ฉันถามตัวเองว่าอะไรคือการกระจายเวลารอคอย
ชุดข้อมูลนั้นมีอยู่ในบล็อกและได้รับการวิเคราะห์แตกต่างกันเล็กน้อยและนอก PyMC
เป้าหมายของฉันคือการประเมินเวลารอรถไฟที่คาดว่าจะได้รับจากข้อมูล 19 รายการ
โมเดลที่ฉันสร้างขึ้นมีดังต่อไปนี้:
โดยที่คือค่าเฉลี่ยของข้อมูลและคือส่วนเบี่ยงเบนมาตรฐานของข้อมูลคูณด้วย 1,000
ฉันจำลองเวลารอคอยที่คาดว่าจะเป็นโดยใช้การแจกแจงปัวซอง พารามิเตอร์ rate สำหรับการแจกแจงนี้ถูกสร้างแบบจำลองโดยใช้การแจกแจงแกมม่าเนื่องจากเป็นการเชื่อมต่อแบบคอนจูเกตกับการแจกแจงแบบปัวซอง ไฮเปอร์ - ไพรเออร์และถูกสร้างแบบจำลองด้วยการแจกแจงแบบปกติและแบบครึ่งปกติ ค่าเบี่ยงเบนมาตรฐานถูกทำให้กว้างที่สุดเท่าที่จะเป็นได้
ฉันมีคำถามมากมาย
- แบบจำลองนี้มีความเหมาะสมสำหรับงานหรือไม่
- ฉันทำผิดพลาดเริ่มต้นหรือไม่?
- แบบจำลองสามารถทำให้ง่ายขึ้นได้หรือไม่ (ฉันมักจะทำให้สิ่งต่าง ๆ ง่ายขึ้น)?
- ฉันจะตรวจสอบได้อย่างไรว่าพารามิเตอร์ด้านหลัง ( ) เหมาะกับข้อมูลจริงหรือไม่?
- ฉันจะดึงตัวอย่างจากการกระจาย Poisson ที่ติดตั้งเพื่อดูตัวอย่างได้อย่างไร
ผู้ตกแต่งหลัง 5,000 ขั้นตอนของ Metropolis มีลักษณะดังนี้:
ฉันสามารถโพสต์ซอร์สโค้ดได้เช่นกัน ในขั้นตอนการติดตั้งแบบจำลองฉันทำตามขั้นตอนสำหรับพารามิเตอร์และโดยใช้ NUTS จากนั้นในขั้นตอนที่สองที่ฉันทำ Metropolis อัตราพารามิเตอร์\ในที่สุดฉันลงจุดติดตามโดยใช้เครื่องมือ inbuilt
ฉันจะขอบคุณมากสำหรับข้อสังเกตและความคิดเห็นใด ๆ ที่จะช่วยให้ฉันเข้าใจการเขียนโปรแกรมน่าจะเป็นมากขึ้น อาจมีตัวอย่างคลาสสิคที่ควรค่าแก่การทดสอบอีกหรือไม่
นี่คือรหัสที่ฉันเขียนใน Python โดยใช้ PyMC3 แฟ้มข้อมูลที่สามารถพบได้ที่นี่
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()