小白都能讀懂的Gibbs Sampling

Gibbs Sampling

假設二維場景下,狀態(x, y)轉移到(x’, y’),可以分爲三種場景

  • 平行於y軸轉移,如上圖中從狀態A轉移到狀態B
  • 平行於x軸轉移,如上圖中從狀態A轉移到狀態C
  • 其他情況轉移,如上圖從狀態A轉移到狀態D

A->B:

p(x1,y1)p(y2x1)=p(x1)p(y1x1)p(y2x1) p(x_{1},y_{1})p(y_{2}|x_{1}) = p(x_{1})p(y_{1}|x_{1})p(y_{2}|x_{1})

B->A:

p(x1,y2)p(y1x1)=p(x1)p(y2x1)p(y1x1) p(x_{1},y_{2})p(y_{1}|x_{1}) = p(x_{1})p(y_{2}|x_{1})p(y_{1}|x_{1})

即:
P(A)p(y2x1)=P(B)p(y1x1) P(A)p(y_{2}|x_{1}) = P(B)p(y_{1}|x_{1})
同理,對於場景二:
P(A)p(x2y1)=P(C)p(x1y1) P(A)p(x_{2}|y_{1}) = P(C)p(x_{1}|y_{1})
對於場景三,規定不允許轉移
P(A)0=P(D)0 P(A) * 0 = P(D) * 0
實際上,從狀態A轉移到狀態D可以通過一次場景一轉移和一次場景二轉移得到。所以即使規定A到D的轉移概率爲0,也滿足A到D可以經過有限次轉移達到。
於是,我們可以構造二維平面上任意兩點之間的轉移概率矩陣Q:

Q(A>B)=p(yBx1)xA=xB=x1 Q(A->B) = p(y_{B}|x_{1})---x_{A} = x_{B} = x_{1}
Q(A>C)=p(xCy1)yA=yC=y1 Q(A->C) = p(x_{C}|y_{1})---y_{A} = y_{C} = y_{1}
Q(A>D)=0 Q(A->D) = 0---其他
這裏的yBy_{B}就是y2y_{2},xCx_{C}就是x2x_{2},由此可得:
p(A)Q(A>B)=p(B)Q(B>A) p(A)Q(A->B) = p(B)Q(B->A)
p(A)Q(A>C)=p(C)Q(C>A) p(A)Q(A->C) = p(C)Q(C->A)
對於這樣的概率轉移Q,很容易驗證對於平面上任意兩點X和Y,滿足細緻平穩條件:
p(X)P(X>Y)=p(Y)P(Y>X) p(X)P(X->Y) = p(Y)P(Y->X)

什麼是細緻平穩條件?

假設向量v:
v=[0.6,0.4] v = [0.6,0.4]
和一個概率轉移矩陣P:
P=[0.70.30,80.2] P = \begin{bmatrix} 0.7&0.3 \\ 0,8& 0.2 \end{bmatrix}
當v與n個P相乘,n趨於無窮大時,發現最後得到的向量會收斂到一個穩定值:
limn>vpn=[0.73,0.27] \lim_{n->\infty }vp^{n} = [0.73,0.27]
代碼驗證:

import numpy as np

v = np.array([0.6, 0.4])

P = np.array([[0.7, 0.3],[0.8, 0.2]])

for n in range(1000):
    v = np.dot(v, P)
    print v

Out:
...
[0.72727273 0.27272727]
[0.72727273 0.27272727]

細緻平衡條件(Detailed Balance Condition):給定一個馬爾科夫鏈,分佈π和概率轉移矩陣P,如果下面等式成立
πiPij=πjPji π_{i}P_{ij} = π_{j}P_{ji}
則此馬爾科夫鏈具有一個平穩分佈(Stationary Distribution)π

回到上面,直觀理解就是從X點走到Y點,需要沿着座標軸輪換着走若干步,其路徑就是一條折線
最後這個二維空間的馬氏鏈會收斂到平穩分佈p(x,y)

最後,Gibbs Sampling算法的大概流程

  • 隨機初始化X0=x0X_{0}=x_{0},Y0=y0Y_{0}=y_{0}
  • 對t=0,1,2,…,循環採樣
    1、yt+1y_{t+1} ~ p(y|x_{t})
    2、xt+1x_{t+1} ~ p(x|y_{t+1})

馬氏鏈的轉換就是輪換着沿着x軸、y軸不斷走折線,得到樣本(x_{0},y_{0}),(x_{0},y_{1}),(x_{1},y_{1}),(x_{1},y_{2}),…,直到馬氏鏈收斂,也就是平穩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章