Gibbs采样原理介绍的文章有很多,但很少有Gibbs求解实际问题的例子。这篇博客通过三硬币问题,介绍如何用Gibbs采样求解实际问题。
题目(摘自李航《统计学习方法》):假设有3枚硬币,分别记做A,B,C。这些硬币正面出现的概率分别是π,p和q。进行如下掷硬币实验:先掷硬币A,根据其结果选出硬币B或C,正面选B,反面选硬币C;然后投掷选重中的硬币,出现正面记作1,反面记作0;独立地重复n次(n=10),观测结果如下:
1111110000
假设只能观察投掷硬币的结果,不能观测投掷硬币的过程,估计这三个参数π,p和q。
介绍贝塔分布(Beta distribution)之前,需要先明确一下先验概率分布、后验概率分布、似然函数以及共轭分布的概念。
如果某个事件发生的概率为 p p p,则独立重复 N N N次实验时,该事件发生次数 x x x的概率分布是二项分布,即 X ∼ B ( n , p ) X \thicksim B(n,p) X∼B(n,p)其概率密度函数为:
P ( X = k ) = C N k p k ( 1 − p ) n − k P(X=k) = C^{k}_N p^{k}(1-p)^{n-k} P(X=k)=CNkpk(1−p)n−k
Beta分布是一组定义在区间 [ 0 , 1 ] [0,1] [0,1]的连续概率分布,有两个参数 α \alpha α和 β \beta β,且 α , β > 0 \alpha,\beta > 0 α,β>0。Beta分布的概率密度函数:
B e t a ( p ∣ α , β ) = Γ ( α + β ) Γ ( α ) Γ ( β ) p α − 1 ( 1 − p ) β − 1 Beta(p|\alpha,\beta)=\frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)}p^{\alpha-1}(1-p)^{\beta-1} Beta(p∣α,β)=Γ(α)Γ(β)Γ(α+β)pα−1(1−p)β−1
记 B ( α , β ) = Γ ( α + β ) Γ ( α ) Γ ( β ) B(\alpha,\beta) = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)} B(α,β)=Γ(α)Γ(β)Γ(α+β),由概率定义: ∫ 0 1 B e t a ( p ∣ α , β ) = 1 \int^1_0{Beta(p|\alpha,\beta)} = 1 ∫01Beta(p∣α,β)=1可以得到:
Γ ( α + β ) Γ ( α ) Γ ( β ) = ∫ 0 1 B e t a ( p ∣ α , β ) B ( α , β ) = 1 B ( α , β ) \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)} =\frac{\int^1_0{Beta(p|\alpha,\beta)}}{B(\alpha,\beta)} = \frac{1}{B(\alpha,\beta)} Γ(α)Γ(β)Γ(α+β)=B(α,β)∫01Beta(p∣α,β)=B(α,β)1
Beta分布的期望为:
E ( B e t a ( p ∣ α , β ) ) = α α + β E(Beta(p|\alpha,\beta))=\frac{\alpha}{\alpha+\beta} E(Beta(p∣α,β))=α+βα
根据贝叶斯公式有:
后 验 概 率 = 似 然 函 数 × 先 验 概 率 后验概率=似然函数 \times 先验概率 后验概率=似然函数×先验概率
对于观测结果为 X = { x 1 , x 2 , … , x n } X=\{x_1,x_2,\dots,x_n\} X={x1,x2,…,xn}的二项分布,其似然函数为:
P ( X ∣ p ) = p k ( 1 − p ) n − k P(X|p)=p^{k}(1-p)^{n-k} P(X∣p)=pk(1−p)n−k
其中 k k k为事件发生的次数。
如果参数 p p p的先验概率分布为Beta分布,则有:
P ( p ∣ X ) = P ( X ∣ p ) P ( p ) ∫ P ( X ∣ p ) P ( p ) = P ( X ∣ p ) B e t a ( p ∣ α , β ) ∫ P ( X ∣ p ) B e t a ( p ∣ α , β ) d p = p k ( 1 − p ) n − k 1 B ( α , β ) p α − 1 ( 1 − p ) β − 1 ∫ p k ( 1 − p ) n − k 1 B ( α , β ) p α − 1 ( 1 − p ) β − 1 d p = p α + k − 1 ( 1 − p ) β + n − k − 1 ∫ p α + k − 1 ( 1 − p ) β + n − k − 1 d p = p α + k − 1 ( 1 − p ) β + n − k − 1 B ( α + k , β + n − k ) = B e t a ( p ∣ α + k , β + n − k ) \begin{aligned} P(p|X) & = \frac{P(X|p)P(p)}{\int{P(X|p)P(p)}} \\ & = \frac{P(X|p)Beta(p|\alpha,\beta)}{ \int{P(X|p)Beta(p|\alpha,\beta)}dp} \\ & = \frac{p^{k}(1-p)^{n-k} \frac{1}{B(\alpha,\beta)}p^{\alpha-1}(1-p)^{\beta-1}}{ \int{p^{k}(1-p)^{n-k} \frac{1}{B(\alpha,\beta)}p^{\alpha-1}(1-p)^{\beta-1}}dp } \\ & = \frac{ p^{\alpha + k -1}(1-p)^{\beta + n - k -1}}{ \int{ p^{\alpha + k -1}(1-p)^{\beta + n - k -1}}dp} \\ & = \frac{p^{\alpha + k -1}(1-p)^{\beta + n - k -1}}{B(\alpha+k,\beta+n-k)} \\ &=Beta(p|\alpha + k,\beta + n - k) \end{aligned} P(p∣X)=∫P(X∣p)P(p)P(X∣p)P(p)=∫P(X∣p)Beta(p∣α,β)dpP(X∣p)Beta(p∣α,β)=∫pk(1−p)n−kB(α,β)1pα−1(1−p)β−1dppk(1−p)n−kB(α,β)1pα−1(1−p)β−1=∫pα+k−1(1−p)β+n−k−1dppα+k−1(1−p)β+n−k−1=B(α+k,β+n−k)pα+k−1(1−p)β+n−k−1=Beta(p∣α+k,β+n−k)
P ( p ∣ X ) P(p|X) P(p∣X)与 P ( X ∣ p ) P(X|p) P(X∣p)都是Beta分布,因此Beta分布是二项分布的共轭先验分布。
记最终的观测结果为 x ⃗ = { x 1 , x 2 , … , x n } \vec{x}=\{x_1,x_2,\dots,x_n\} x={x1,x2,…,xn},每次观测结果使用的硬币为 z ⃗ = { z 1 , z 2 , … , z n } \vec{z}=\{z_1,z_2,\dots,z_n\} z={z1,z2,…,zn}
对于硬币k出现正反面符合伯努利分布,记作:
P ( x ∣ p k ) = p k x ( 1 − p k ) 1 − x P(x|p_k)=p_k^x(1-p_k)^{1-x} P(x∣pk)=pkx(1−pk)1−x
其中随机变量 x x x的取值为0、1。
使用概率图表示,三硬币问题的过程如下图所示:
这个概率图可以分解成两个主要过程
其中 θ → z ⃗ \theta \to \vec{z} θ→z 是二项分布,有:
P ( z ⃗ ∣ θ ) = θ k ( 1 − θ ) n − k P(\vec{z}|\theta) = \theta^{k}(1-\theta)^{n-k} P(z∣θ)=θk(1−θ)n−k
其中k为硬币A正面朝上的次数。
因 P ( z ⃗ ∣ θ ) ∼ B ( n , p A ) P(\vec{z}|\theta) \thicksim B(n,p_A) P(z∣θ)∼B(n,pA),可以取参数 θ ∼ B e t a ( θ ∣ α ⃗ ) \theta \thicksim Beta(\theta|\vec{\alpha}) θ∼Beta(θ∣α),组成Binomial-Beta共轭分布,则后验分布:
P ( θ ∣ z ⃗ ) ∼ B e t a ( θ ∣ α 1 + k , α 2 + n − k ) P(\theta|\vec{z}) \thicksim Beta(\theta|\alpha_1+k,\alpha_2+n-k) P(θ∣z)∼Beta(θ∣α1+k,α2+n−k)
P ( z ⃗ ∣ α ⃗ ) = ∫ P ( z ⃗ ∣ θ ) P ( θ ∣ α ⃗ ) d θ = ∫ θ k ( 1 − θ ) n − k B e t a ( θ ∣ α ⃗ ) d θ = ∫ θ k ( 1 − θ ) n − k 1 B ( α 1 , α 2 ) θ α 1 − 1 ( 1 − θ ) α 2 − 1 d θ = 1 B ( α 1 , α 2 ) ∫ θ k ( 1 − θ ) n − k θ α 1 − 1 ( 1 − θ ) α 2 − 1 d θ = B ( α 1 + k , α 2 + n − k ) B ( α 1 , α 2 ) \begin{aligned}P(\vec{z}|\vec{\alpha}) &= \int{P(\vec{z}|\theta)P(\theta|\vec{\alpha})}d\theta \\ &= \int{\theta^{k}(1-\theta)^{n-k} Beta(\theta|\vec{\alpha})}d\theta \\ &= \int{\theta^{k}(1-\theta)^{n-k} \frac{1}{B(\alpha_1,\alpha_2)} \theta^{\alpha_1-1}(1-\theta)^{\alpha_2-1} }d\theta \\ &= \frac{1}{B(\alpha_1,\alpha_2)} \int{\theta^{k}(1-\theta)^{n-k} \theta^{\alpha_1-1}(1-\theta)^{\alpha_2-1} }d\theta \\ &= \frac{B(\alpha_1 + k,\alpha_2 + n-k)}{B(\alpha_1,\alpha_2)} \end{aligned} P(z∣α)=∫P(z∣θ)P(θ∣α)dθ=∫θk(1−θ)n−kBeta(θ∣α)dθ=∫θk(1−θ)n−kB(α1,α2)1θα1−1(1−θ)α2−1dθ=B(α1,α2)1∫θk(1−θ)n−kθα1−1(1−θ)α2−1dθ=B(α1,α2)B(α1+k,α2+n−k)
有了参数的后验分布 P ( θ ∣ z ⃗ ) P(\theta|\vec{z}) P(θ∣z)之后,参数 θ \theta θ的合理取值可以是后验分布的极大值点或者参数在后验分布下的期望,此处取期望为参数的取值,则:
θ = E ( B e t a ( θ ∣ α 1 + k , α 2 + n − k ) ) = α 1 + k ( α 1 + k ) + ( α 2 + n − k ) \theta = E(Beta(\theta|\alpha_1+k,\alpha_2+n-k))=\frac{\alpha_1 + k}{(\alpha_1 + k) + (\alpha_2+n-k)} θ=E(Beta(θ∣α1+k,α2+n−k))=(α1+k)+(α2+n−k)α1+k
n 1 n_1 n1和 n 2 n_2 n2分别表示使用硬币B和硬币C的次数。
如果已知每次观测结果来自哪枚硬币,任何两次观测结果都是可交换的,将来自同一枚硬币的观测结果放在一起
x ⃗ ′ = ( x ⃗ B , x ⃗ C ) \vec{x}'=(\vec{x}_B,\vec{x}_C) x′=(xB,xC)
z ⃗ ′ = ( z ⃗ B , z ⃗ C ) \vec{z}'=(\vec{z}_B,\vec{z}_C) z′=(zB,zC)
同上可知,对于来自硬币k的观测结果,同上 P ( x ⃗ k ∣ ϕ k ) ∼ B ( n k , ϕ k ) P(\vec{x}_k|\phi_k) \thicksim B(n_k,\phi_k) P(xk∣ϕk)∼B(nk,ϕk),参数 ϕ k ∼ B e t a ( ϕ k ∣ β ⃗ k ) \phi_k \thicksim Beta(\phi_k|\vec{\beta}_k) ϕk∼Beta(ϕk∣βk),组成二项-Beta共轭分布,则后验分布:
P ( ϕ k ∣ x ⃗ k ) ∼ B e t a ( ϕ k ∣ β k , 1 + n k , 1 , ϕ k ∣ β k , 2 + n k , 2 ) P(\phi_k|\vec{x}_k) \thicksim Beta(\phi_k|\beta_{k,1} + n_{k,1},\phi_k|\beta_{k,2} + n_{k,2}) P(ϕk∣xk)∼Beta(ϕk∣βk,1+nk,1,ϕk∣βk,2+nk,2)
P ( x ⃗ k ∣ z ⃗ k , β ⃗ k ) = B ( β k , 1 + n k , 1 , β k , 2 + n k , 2 ) B ( β k , 1 , β k , 2 ) k ∈ { B , C } P(\vec{x}_k |\vec{z}_k, \vec{\beta}_{k}) = \frac{B(\beta_{k,1} + n_{k,1},\beta_{k,2} + n_{k,2})}{B(\beta_{k,1},\beta_{k,2})} \quad k \in \{B,C\} P(xk∣zk,βk)=B(βk,1,βk,2)B(βk,1+nk,1,βk,2+nk,2)k∈{B,C}
n k , 1 n_{k,1} nk,1、 n k , 2 n_{k,2} nk,2分别是k硬币出现正反面的次数
参数的值为:
ϕ k = β k , 1 + n k , 1 ( β k , 1 + n k , 1 ) + ( β k , 2 + n k , 2 ) \phi_{k} = \frac{\beta_{k,1} + n_{k,1}}{(\beta_{k,1} + n_{k,1}) +(\beta_{k,2} + n_{k,2})} ϕk=(βk,1+nk,1)+(βk,2+nk,2)βk,1+nk,1
因此有
P ( x ⃗ ∣ z ⃗ , β ⃗ ) = P ( x ⃗ ′ ∣ z ⃗ ′ , β ⃗ ′ ) = P ( x ⃗ B , x ⃗ C ∣ z ⃗ B , z ⃗ C , β ⃗ B , β ⃗ C ) = P ( x ⃗ B ∣ z ⃗ B , β ⃗ B ) P ( x ⃗ C ∣ z ⃗ C , β ⃗ C ) = B ( β B , 1 + k B , β B , 2 + n B − k B ) B ( β B , 1 , β B , 2 ) B ( β C , 1 + k C , β C , 2 + n C − k C ) B ( β C , 1 , β C , 2 ) \begin{aligned}P(\vec{x} |\vec{z}, \vec{\beta}) &=P(\vec{x}'|\vec{z}',\vec{\beta}') \\ &=P(\vec{x}_B,\vec{x}_C | \vec{z}_B,\vec{z}_C,\vec{\beta}_B,\vec{\beta}_C) \\ &= P(\vec{x}_B |\vec{z}_B, \vec{\beta}_B)P(\vec{x}_C |\vec{z}_C, \vec{\beta}_C) \\ &= \frac{B(\beta_{B,1} + k_B,\beta_{B,2} + n_B-k_B)}{B(\beta_{B,1},\beta_{B,2})} \frac{B(\beta_{C,1} + k_C,\beta_{C,2} + n_C-k_C)}{B(\beta_{C,1},\beta_{C,2})} \end{aligned} P(x∣z,β)=P(x′∣z′,β′)=P(xB,xC∣zB,zC,βB,βC)=P(xB∣zB,βB)P(xC∣zC,βC)=B(βB,1,βB,2)B(βB,1+kB,βB,2+nB−kB)B(βC,1,βC,2)B(βC,1+kC,βC,2+nC−kC)
结合以上公式,可以得到联合分布:
p ( x ⃗ , z ⃗ ∣ α ⃗ , β ⃗ ) = p ( z ⃗ ∣ α ⃗ ) p ( x ⃗ ∣ z ⃗ , β ⃗ ) = B ( α 1 + k , α 2 + n − k ) B ( α 1 , α 2 ) B ( β B , 1 + k B , β B , 2 + n B − k B ) B ( β B , 1 , β B , 2 ) B ( β C , 1 + k C , β C , 2 + n C − k C ) B ( β C , 1 , β C , 2 ) p(\vec{x},\vec{z}|\vec{\alpha},\vec{\beta}) = p(\vec{z} | \vec{\alpha})p(\vec{x} |\vec{z}, \vec{\beta})= \frac{B(\alpha_1 + k,\alpha_2 + n-k)}{B(\alpha_1,\alpha_2)} \frac{B(\beta_{B,1} + k_B,\beta_{B,2} + n_B-k_B)}{B(\beta_{B,1},\beta_{B,2})} \frac{B(\beta_{C,1} + k_C,\beta_{C,2} + n_C-k_C)}{B(\beta_{C,1},\beta_{C,2})} p(x,z∣α,β)=p(z∣α)p(x∣z,β)=B(α1,α2)B(α1+k,α2+n−k)B(βB,1,βB,2)B(βB,1+kB,βB,2+nB−kB)B(βC,1,βC,2)B(βC,1+kC,βC,2+nC−kC)
联合概率涉及到两个Binomial-Beta共轭结构。
有了联合分布 p ( x ⃗ , z ⃗ ∣ α ⃗ , β ⃗ ) p(\vec{x},\vec{z}|\vec{\alpha},\vec{\beta}) p(x,z∣α,β),就可以考虑使用Gibbs采样算法对这个分布进行采样。由于 x ⃗ \vec{x} x是观测到的已知变量,只有 z ⃗ \vec{z} z是隐含的变量。所以真正需要采样的是条件分 p ( z ⃗ ∣ x ⃗ ) p(\vec{z}|\vec{x}) p(z∣x)。根据Gibbs采样算法的要求,需要求得任意一个坐标轴i对应的条件分布 p ( z i = k ∣ z ⃗ ¬ i , x ⃗ ) p(z_i=k|\vec{z}_{\neg i},\vec{x}) p(zi=k∣z¬i,x)( ¬ i \neg i ¬i表示去掉i)。假设已经观测到词 w i = t w_i=t wi=t,根据贝叶斯公式可以得到:
p ( z i = k ∣ z ⃗ ¬ i , x ⃗ ) = p ( z i = k ∣ x i = t , z ⃗ ¬ i , x ⃗ ¬ i ) = p ( z i = k , x i = t ∣ z ⃗ ¬ i , x ⃗ ¬ i ) p ( x i = t ∣ z ⃗ ¬ i , x ⃗ ¬ i ) ∝ p ( z i = k , x i = t ∣ z ⃗ ¬ i , x ⃗ ¬ i ) \begin{aligned} p(z_i=k|\vec{z}_{\neg i},\vec{x}) &= p(z_i=k|x_i=t,\vec{z}_{\neg i},\vec{x}_{\neg i}) \\ &= \frac{p(z_i=k,x_i=t|\vec{z}_{\neg i},\vec{x}_{\neg i})}{p(x_i=t | \vec{z}_{\neg i},\vec{x}_{\neg i})} \\ & \propto p(z_i=k,x_i=t|\vec{z}_{\neg i},\vec{x}_{\neg i}) \end{aligned} p(zi=k∣z¬i,x)=p(zi=k∣xi=t,z¬i,x¬i)=p(xi=t∣z¬i,x¬i)p(zi=k,xi=t∣z¬i,x¬i)∝p(zi=k,xi=t∣z¬i,x¬i)
由于 z i = k , x i = t z_i=k,x_i=t zi=k,xi=t仅会影响 β ⃗ k → ϕ k → x i ∣ z i = k \vec{\beta}_k \to\phi_k \to x_i|z_i=k βk→ϕk→xi∣zi=k一个共轭结构,且仅影响某些计数,因此 θ \theta θ、 ϕ k \phi_k ϕk的后验分布仍然是Beta分布:
P ( θ ∣ z ⃗ ¬ i , x ⃗ ¬ i ) = B e t a ( θ ∣ α ⃗ + n ⃗ ¬ i ) P(\theta|\vec{z}_{\neg i},\vec{x}_{\neg i}) = Beta(\theta|\vec{\alpha} +\vec{n}_{\neg i}) P(θ∣z¬i,x¬i)=Beta(θ∣α+n¬i)
P ( ϕ k ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) ∼ B e t a ( ϕ k ∣ β ⃗ k + n ⃗ k , ¬ i ) P(\phi_{k}|\vec{z}_{k,\neg i},\vec{x}_{k,\neg i}) \thicksim Beta(\phi_k|\vec{\beta}_k + \vec{n}_{k,\neg i}) P(ϕk∣zk,¬i,xk,¬i)∼Beta(ϕk∣βk+nk,¬i)
去掉第i次观测值并不影响其他共轭结构,其他共轭结构与 z i = k , x i = t z_i=k,x_i=t zi=k,xi=t是独立的,因此:
p ( z i = k ∣ z ⃗ ¬ i , x ⃗ ) ∝ p ( z i = k , x i = t ∣ z ⃗ ¬ i , x ⃗ ¬ i ) = p ( z i = k , x i = t ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i , z ⃗ ¬ k , x ⃗ ¬ k ) = p ( z i = k , x i = t ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) \begin{aligned} p(z_i=k|\vec{z}_{\neg i},\vec{x}) & \propto p(z_i=k,x_i=t|\vec{z}_{\neg i},\vec{x}_{\neg i}) \\ &= p(z_i=k,x_i=t|\vec{z}_{k,\neg i},\vec{x}_{k,\neg i},\vec{z}_{\neg k},\vec{x}_{\neg k}) \\ &= p(z_i=k,x_i=t|\vec{z}_{k,\neg i},\vec{x}_{k,\neg i}) \end{aligned} p(zi=k∣z¬i,x)∝p(zi=k,xi=t∣z¬i,x¬i)=p(zi=k,xi=t∣zk,¬i,xk,¬i,z¬k,x¬k)=p(zi=k,xi=t∣zk,¬i,xk,¬i)
x ⃗ k , ¬ i \vec{x}_{k,\neg i} xk,¬i表示去除第i次观测所属k硬币的观测值。
所以,条件分布:
P ( z i = k ∣ z ⃗ ¬ i , x ⃗ ) ∝ p ( z i = k , x i = t ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) = ∫ P ( z i = k , x i = t , θ , ϕ k ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) d θ d ϕ k = ∫ P ( z i = k , θ ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) P ( x i = t , ϕ k ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) d θ d ϕ k = ∫ P ( z i = k , θ ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) d θ ∫ P ( x i = t , ϕ k ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) d ϕ k = ∫ P ( z i = k ∣ θ ) P ( θ k ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) d θ ∫ P ( x i = t ∣ ϕ k ) P ( ϕ k ∣ z ⃗ k , ¬ i , x ⃗ k , ¬ i ) d ϕ k = ∫ θ B e t a ( θ ∣ α k + n k , ¬ i ) d θ ∫ ϕ k B e t a ( ϕ k ∣ β k + n ⃗ k , ¬ i ) d ϕ k = E ( θ ) E ( ϕ k ) = θ ^ ϕ ^ k \begin{aligned} P(z_i=k|\vec{z}_{\neg i},\vec{x}) &\propto p(z_i=k,x_i=t|\vec{z}_{k,\neg i},\vec{x}_{k,\neg i}) \\ &= \int{P(z_i=k,x_i=t,\theta,\phi_{k}|\vec{z}_{k,\neg i},\vec{x}_{k,\neg i})}d \theta d\phi_{k} \\ &=\int{ P(z_i=k,\theta|\vec{z}_{k,\neg i},\vec{x}_{k,\neg i}) } P(x_i=t,\phi_{k}|\vec{z}_{k,\neg i},\vec{x}_{k,\neg i})d \theta d\phi_{k} \\ &= \int{ P(z_i=k,\theta |\vec{z}_{k,\neg i},\vec{x}_{k,\neg i}) } d\theta \int{P(x_i=t,\phi_k|\vec{z}_{k,\neg i},\vec{x}_{k,\neg i})}d\phi_{k} \\ &= \int{ P(z_i=k|\theta )P(\theta_{k} |\vec{z}_{k,\neg i},\vec{x}_{k,\neg i}) } d\theta \int{P(x_i=t|\phi_{k} )P(\phi_{k} |\vec{z}_{k,\neg i},\vec{x}_{k,\neg i})}d\phi_{k} \\ &= \int{\theta Beta(\theta |\alpha_k +n_{k,\neg i})}d\theta \int{\phi_{k}Beta(\phi_{k}|\beta_{k} + \vec{n}_{k,\neg i})}d\phi_{k} \\ & =E(\theta)E(\phi_{k})\\ &=\hat{\theta}\hat{\phi}_{k} \end{aligned} P(zi=k∣z¬i,x)∝p(zi=k,xi=t∣zk,¬i,xk,¬i)=∫P(zi=k,xi=t,θ,ϕk∣zk,¬i,xk,¬i)dθdϕk=∫P(zi=k,θ∣zk,¬i,xk,¬i)P(xi=t,ϕk∣zk,¬i,xk,¬i)dθdϕk=∫P(zi=k,θ∣zk,¬i,xk,¬i)dθ∫P(xi=t,ϕk∣zk,¬i,xk,¬i)dϕk=∫P(zi=k∣θ)P(θk∣zk,¬i,xk,¬i)dθ∫P(xi=t∣ϕk)P(ϕk∣zk,¬i,xk,¬i)dϕk=∫θBeta(θ∣αk+nk,¬i)dθ∫ϕkBeta(ϕk∣βk+nk,¬i)dϕk=E(θ)E(ϕk)=θ^ϕ^k
因:
θ ^ = n ( k , ¬ i ) , 1 + α 1 ( n ( k , ¬ i ) , 1 + α 1 ) + n ( k , ¬ i ) , 2 + α 2 \hat{\theta} = \frac{n_{(k,\neg i),1} + \alpha_1}{(n_{(k,\neg i),1} + \alpha_1)+n_{(k,\neg i),2} + \alpha_2} θ^=(n(k,¬i),1+α1)+n(k,¬i),2+α2n(k,¬i),1+α1
ϕ ^ k = β k , 1 + n ( k , ¬ i ) , 1 ( β k , 1 + n ( k , ¬ i ) , 1 ) + ( β k , 2 + n ( k , ¬ i ) , 2 ) k = B , C \hat{\phi}_{k} = \frac{\beta_{k,1} + n_{(k,\neg i),1}}{(\beta_{k,1} + n_{(k,\neg i),1}) +(\beta_{k,2} + n_{(k,\neg i),2})} \quad k = B,C ϕ^k=(βk,1+n(k,¬i),1)+(βk,2+n(k,¬i),2)βk,1+n(k,¬i),1k=B,C
于是,得到最终模型的Gibbs采样公式:
P ( z = k ∣ z ⃗ ¬ i , x ⃗ ) ∝ n ( k , ¬ i ) , 1 + α 1 ( n ( k , ¬ i ) , 1 + α 1 ) + n ( k , ¬ i ) , 2 + α 2 ⋅ β k , 1 + n ( k , ¬ i ) , 1 ( β k , 1 + n ( k , ¬ i ) , 1 ) + ( β k , 2 + n ( k , ¬ i ) , 2 ) k = B , C P(z=k|\vec{z}_{\neg i},\vec{x}) \propto \frac{n_{(k,\neg i),1} + \alpha_1}{(n_{(k,\neg i),1} + \alpha_1)+n_{(k,\neg i),2} + \alpha_2} \cdot \frac{\beta_{k,1} + n_{(k,\neg i),1}}{(\beta_{k,1} + n_{(k,\neg i),1}) +(\beta_{k,2} + n_{(k,\neg i),2})} \quad k=B,C P(z=k∣z¬i,x)∝(n(k,¬i),1+α1)+n(k,¬i),2+α2n(k,¬i),1+α1⋅(βk,1+n(k,¬i),1)+(βk,2+n(k,¬i),2)βk,1+n(k,¬i),1k=B,C
import random
K = 2 #最终观测结果来自的硬币个数
V = 2 #观测结果的取值个数(0,1)
X = [1,1,1,1,1,1,0,0,0,0] #观测结果
N = len(X) #观测次数
Z= [0] * N #每次观测结果对应的硬币编号
nz=[0,0] #cnz[i]硬币A掷出i面的次数(使用硬币i的次数)
nxz=[[0,0],[0,0]] #nzx[i][j] 观测结果为i来自j硬币的次数
nxsum = N #观测总次数
p=[0,0] #gibbs采样条件概率分布
alpha = 1 #硬币A Beta分布的 alpha、beta超参数,这里直接取<1,1>
beta=1 #硬币i Beta分布的 alpha、beta超参数,这里直接取<1,1>
max_iter = 100 #迭代次数
def init_params():
# 对Z进行随机初始化
for i in range(N) :
prob = random.random()
if prob > 0.5:
Z[i] = 1
else:
Z[i] = 0
# 统计
for x,z in zip(X,Z):
nxz[x][z] += 1
nz[z] += 1
def sample():
for cur_iter in range(max_iter):
for i,x in enumerate(X,0):
#去除观测结果i之后的计数
z = Z[i]
nz[z] -= 1
nxz[x][z] -= 1
global nxsum
nxsum -= 1
#计算条件分布
for k in range(K):
p[k] = (nxz[x][k] + beta)/(nz[k] + V * beta)*(nz[k] + alpha)/(nxsum + K * alpha)
#采样
for k in range(1,K):
p[k] = p[k-1] + p[k]
prob = random.random() * p[-1] #这里要进行归一化
for k in range(K):
if prob < p[k]:
z = k
break
nz[z] += 1
nxz[x][z] += 1
nxsum += 1
Z[i] = z
init_params()
sample()
print((nz[1] + alpha)/(nxsum + K * alpha)) #硬币A正面朝上的概率
print((nxz[1][1] + beta)/(nz[1] + V * beta)) #硬币B正面朝上的概率
print((nxz[0][1] + beta)/(nz[0] + V * beta)) #硬币C正面朝上的概率