初看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過程中使用的測試程式已經足夠做例子用了 接近三位數 只是目前有一些部分需要優化所以暫時沒有發布而已。但是,網路的需要就是對小弟...