PyMC3
(validating required)Bayesian sampling方法用於估計模型解析形已知,模型中含有已經分佈,但參數未知的多個隨機變數,且已觀測到相對應的多個隨機結果,希望估計出多個隨機參數分佈的參數值。(點估計(MAP)或是區間估計(MCMC))
範例:非公正的硬幣
- 例如我們要測試一枚有偏的硬幣,出現 head 的概率為 0.7。先把這個硬幣拋上 100 遍。
from scipy import stats
import matplotlib.pyplot as plt
flips = stats.bernoulli.rvs(p=0.7, size=100)
plt.hist(flips, bins=2)
plt.show()
- 假設我們對這個硬幣一無所知,則先驗機率(priori probability)為均勻分佈。定義模型如下:
with pm.Model() as model:
# 先驗機率分佈
p = pm.Uniform('p', 0.1, 0.9)
# 觀察到的資料
obv = pm.Bernoulli('flips', p, observed=flips)
- 然後定義取樣的演算法和初始點,就可以進行取樣:
with model:
start = pm.find_MAP(vars=[p])
step = pm.NUTS()
trace = pm.sample(2000, start=start, step=step, progressbar=False)
- p 的後驗分佈:
burnin = 1000
thin = 10
pm.traceplot(trace[burnin::thin], ['p'])
參考文獻
- Bayesian Methods for Hackers, 此開源書是以PyMC2寫成。
- Doing Bayesian Data Analysis - python/pymc3 version
- Computational statistics in python