これは、常連のキャンプから来た誰かがベイジアンデータ分析を行うための私の最初の試みです。A. GelmanによるBayesian Data Analysisからいくつかのチュートリアルといくつかの章を読みました。
最初に多かれ少なかれ独立したデータ分析の例として選択したのは、列車の待ち時間です。私は自分自身に尋ねました:待ち時間の分布は何ですか?
データセットはブログで提供され、PyMCの外部とは少し異なって分析されました。
私の目標は、これらの19のデータエントリから、予想される列車の待ち時間を見積もることです。
私が作成したモデルは次のとおりです。
どこμは、データが意味され、σは 1000年を掛けたデータの標準偏差です。
たくさん質問があります
- このモデルはタスクに適していますか(モデルを作成する方法はいくつかありますか?)?
- 私は初心者の間違いをしましたか?
- モデルを簡略化できますか(私は単純なものを複雑にする傾向があります)?
- フィッティングされたポアソン分布からいくつかのサンプルを描画して、サンプルを表示するにはどうすればよいですか?
5000メトロポリスのステップの後の事後は、次のようになります。
より確率的なプログラミングを理解するのに役立つコメントやコメントに感謝します。試してみる価値のあるもっと古典的な例があるかもしれませんか?
これが、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()