这是我从常驻人员那里进行贝叶斯数据分析的第一次尝试。我阅读了A. Gelman撰写的Bayesian Data Analysis中的许多教程和一些章节。
作为第一个或多或少独立数据分析示例,我选择了火车等待时间。我问自己:等待时间的分布是什么?
该数据集在博客上提供,并且在PyMC之外进行了稍有不同的分析。
我的目标是给定这19个数据条目,估计预期的火车等待时间。
我建立的模型如下:
其中是数据平均值,是数据标准偏差乘以1000。
我使用泊松分布将预期的等待时间建模为。此分布的速率参数是使用Gamma分布建模的,因为它是与Poisson分布的共轭分布。超先验和分别使用正态分布和半正态分布建模。使标准偏差尽可能宽,以使其尽可能不被置信。
我有很多问题
- 这个模型对任务是否合理(几种可能的建模方法?)?
- 我有没有犯任何新手错误?
- 是否可以简化模型(我倾向于使简单的事情复杂化)?
- 如何验证rate参数()的后验是否确实适合数据?
- 如何从拟合的泊松分布中抽取一些样本以查看样本?
在经过5000个Metropolis步骤后,后继者看起来像这样:
我也可以发布源代码。在模型拟合阶段,我使用NUTS 执行参数和的步骤。然后在第二步中对速率参数进行Metropolis操作。最后,我使用内置工具绘制轨迹。
对于任何能够使我掌握更多概率编程的言论和评论,我将不胜感激。可能还有更多值得尝试的经典示例吗?
这是我使用PyMC3在Python中编写的代码。数据文件可以在这里找到。
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()