贝叶斯统计/PyMC 学习笔记 (一)

最近在读 Doing Bayesian Data Analysis,由于这本书的代码是用 R 写的,而我暂时也没有学 R 的打算,所以一边看书的同时一边学习用 PyMC3 来实现书中的例子/习题。这篇先写写 pymc 的使用。

一些有用的链接

基本用法

例如我们要测试一枚有偏的硬币,出现 head 的概率为 0.7。先把这个硬币抛上 100 遍:

flips = stats.bernoulli.rvs(p=0.7, size=100)
plt.hist(flips, bins=2)

py53035SOB.png

假设我们对这个硬币一无所知,则先验概率为均匀分布。定义模型:

with pm.Model() as model:
    p = pm.Uniform('p', 0.1, 0.9)
    obv = pm.Bernoulli('flips', p, observed=flips) # 观察到的数据

然后定义取样的算法和初始点,就可以进行 sampling:

with model:
    start = pm.find_MAP(vars=[p])
    step = pm.NUTS() # 书中详细介绍了 Metropolis 方法,pymc 也是有提供的

    trace = pm.sample(2000, start=start, step=step, progressbar=False)

p 的后验分布:

burnin = 1000
thin = 10

pm.traceplot(trace[burnin::thin], ['p'])

py53035siN.png

pm.summary(trace[burnin::thin], ['p'])
p:

  Mean             SD               MC Error         95% HPD interval
  -------------------------------------------------------------------
  
  0.670            0.051            0.005            [0.584, 0.765]

  Posterior quantiles:
  2.5            25             50             75             97.5
  |--------------|==============|==============|--------------|
  
  0.580          0.639          0.673          0.703          0.762

然后还有自相关检验:

pm.autocorrplot(trace[burnin::thin], ['p'])

py69110HtM.png

以上。