Це моя перша спроба, щоб хтось із табору часто виявився для аналізу байєсівських даних. Я прочитав ряд навчальних посібників та декілька розділів з Байєсівського аналізу даних А. Гельмана.
Як перший, більш-менш незалежний приклад аналізу даних, який я вибрав, є час очікування поїздів. Я запитав себе: який розподіл часу очікування?
Набір даних був наданий у блозі та був проаналізований дещо інакше та поза PyMC.
Моя мета - оцінити очікувані терміни очікування поїздів, враховуючи ці 19 даних.
Модель, яку я побудувала, є наступною:
де - середнє значення даних, а - стандартне відхилення даних, помножене на 1000.
Я моделював передбачуваний час очікування , як , використовуючи розподіл Пуассона. Параметр швидкості для цього розподілу моделюється за допомогою розподілу Gamma, оскільки він є кон'югованим розподілом з розподілом Пуассона. Гіперприори та були змодельовані відповідно до нормальних та пів-нормальних розподілів. Стандартне відхилення було зроблено якомога ширше, щоб бути якомога більш некомерційним.
У мене є маса питань
- Чи обґрунтована ця модель для завдання (кілька можливих способів моделювання?)?
- Чи робив я помилки початківців?
- Чи можна спростити модель (я схильний до складних простих речей)?
- Як я можу перевірити, чи задній параметр швидкості ( ) насправді відповідає даним?
- Як я можу намалювати деякі зразки з пристосованого розподілу Пуассона, щоб побачити зразки?
Плакати після 5000 кроків метрополії виглядають так:
Я також можу розмістити вихідний код. На етапі підгонки моделі я виконую кроки для параметрів та за допомогою NUTS. Потім на другому кроці я роблю Metropolis для параметра швидкості . Нарешті, я будувати трасування за допомогою вбудованих інструментів.
Я був би дуже вдячний за будь-які зауваження та коментарі, які б дали мені змогу зрозуміти більш імовірнісне програмування. Можливо, є ще класичні приклади, з якими варто експериментувати?
Ось код, який я написав у 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()