Это моя первая попытка того, чтобы кто-то из лагеря для частых людей сделал анализ байесовских данных. Я прочитал несколько учебников и несколько глав из Байесовского анализа данных А. Гельмана.
В качестве первого более или менее независимого примера анализа данных я выбрал время ожидания поезда. Я спросил себя: каково распределение времени ожидания?
Набор данных был представлен в блоге и анализировался несколько иначе и за пределами PyMC.
Моя цель - оценить ожидаемое время ожидания поезда с учетом этих 19 записей.
Модель, которую я построил, следующая:
где - среднее значение данных, а - стандартное отклонение данных, умноженное на 1000.
Я смоделировал ожидаемое время ожидания как используя распределение Пуассона. Параметр скорости для этого распределения моделируется с использованием гамма-распределения, поскольку оно является сопряженным распределением к распределению Пуассона. Гиперприоры и были смоделированы с нормальным и полунормальным распределениями соответственно. Стандартное отклонение было сделано как можно более широким, чтобы быть как можно более непринужденным.
У меня есть куча вопросов
- Является ли эта модель приемлемой для данной задачи (несколько возможных способов моделирования?)?
- Я сделал какие-нибудь ошибки новичка?
- Можно ли упростить модель (я склонен усложнять простые вещи)?
- Как я могу проверить, соответствует ли апостериорный параметр скорости ( ) данным?
- Как я могу извлечь некоторые образцы из подходящего распределения Пуассона, чтобы увидеть образцы?
Постеры после 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()