MCMC ,M H取樣 示例 (pyhton版本)

2021-09-17 01:42:42 字數 3114 閱讀 2732

初看mcmc取樣的時候,一腦子的霧水。不盡會問,馬爾科夫鏈穩定後怎麼取樣啊,都穩定了每次取樣出來的東西不是一樣的嗎?這時候特別希望有個例子能看看,怎麼取樣的,採出來的是什麼東西。很不幸,網上的例子全是連續函式的版本的,沒有離散版本的。那麼今天,我就把我的**分享給大家。

'''

created on 2023年5月16日

p:輸入的概率分布,離散情況採用元素為概率值的陣列表示

n:認為迭代n次馬爾可夫鏈收斂

nlmax:馬爾可夫鏈收斂後又取的服從p分布的樣本數

ismh:是否採用mh演算法,預設為true

1)輸入我們任意選定的馬爾科夫鏈狀態轉移矩陣q,平穩分布π(x),設定狀態轉移次數閾值n1,需要的樣本個數n2

2)從任意簡單概率分布取樣得到初始狀態值x0

3)for t=0 to n1+n2−1:

a) 從條件概率分布q(x|xt)中取樣得到樣本x∗

b) 從均勻分布取樣u∼uniform[0,1]

c) 如果u

d) 否則不接受轉移,即xt+1=xt

樣本集(xn1,xn1+1,...,xn1+n2−1)即為我們需要的平穩分布對應的樣本集。

'''from __future__ import division

import matplotlib.pyplot as plt

import numpy as np

from array import array

defmcmc

(pi ,q,n=

1000

,nlmax=

100000

,ismh=

false):

x0 = np.random.randint(

len(pi)

)# 第一步:從均勻分布(隨便什麼分布都可以)取樣得到初始狀態值x0

t = n+nlmax-

1 result =[0

for i in

range

(t)]

t =0while t < t-1:

t = t +

1# 從條件概率分布q(x|xt)中取樣得到樣本x∗

# 該步驟是模擬取樣,根據多項分布,模擬走到了下乙個狀態

#(也可以將該步轉換成乙個按多項分布比例的均勻分布來取樣)

x_cur = np.argmax(np.random.multinomial(

1,q[result[t-1]

]))if ismh:

''' 細緻平穩條件公式:πi pij=πj pji,∀i,j

'''a =

(pi[x_cur]

* q[x_cur]

[result[t-1]

])/(pi[result[t-1]

]* q[result[t-1]

][x_cur]

)# 第三步:計算接受率

acc =

min(a ,1)

else

:#mcmc

acc = pi[x_cur]

* q[x_cur]

[result[t-1]

] u = np.random.uniform(0,

1)# 第四步:生成閾值

if u< acc:

# 第五步:是否接受樣本

result[t]

=x_cur

else

: result[t]

= result[t-1]

return result

defcount

(q, n)

: l = array(

"d")

l1 = array(

"d")

l2 = array(

"d")

for e in q:

for e in

range

(n):

)for e in l1:

sum(l1)

)return l1, l2

if __name__ ==

'__main__'

: pi = np.array(

[0.5

,0.2

,0.3])

# 目標的概率分布

#狀態轉移矩陣,但是不滿足在 平衡狀態時和 pi相符

#我們的目標是按照某種條件改造q ,使其在平衡狀態時和pi相符

#改造方法就是,構造矩陣 p,且 p(i,j)=q(i,j)α(i,j)

# α(i, j) = π(j)q(j, i)

# α(j, i) = π(i)q(i, j)

q = np.array([[

0.9,

0.075

,0.025],

[0.15

,0.8

,0.05],

[0.25

,0.25

,0.5]]

) a = mcmc(pi,q)

l1 =

['state%d'

% x for x in

range

(len

(pi))]

plt.pie(count(a,

len(pi))[

0], labels=l1, labeldistance=

0.3, autopct=

'%1.2f%%'

) plt.title(

"markov:"

+str

(pi)

) plt.show(

)

可以看見。我們的轉移概率矩陣q的平衡狀態是[0.61.0.31.0.8],和我們的目標分布 pi [0.5, 0.2, 0.3]是不相同的,所以我們的目標是構造乙個轉移概率矩陣 p, p(i,j)=q(i,j)α(i,j),使得p的平衡狀態滿足pi。**的結果為:

由於mcmc取樣效率低(接受率低),需要多採一點樣本才看起來更像。

LGame Android版 開發示例之連連看

最近經常有問到一些關於lgame開發示例的問題,似乎覺得lgame的示例還是不足以滿足日常開發的需要。其實,大家完全不用擔心lgame示例數量的問題,因為小弟在開發lgame過程中使用的測試程式已經足夠做例子用了 接近三位數 只是目前有一些部分需要優化所以暫時沒有發布而已。但是,網路的需要就是對小弟...

LGame Android版 開發示例之連連看

最近經常有問到一些關於lgame開發示例的問題,似乎覺得lgame的示例還是不足以滿足日常開發的需要。其實,大家完全不用擔心lgame示例數量的問題,因為小弟在開發lgame過程中使用的測試程式已經足夠做例子用了 接近三位數 只是目前有一些部分需要優化所以暫時沒有發布而已。但是,網路的需要就是對小弟...

LGame Android版 開發示例之連連看

最近經常有問到一些關於lgame開發示例的問題,似乎覺得lgame的示例還是不足以滿足日常開發的需要。其實,大家完全不用擔心lgame示例數量的問題,因為小弟在開發lgame過程中使用的測試程式已經足夠做例子用了 接近三位數 只是目前有一些部分需要優化所以暫時沒有發布而已。但是,網路的需要就是對小弟...