拓端tecdat|Python貝葉斯推斷Metropolis-Hastings(M-H)MCMC采樣算法的實(shí)現(xiàn)
原文鏈接:http://tecdat.cn/?p=25376
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
Metropolis-Hastings 算法對(duì)概率分布進(jìn)行采樣以產(chǎn)生一組與原始分布成比例的軌跡。
首先,目標(biāo)是什么?MCMC的目標(biāo)是從某個(gè)概率分布中抽取樣本,而不需要知道它在任何一點(diǎn)的確切概率。MCMC實(shí)現(xiàn)這一目標(biāo)的方式是在該分布上 "徘徊",使在每個(gè)地點(diǎn)花費(fèi)的時(shí)間與分布的概率成正比。如果 "徘徊 "過(guò)程設(shè)置正確,你可以確保這種比例關(guān)系(花費(fèi)的時(shí)間和分布的概率之間)得以實(shí)現(xiàn)
為了可視化算法的工作原理,我們?cè)诙S中實(shí)現(xiàn)它
plt.style.use('ggplot')
首先,讓我們創(chuàng)建并繪制任意目標(biāo)分布
tart = np.append
plt.hist
plt.text

現(xiàn)在讓我們寫出算法。請(qǐng)注意,我們將原始數(shù)據(jù)分箱計(jì)算給定點(diǎn)的概率。這是算法如何工作的粗略概念
選擇分布上的一個(gè)隨機(jī)位置
提議分布上的一個(gè)新位置
如果提議的位置比當(dāng)前的位置有更高的相對(duì)概率,就跳到這個(gè)位置(即把當(dāng)前位置設(shè)置為新位置)
如果不是,也許還是跳。仍然跳的概率與新位置的概率低多少成正比
返回算法所到過(guò)的所有位置?
def gees:
daa = d.astype
np.bincount # 產(chǎn)生一個(gè)范圍為(i,i+1)的計(jì)數(shù)數(shù)組
np.array([])
crnt = int
for i in xrange(n_ms):
trs = np.append
# 最終創(chuàng)建一個(gè)函數(shù),選擇一個(gè)好的跳躍距離
# 如果當(dāng)前位置的p很低,就把跳轉(zhuǎn)的距離變大
poo = int
# 確保我們不離開邊界
while rood ?data.max or ppsd < data.min:
pood = int
if a > 1:
cuent = prosed
else:
if np.random.random<= a:
curnt = ppse
traces = get_traces(target, 5000)
# 繪制目標(biāo)分布圖和軌跡分布圖
plt.hist
plt.subplot(2,1,2)
plt.hist
plt.tight_layout
plt.show

不僅軌跡的分布非常接近實(shí)際分布,樣本均值也非常接近。繪制的樣本點(diǎn)少于 5000 個(gè),我們非常接近于近似目標(biāo)分布的形狀。

最受歡迎的見解
1.matlab使用貝葉斯優(yōu)化的深度學(xué)習(xí)
2.matlab貝葉斯隱馬爾可夫hmm模型實(shí)現(xiàn)
3.R語(yǔ)言Gibbs抽樣的貝葉斯簡(jiǎn)單線性回歸仿真
4.R語(yǔ)言中的block Gibbs吉布斯采樣貝葉斯多元線性回歸
5.R語(yǔ)言中的Stan概率編程MCMC采樣的貝葉斯模型
6.Python用PyMC3實(shí)現(xiàn)貝葉斯線性回歸模型
7.R語(yǔ)言使用貝葉斯 層次模型進(jìn)行空間數(shù)據(jù)分析
8.R語(yǔ)言隨機(jī)搜索變量選擇SSVS估計(jì)貝葉斯向量自回歸(BVAR)模型
9.matlab貝葉斯隱馬爾可夫hmm模型實(shí)現(xiàn)