- 線性回歸
import numpy as np N=100 x1 = np.random.randn(N) x2 = np.random.randn(N) alpha = 1 sigma = 1 beta = [1,2.5] y = alpha + beta[0]*x1 + beta[1]*x2 + np.random.randn(N)*sigma
np.random.randn()返回指定維度的array,一個位置參數為一個維度,位置參數的值為該維度的數據量,具有標准正態分布N(0,1)
此處為返回一維array,具有100個標准正態數據
其中sigma描述誤差,beta為權重,alpha為偏置,此處是已知值
通過隨機的輸入數據以及隨機的誤差獲得觀測的array為y
if __name__ == '__main__': basic_model = pm.Model() with basic_model: alpha = pm.Normal('alpha',mu=0,sd=10) beta = pm.Normal('beta',mu=0,sd=10,shape=2) sigma = pm.HalfNormal('sigma',sd=1) mu = alpha + beta[0]*x1+beta[1]*x2 y_obs = pm.Normal('y_obs',mu=mu,sd=sigma,observed=y)
此處,認為sigma,beta,alpha,均為未知變量,嘗試通過觀測值為其恢復參數(也即進行后驗估計)
在貝葉斯理論中,未知的變量都應指定先驗分布
此處認為alpha,beta,sigma均具有如上所示的先驗分布(后面會根據觀測值對先驗進行更新)
mu為隨機變量之間的運算結果,注意此時輸入仍然是x1和x2,只是sigma,beta,alpha不再是確定值,而是隨機變量
獲得此時的輸出mu可以作為y的均值mu表示(實際上其為確定性隨機變量,通過隨機變量的運算得到的量)
此時的方差就是之前設置的誤差sigma(也就是線性回歸誤差)
Y_obs為一個觀測隨機變量,表示模型數據的可能性,通過observed參數來告訴這個觀測變量是被觀測到的,與其他直接假設先驗的隨機變量不同,其不會因為擬合算法而發生改變
最后導入觀測數據,就可以獲得指定先驗分布的變量的一些估計值
map_estimate = pm.find_MAP(model=basic_model)
此處是MAP方法,即極大后驗估計方法
雖然極大后驗估計是一個簡單快速的估計未知參數的辦法,但是沒有對不確定性進行估計是其缺陷
為了使用MCMC采樣以獲得后驗分布的樣本,PyMC3需要指定和特定MCMC算法相關的步進方法(采樣方法),如Metropolis, Slice sampling, or the No-U-Turn Sampler (NUTS)。
PyMC3中的 step_methods
子模塊提供了如下采樣器: NUTS
, Metropolis
, Slice
, HamiltonianMC
, and BinaryMetropolis
。可以由PyMC3自動指定也可以手動指定。自動指定是根據模型中的變量類型決定的:
* 二值變量:指定 BinaryMetropolis
* 離散變量:指定 Metropolis
* 連續變量:指定 NUTS
trace = pm.sample(2000) pm.traceplot(trace) plt.show() print(pm.summary(trace))
sample
函數用指定的迭代器(采樣算法)進行了2000次迭代,收集到的采樣值存儲在 Trace
對象中,按照采樣值獲得的先后順序存儲。
Trace
對象是一個字典中包含了多個map,比如可以使用trace[‘alpha']來進行使用,其是一個array對象
可以通過 step
參數指定特定的采樣器(迭代器)來替換默認的迭代器NUTS
# 用MAP獲得初始點 start = pm.find_MAP(fmin=optimize.fmin_powell) # 實例化采樣器 step = pm.Slice(vars=[sigma]) # 對后驗分布進行5000次采樣 trace = pm.sample(5000, step=step,start=start)
可以設置sample的起始點為極大后驗點
sigma
變量指定 Slice
采樣器(step
),那么其他兩個變量( alpha
和 beta
)的采樣器會自動指定(NUTS
)
pm.traceplot(trace)
函數來繪制后驗采樣的趨勢圖
左側是每個隨機變量的邊際后驗的直方圖(縱坐標為frequency,橫坐標為變量自身的取值),使用核密度估計進行了平滑處理
右側是馬爾可夫鏈采樣值按順序繪制(縱坐標為采樣值,橫坐標為采樣數量)
對於向量參數 beta
會有兩條后驗分布直方圖和后驗采樣值
本例中達到的目的是
在擁有觀測值集合y(里面包含了誤差等外界因素),輸入數據(x1和x2),輸入和輸出的函數關系,
去求解sigma(線性回歸的誤差,表示為方差),beta(權重),alpha(偏置)的估計值(也就是線性回歸參數)
通過nuts采樣,獲得待求解變量的后驗分布數據,從而獲得其最高概率時的取值
這樣就獲得了參數值,完成了一個線性回歸的擬合
- 拋硬幣問題
硬幣扔了n次,正面朝上是h次
想知道 p 的可能性。給定 n 扔的次數和 h 正面朝上次數,p 的值很可能接近 0.5,比如說在 [0.48,0.52]?