三硬币问题建模及Gibbs采样求解(Python实现)

大纲

  • 三硬币问题建模及Gibbs采样求解(Python实现)
    • 三硬币问题
    • 二项分布与Beta分布
      • 基础概念
      • 二项分布
      • Beta分布
      • 二项分布-Beta分布
    • 三硬币问题建模过程
    • Gibbs 采样求解
    • python 实现
    • 参考

三硬币问题建模及Gibbs采样求解(Python实现)

Gibbs采样原理介绍的文章有很多,但很少有Gibbs求解实际问题的例子。这篇博客通过三硬币问题,介绍如何用Gibbs采样求解实际问题。

三硬币问题

题目(摘自李航《统计学习方法》):假设有3枚硬币,分别记做A,B,C。这些硬币正面出现的概率分别是π,p和q。进行如下掷硬币实验:先掷硬币A,根据其结果选出硬币B或C,正面选B,反面选硬币C;然后投掷选重中的硬币,出现正面记作1,反面记作0;独立地重复n次(n=10),观测结果如下:

1111110000

假设只能观察投掷硬币的结果,不能观测投掷硬币的过程,估计这三个参数π,p和q。

二项分布与Beta分布

基础概念

介绍贝塔分布(Beta distribution)之前,需要先明确一下先验概率分布、后验概率分布、似然函数以及共轭分布的概念。

  • 先验概率分布:在尚未获取某些信息或者依据前,根据过去历史资料或者人的主观经验对随机变量 X X X概率分布的估计。
  • 后验概率分布:通过调查或其它方式获取新的附加信息,利用贝叶斯公式对先验概率进行修正,而后得到的条件概率。
  • 似然函数分布:是一个自变量是统计模型的参数的函数。
  • 共轭分布:后验概率分布函数与先验概率分布函数具有相同形式。

二项分布

如果某个事件发生的概率为 p p p,则独立重复 N N N次实验时,该事件发生次数 x x x的概率分布是二项分布,即 X ∼ B ( n , p ) X \thicksim B(n,p) XB(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(1p)nk

Beta分布

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(1p)β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α,β))=α+βα

二项分布-Beta分布

根据贝叶斯公式有:

后 验 概 率 = 似 然 函 数 × 先 验 概 率 后验概率=似然函数 \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(Xp)=pk(1p)nk

其中 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(pX)=P(Xp)P(p)P(Xp)P(p)=P(Xp)Beta(pα,β)dpP(Xp)Beta(pα,β)=pk(1p)nkB(α,β)1pα1(1p)β1dppk(1p)nkB(α,β)1pα1(1p)β1=pα+k1(1p)β+nk1dppα+k1(1p)β+nk1=B(α+k,β+nk)pα+k1(1p)β+nk1=Beta(pα+k,β+nk)

P ( p ∣ X ) P(p|X) P(pX) P ( X ∣ p ) P(X|p) P(Xp)都是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(xpk)=pkx(1pk)1x

其中随机变量 x x x的取值为0、1。

使用概率图表示,三硬币问题的过程如下图所示:
三硬币问题建模及Gibbs采样求解(Python实现)_第1张图片
这个概率图可以分解成两个主要过程

  1. α ⃗ → θ → z m \vec{\alpha} \to\theta \to z_m α θzm:投掷硬币A,生成观测结果中第m次观测结果所使用的硬币编号。
  2. β ⃗ → ϕ k → x m ∣ z m = k \vec{\beta} \to \phi_k \to x_m|z_m=k β ϕkxmzm=k:生成第m次观测结果时,首先选择编号为k的硬币,然后投掷这枚硬币,生成观测结果 x m x_m xm

其中 θ → 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θ)nk

其中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+nk)

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θ)nkBeta(θα )dθ=θk(1θ)nkB(α1,α2)1θα11(1θ)α21dθ=B(α1,α2)1θk(1θ)nkθα11(1θ)α21dθ=B(α1,α2)B(α1+k,α2+nk)

有了参数的后验分布 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+nk))=(α1+k)+(α2+nk)α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 =(x B,x C)

z ⃗ ′ = ( z ⃗ B , z ⃗ C ) \vec{z}'=(\vec{z}_B,\vec{z}_C) z =(z B,z C)

同上可知,对于来自硬币k的观测结果,同上 P ( x ⃗ k ∣ ϕ k ) ∼ B ( n k , ϕ k ) P(\vec{x}_k|\phi_k) \thicksim B(n_k,\phi_k) P(x kϕk)B(nk,ϕk),参数 ϕ k ∼ B e t a ( ϕ k ∣ β ⃗ k ) \phi_k \thicksim Beta(\phi_k|\vec{\beta}_k) ϕkBeta(ϕ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(ϕkx k)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(x kz k,β 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(x B,x Cz B,z C,β B,β C)=P(x Bz B,β B)P(x Cz C,β C)=B(βB,1,βB,2)B(βB,1+kB,βB,2+nBkB)B(βC,1,βC,2)B(βC,1+kC,βC,2+nCkC)

结合以上公式,可以得到联合分布:

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+nk)B(βB,1,βB,2)B(βB,1+kB,βB,2+nBkB)B(βC,1,βC,2)B(βC,1+kC,βC,2+nCkC)

联合概率涉及到两个Binomial-Beta共轭结构。

Gibbs 采样求解

有了联合分布 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=kz ¬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=kz ¬i,x )=p(zi=kxi=t,z ¬i,x ¬i)=p(xi=tz ¬i,x ¬i)p(zi=k,xi=tz ¬i,x ¬i)p(zi=k,xi=tz ¬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ϕkxizi=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(ϕkz k,¬i,x k,¬i)Beta(ϕkβ k+n k,¬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=kz ¬i,x )p(zi=k,xi=tz ¬i,x ¬i)=p(zi=k,xi=tz k,¬i,x k,¬i,z ¬k,x ¬k)=p(zi=k,xi=tz k,¬i,x k,¬i)

x ⃗ k , ¬ i \vec{x}_{k,\neg i} x k,¬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=kz ¬i,x )p(zi=k,xi=tz k,¬i,x k,¬i)=P(zi=k,xi=t,θ,ϕkz k,¬i,x k,¬i)dθdϕk=P(zi=k,θz k,¬i,x k,¬i)P(xi=t,ϕkz k,¬i,x k,¬i)dθdϕk=P(zi=k,θz k,¬i,x k,¬i)dθP(xi=t,ϕkz k,¬i,x k,¬i)dϕk=P(zi=kθ)P(θkz k,¬i,x k,¬i)dθP(xi=tϕk)P(ϕkz k,¬i,x k,¬i)dϕk=θBeta(θαk+nk,¬i)dθϕkBeta(ϕkβk+n k,¬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=kz ¬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

python 实现

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正面朝上的概率

参考

  1. 李航《统计学习方法》
  2. GibbsLDA++ 源码
  3. 靳志辉《LDA数学八卦》

你可能感兴趣的:(机器学习,python)