EM

【大道至简】机器学习算法之EM算法(Expectation Maximization Algorithm)详解(附代码)---通俗理解EM算法。 通过上面的分析,我们终于可以总结一下EM算法啦!总的来说,EM算法分为E步和M步:(1)给参数θ即第0步赋初值;(2)如果是第一轮迭代,那么令θ=来计算Q函数;如果是>1轮迭代,则θ的值由上一次M步计算出的θ值决定。由于E步时θ已知,所以只需要计算Q,公式如下:也就是给定θ和已知的观测数据x的条件下,求一下隐变量z的条件概率。(3)根据E步计算出来的Q,按如下公式计算θ:也就是固定Q(z也固定)和已知的观测数据x,算一下θ。(4)重复(3)和(4)直至收敛。 阅读详情

前言

EM算法是机器学习十大算法之一,它很简单,但是也同样很有深度,简单是因为它就分两步求解问题,

  • E步:求期望(expectation)
  • M步:求极大(maximization)

深度在于它的数学推理涉及到比较繁杂的概率公式等,所以本文会介绍很多概率方面的知识,不懂的同学可以先去了解一些知识,当然本文也会尽可能的讲解清楚这些知识,讲的不好的地方麻烦大家评论指出,后续不断改进完善。

EM算法引入

概率模型有时候既含有观测变量,又含有隐变量或潜在变量,如果概率模型的变量都是观测变量,那么给定数据,可以直接用极大似然估计法,或贝叶斯估计方法估计模型参数,但是当模型含有隐变量时,就不能简单的使用这些方法,EM算法就是含有隐变量的概率模型参数的极大似然估计法,或极大后验概率估计法,我们讨论极大似然估计,极大后验概率估计与其类似。
参考统计学习方法书中的一个例子来引入EM算法, 假设有3枚硬币,分别记做A、B、C,这些硬币正面出现的概率分别是 π \pi π、 p p p、 q q q,进行如下实验:

  • 先掷硬币A,根据结果选出硬币B和硬币C,正面选硬币B,反面选硬币C

  • 通过选择出的硬币,掷硬币的结果出现正面为1,反面为0
    如此独立地重复n次实验,我们当前规定n=10,则10次的结果如下所示:
    1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 1 1,1,0,1,0,0,1,0,1,1 1,1,0,1,0,0,1,0,1,1
    假设只通过观测到掷硬币的结果,不能观测掷硬币的过程,问如何估计三个硬币出现正面的概率?
    我们来构建这样一个三硬币模型:
    P ( y ∣ θ ) = ∑ z P ( y , z ∣ θ ) = ∑ z P ( z ∣ θ ) P ( y ∣ z , θ ) = π p y ( 1 − p ) 1 − y + ( 1 − π ) q y ( 1 − q ) 1 − y \begin{aligned} P(y|\theta) &=\sum_{z}P(y,z|\theta)=\sum_{z}P(z|\theta)P(y|z,\theta) \\ &=\pi p^{y}(1-p)^{1-y}+(1-\pi)q^{y}(1-q)^{1-y} \end{aligned} P(y∣θ)​=z∑​P(y,z∣θ)=z∑​P(z∣θ)P(y∣z,θ)=πpy(1−p)1−y+(1−π)qy(1−q)1−y​

  • 若 y = 1 y=1 y=1,表示这此看到的是正面,这个正面有可能是B的正面,也可能是C的正面,则 P ( 1 ∣ θ ) = π p + ( 1 − π ) q P(1|\theta)=\pi p+(1-\pi)q P(1∣θ)=πp+(1−π)q

  • 若 y = 0 y=0 y=0,则 P ( 0 ∣ θ ) = π ( 1 − p ) + ( 1 − π ) ( 1 − q ) P(0|\theta)=\pi (1-p)+(1-\pi)(1-q) P(0∣θ)=π(1−p)+(1−π)(1−q)

y是观测变量,表示一次观测结果是1或0,z是隐藏变量,表示掷硬币A的结果,这个是观测不到结果的, θ = ( π , p , q ) \theta=(\pi,p,q) θ=(π,p,q)表示模型参数,将观测数据表示为 Y = ( Y 1 , Y 2 , . . . , Y n ) T Y=(Y_1,Y_2,...,Y_n)^{T} Y=(Y1​,Y2​,...,Yn​)T,未观测的数据表示为 Z = ( Z 1 , Z 2 , . . . , Z n ) T Z=(Z_1,Z_2,...,Z_n)^{T} Z=(Z1​,Z2​,...,Zn​)T,则观测函数的似然函数是:
P ( Y ∣ θ ) = ∑ Z P ( Z ∣ θ ) P ( Y ∣ Z , θ ) = ∏ i = 0 ( π p y i ( 1 − p ) 1 − y i + ( 1 − π ) q y i ( 1 − q ) 1 − y i ) \begin{aligned} P(Y|\theta)&=\sum_{Z}P(Z|\theta)P(Y|Z,\theta)\\ &=\prod_{i=0} ( \pi p^{y_i}(1-p)^{1-y_{i}}+(1-\pi)q^{y_{i}}(1-q)^{1-y_{i}}) \end{aligned} P(Y∣θ)​=Z∑​P(Z∣θ)P(Y∣Z,θ)=i=0∏​(πpyi​(1−p)1−yi​+(1−π)qyi​(1−q)1−yi​)​
考虑求模型参数 θ = ( π , p , q ) \theta=(\pi,p,q) θ=(π,p,q)的极大似然估计,即:
θ ^ = a r g max ⁡ θ l o g P ( Y ∣ θ ) \hat{\theta}=arg\max_{\theta}logP(Y|\theta) θ^=argθmax​logP(Y∣θ)
这个问题没有解析解,只有通过迭代方法来求解,EM算法就是可以用于求解这个问题的一种迭代算法,下面给出EM算法的迭代过程:

  • 首先选取初始值,记做 θ 0 = ( π 0 , p 0 , q 0 ) \theta^{0}=(\pi^{0},p^{0},q^{0}) θ0=(π0,p0,q0),第i次的迭代参数的估计值为 θ i = ( π i , p i , q i ) \theta^{i}=(\pi^{i},p^{i},q^{i}) θi=(πi,pi,qi)

  • E步:计算在模型参数 π i , p i , q i \pi^{i},p^{i},q^{i} πi,pi,qi下观测变量 y i y_i yi​来源于硬币B的概率:
    μ i + 1 = π i ( p i ) y i ( 1 − p i ) 1 − y i π i ( p i ) y i ( 1 − p i ) 1 − y i + ( 1 − π i ) ( q i ) y i ( 1 − p i ) 1 − y i \mu^{i+1}=\frac{\pi^{i}(p^{i})^{y_i}(1-p^i)^{1-y_i}}{\pi^{i}(p^{i})^{y_i}(1-p^i)^{1-y_i}+(1-\pi^{i})(q^{i})^{y_i}(1-p^i)^{1-y_i}} μi+1=πi(pi)yi​(1−pi)1−yi​+(1−πi)(qi)yi​(1−pi)1−yi​πi(pi)yi​(1−pi)1−yi​​
    备注一下:这个公式的分母是 P ( Y ∣ θ ) P(Y|\theta) P(Y∣θ),分子表示是来源与B硬币的概率。

  • M步:计算模型参数的新估计值:
    π i + 1 = 1 n ∑ j = 1 n μ j i + 1 \pi^{i+1}=\frac{1}{n}\sum_{j=1}^{n}\mu_{j}^{i+1} πi+1=n1​j=1∑n​μji+1​
    因为B硬币A硬币出现正面的结果,所以A硬币概率就是 μ j \mu_{j} μj​的平均值。
    p i + 1 = ∑ j = 1 n μ j i + 1 y j ∑ j = 1 n μ j i + 1 p^{i+1}=\frac{\sum_{j=1}^{n}\mu_{j}^{i+1}y_j}{\sum_{j=1}^{n}\mu_{j}^{i+1}} pi+1=∑j=1n​μji+1​∑j=1n​μji+1​yj​​
    分子乘以 y i y_{i} yi​,所以其实是计算B硬币出现正面的概率。
    q i + 1 = ∑ j = 1 n ( 1 − μ j i + 1 ) y j ∑ j = 1 n ( 1 − μ j i + 1 ) q^{i+1}=\frac{\sum_{j=1}^{n}(1-\mu_{j}^{i+1})y_j}{\sum_{j=1}^{n}(1-\mu_{j}^{i+1})} qi+1=∑j=1n​(1−μji+1​)∑j=1n​(1−μji+1​)yj​​
    ( 1 − μ j i + 1 ) (1-\mu_{j}^{i+1}) (1−μji+1​)表示出现C硬币的概率。

闭环形成,从 P ( Y ∣ θ ) P(Y|\theta) P(Y∣θ) 到 π 、 p 、 q \pi、p、q π、p、q一个闭环流程,接下来可以通过迭代法来做完成。针对上述例子,我们假设初始值为 π 0 = 0.5 , p 0 = 0.5 , q 0 = 0.5 \pi^{0}=0.5,p^{0}=0.5,q^{0}=0.5 π0=0.5,p0=0.5,q0=0.5,因为对 y i = 1 y_i=1 yi​=1和 y i = 0 y_i=0 yi​=0均有 μ j 1 = 0.5 \mu_j^{1}=0.5 μj1​=0.5,利用迭代公式计算得到 π 1 = 0.5 , p 1 = 0.6 , q 1 = 0.6 \pi^{1}=0.5,p^{1}=0.6,q^{1}=0.6 π1=0.5,p1=0.6,q1=0.6,继续迭代得到最终的参数:
π 0 ^ = 0.5 , p 0 ^ = 0.6 , q 0 ^ = 0.6 \widehat{\pi^{0}}=0.5,\widehat{p^{0}}=0.6,\widehat{q^{0}}=0.6 π0 =0.5,p0 ​=0.6,q0 ​=0.6
如果一开始初始值选择为: π 0 = 0.4 , p 0 = 0.6 , q 0 = 0.7 \pi^{0}=0.4,p^{0}=0.6,q^{0}=0.7 π0=0.4,p0=0.6,q0=0.7,那么得到的模型参数的极大似然估计是 π ^ = 0.4064 , p ^ = 0.5368 , q ^ = 0.6432 \widehat{\pi}=0.4064,\widehat{p}=0.5368,\widehat{q}=0.6432 π =0.4064,p ​=0.5368,q ​=0.6432,这说明EM算法与初值的选择有关,选择不同的初值可能得到不同的参数估计值。

这个例子中你只观察到了硬币抛完的结果,并不了解A硬币抛完之后,是选择了B硬币抛还是C硬币抛,这时候概率模型就存在着隐含变量!

EM算法

输入:观测变量数据Y,隐变量数据Z,联合分布 P ( Y , Z ∣ θ ) P(Y,Z|\theta) P(Y,Z∣θ),条件分布 P ( Z ∣ Y , θ ) P(Z|Y,\theta) P(Z∣Y,θ);
输出:模型参数 θ \theta θ

  • (1)选择参数的初值 θ 0 \theta^0 θ0,开始迭代

  • (2) E步:记 θ i \theta^i θi为第i次迭代参数 θ \theta θ的估计值,在第i+1次迭代的E步,计算
    Q ( θ , θ i ) = E Z [ l o g P ( Y , Z ∣ θ ) ∣ Y , θ i ] = ∑ Z l o g P ( Y , Z ∣ θ ) P ( Z ∣ Y , θ i ) \begin{aligned} Q(\theta,\theta^i)&=E_{Z}[logP(Y,Z|\theta)|Y,\theta^i]\\ &=\sum_{Z}logP(Y,Z|\theta)P(Z|Y,\theta^i) \end{aligned} Q(θ,θi)​=EZ​[logP(Y,Z∣θ)∣Y,θi]=Z∑​logP(Y,Z∣θ)P(Z∣Y,θi)​
    这里, P ( Z ∣ Y , θ i ) P(Z|Y,\theta^i) P(Z∣Y,θi)是在给定观测数据Y和当前的参数估计 θ i \theta^i θi下隐变量数据Z的条件概率分布;

  • (3) M步:求使 Q ( θ , θ i ) Q(\theta,\theta^i) Q(θ,θi)极大化的 θ \theta θ,确定第i+1次迭代的参数的估计值 θ i + 1 \theta^{i+1} θi+1,
    θ i + 1 = a r g max ⁡ θ Q ( θ , θ i ) \theta^{i+1}=arg \max \limits_{\theta}Q(\theta,\theta^{i}) θi+1=argθmax​Q(θ,θi)
    Q ( θ , θ i ) Q(\theta,\theta^{i}) Q(θ,θi)是EM算法的核心,称为Q函数(Q function),这个是需要自己构造的。

  • (4) 重复第(2)步和第(3)步,直到收敛,收敛条件:
    ∣ ∣ θ i + 1 − θ i ∣ ∣ < ε 1 || \theta^{i+1}-\theta^{i} || < \varepsilon_1 ∣∣θi+1−θi∣∣<ε1​
    或者:
    ∣ ∣ Q ( θ i + 1 , θ i ) − Q ( θ i , θ i ) ∣ ∣ < ε 2 ||Q(\theta^{i+1},\theta^{i})-Q(\theta^{i},\theta^{i})|| <\varepsilon_2 ∣∣Q(θi+1,θi)−Q(θi,θi)∣∣<ε2​
    收敛迭代就结束了。我们来拆解一下这个M步骤,

推导逼近

主要讲解Jensen不等式,这个公式在推导和收敛都用到,主要是如下的结论:

  • f ( x ) f(x) f(x)是凸函数
    f ( E ( X ) ) ≤ E ( f ( x ) ) f(E(X)) \le E(f(x)) f(E(X))≤E(f(x))
  • f ( x ) f(x) f(x)是凹函数
    f ( E ( X ) ) ≥ E ( f ( x ) ) f(E(X)) \ge E(f(x)) f(E(X))≥E(f(x))

推导出Em算法可以近似实现对观测数据的极大似然估计的办法是找到E步骤的下界,让下届最大,通过逼近的方式实现对观测数据的最大似然估计。统计学习基础中采用的是相减方式,我们来看下具体的步骤。

  • 增加隐藏变量
    L ( θ ) = ∑ Z l o g P ( Y ∣ Z , θ ) P ( Z , θ ) L(\theta)=\sum_{Z}logP(Y|Z,\theta)P(Z,\theta) L(θ)=Z∑​logP(Y∣Z,θ)P(Z,θ)
    则 L ( θ ) − L ( θ i ) L(\theta)-L(\theta^{i}) L(θ)−L(θi)为:
    L ( θ ) − L ( θ i ) = l o g ( ∑ Z P ( Y ∣ Z , θ i ) P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Y ∣ Z , θ i ) ) − L ( θ i ) ≥ ∑ Z P ( Y ∣ Z , θ i ) l o g ( P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Y ∣ Z , θ i ) ) − L ( θ i ) \begin{aligned} L(\theta)-L(\theta^{i})=log(\sum_{Z} P(Y|Z,\theta^i)\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Y|Z,\theta^i)})-L(\theta^{i})\\ \ge \sum_{Z} P(Y|Z,\theta^i)log(\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Y|Z,\theta^i)})-L(\theta^{i}) \end{aligned} L(θ)−L(θi)=log(Z∑​P(Y∣Z,θi)P(Y∣Z,θi)P(Y∣Z,θ)P(Z,θ)​)−L(θi)≥Z∑​P(Y∣Z,θi)log(P(Y∣Z,θi)P(Y∣Z,θ)P(Z,θ)​)−L(θi)​
    ≥ \ge ≥这一个步骤就是采用了凹函数的Jensen不等式做转换。因为 Z Z Z是隐藏变量,所以有 ∑ Z P ( Y ∣ Z , θ i ) = = 1 , P ( Y ∣ Z , θ i ) > 0 \sum_{Z} P(Y|Z,\theta^i)==1,P(Y|Z,\theta^i)>0 ∑Z​P(Y∣Z,θi)==1,P(Y∣Z,θi)>0,于是继续变:

L ( θ ) − L ( θ i ) = l o g ( ∑ Z P ( Y ∣ Z , θ i ) P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Y ∣ Z , θ i ) ) − L ( θ i ) ≥ ∑ Z P ( Z ∣ Y , θ i ) l o g ( P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Z ∣ Y , θ i ) ) − L ( θ i ) = ∑ Z P ( Z ∣ Y , θ i ) l o g ( P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Z ∣ Y , θ i ) ) − ∑ Z P ( Z ∣ Y , θ i ) L ( θ i ) = ∑ Z P ( Z ∣ Y , θ i ) l o g ( P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Z ∣ Y , θ i ) ( P ( Y ∣ θ i ) ) ≥ 0 \begin{aligned} L(\theta)-L(\theta^{i})&=log(\sum_{Z} P(Y|Z,\theta^i)\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Y|Z,\theta^i)})-L(\theta^{i})\\ &\ge \sum_{Z} P(Z|Y,\theta^i)log(\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Z|Y,\theta^i)})-L(\theta^{i})\\ &=\sum_{Z} P(Z|Y,\theta^i)log(\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Z|Y,\theta^i)})-\sum_{Z} P(Z|Y,\theta^i)L(\theta^{i})\\ &= \sum_{Z} P(Z|Y,\theta^i)log(\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Z|Y,\theta^i) (P(Y|\theta^{i})}) \\ & \ge0 \end{aligned} L(θ)−L(θi)​=log(Z∑​P(Y∣Z,θi)P(Y∣Z,θi)P(Y∣Z,θ)P(Z,θ)​)−L(θi)≥Z∑​P(Z∣Y,θi)log(P(Z∣Y,θi)P(Y∣Z,θ)P(Z,θ)​)−L(θi)=Z∑​P(Z∣Y,θi)log(P(Z∣Y,θi)P(Y∣Z,θ)P(Z,θ)​)−Z∑​P(Z∣Y,θi)L(θi)=Z∑​P(Z∣Y,θi)log(P(Z∣Y,θi)(P(Y∣θi)P(Y∣Z,θ)P(Z,θ)​)≥0​
也就是: L ( θ ) ≥ L ( θ i ) + ∑ Z P ( Z ∣ Y , θ i ) l o g ( P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Y ∣ Z , θ i ) L ( θ i ) ) L(\theta)\ge L(\theta^{i})+ \sum_{Z} P(Z|Y,\theta^i)log(\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Y|Z,\theta^i) L(\theta^{i})}) L(θ)≥L(θi)+∑Z​P(Z∣Y,θi)log(P(Y∣Z,θi)L(θi)P(Y∣Z,θ)P(Z,θ)​),有下界,最大化下界,来得到近似值。这里有一个细节: P ( Y ∣ Z , θ i ) P(Y|Z,\theta^i) P(Y∣Z,θi) 变为 P ( Z ∣ Y , θ i ) P(Z|Y,\theta^i) P(Z∣Y,θi)?如果要满足Jensen不等式的等号,则有:
P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Y ∣ Z , θ i ) = c \frac{P(Y|Z,\theta)P(Z,\theta)}{P(Y|Z,\theta^i)} = c P(Y∣Z,θi)P(Y∣Z,θ)P(Z,θ)​=c
c为一个常数,而 ∑ Z P ( Y ∣ Z , θ i ) = 1 \sum_{Z}P(Y|Z,\theta^i)=1 ∑Z​P(Y∣Z,θi)=1则:
∑ Z P ( Y ∣ Z , θ ) P ( Z , θ ) = c ∑ Z P ( Y ∣ Z , θ i ) = c = P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Y ∣ Z , θ i ) P ( Y ∣ Z , θ ) = P ( Y ∣ Z , θ ) P ( Z , θ ) ∑ Z P ( Y ∣ Z , θ ) P ( Z , θ ) = P ( Y , Z , θ ) P ( Y , θ ) = P ( Z ∣ Y , θ ) \begin{aligned} \sum_{Z}P(Y|Z,\theta)P(Z,\theta)= c\sum_{Z}P(Y|Z,\theta^i)&=c\\ &=\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Y|Z,\theta^i)}\\ P(Y|Z,\theta)=\frac{P(Y|Z,\theta)P(Z,\theta)}{\sum_{Z}P(Y|Z,\theta)P(Z,\theta)}=\frac{P(Y,Z,\theta)}{P(Y,\theta)}=P(Z|Y,\theta) \end{aligned} Z∑​P(Y∣Z,θ)P(Z,θ)=cZ∑​P(Y∣Z,θi)P(Y∣Z,θ)=∑Z​P(Y∣Z,θ)P(Z,θ)P(Y∣Z,θ)P(Z,θ)​=P(Y,θ)P(Y,Z,θ)​=P(Z∣Y,θ)​=c=P(Y∣Z,θi)P(Y∣Z,θ)P(Z,θ)​​

大家是不是很奇怪 P ( Y ∣ Z , θ ) P ( Z , θ ) P(Y|Z,\theta)P(Z,\theta) P(Y∣Z,θ)P(Z,θ)加上 ∑ \sum ∑之后等于什么,其实有的博客这里使用 P ( Z , θ ) = P ( Y i , Z i , θ i ) P(Z,\theta) = P(Y^i,Z^i,\theta^i) P(Z,θ)=P(Yi,Zi,θi)来替代 P ( Y ∣ Z , θ ) P(Y|Z,\theta) P(Y∣Z,θ)参与计算,这样 ∑ Z P ( Y i , Z i , θ i ) \sum_{Z}P(Y^i,Z^i,\theta^i) ∑Z​P(Yi,Zi,θi),这样就方便理解来了。

于是最大化如下:

θ i + 1 = a r g max ⁡ θ ∑ Z P ( Z ∣ Y , θ i ) l o g ( P ( Y ∣ Z , θ ) P ( Z , θ ) P ( Z ∣ Y , θ i ) ) = a r g max ⁡ θ ∑ Z P ( Z ∣ Y , θ i ) l o g ( P ( Y ∣ Z , θ ) P ( Z , θ ) ) = a r g max ⁡ θ ∑ Z P ( Z ∣ Y , θ i ) l o g ( P ( Y , Z ∣ θ ) ) = a r g max ⁡ θ Q ( θ , θ i ) \begin{aligned} \theta^{i+1}&=arg \max_{\theta}\sum_{Z} P(Z|Y,\theta^i)log(\frac{P(Y|Z,\theta)P(Z,\theta)}{P(Z|Y,\theta^i)})\\ &=arg \max_{\theta}\sum_{Z} P(Z|Y,\theta^i)log(P(Y|Z,\theta)P(Z,\theta))\\ & =arg \max_{\theta}\sum_{Z} P(Z|Y,\theta^i)log(P(Y,Z|\theta))\\ &=arg \max_{\theta}Q(\theta,\theta^i) \end{aligned} θi+1​=argθmax​Z∑​P(Z∣Y,θi)log(P(Z∣Y,θi)P(Y∣Z,θ)P(Z,θ)​)=argθmax​Z∑​P(Z∣Y,θi)log(P(Y∣Z,θ)P(Z,θ))=argθmax​Z∑​P(Z∣Y,θi)log(P(Y,Z∣θ))=argθmax​Q(θ,θi)​
其中 l o g log log分母提出来是关于 Z Z Z的 ∑ Z P ( Z ∣ Y , θ i ) l o g P ( Z ∣ Y , θ i ) \sum_{Z} P(Z|Y,\theta^i)logP(Z|Y,\theta^i) ∑Z​P(Z∣Y,θi)logP(Z∣Y,θi),可以去掉。当然也有博客写的形式是:
a r g max ⁡ θ ∑ i = 1 M ∑ Z i P ( Z i ∣ Y i , θ i ) l o g ( P ( Y i , Z i ; θ ) ) arg \max_{\theta}\sum_{i=1}^{M}\sum_{Z^{i}} P(Z^{i}|Y^{i},\theta^i)log(P(Y^{i},Z^{i};\theta))\\ argθmax​i=1∑M​Zi∑​P(Zi∣Yi,θi)log(P(Yi,Zi;θ))
形式其实一样,表示的不一样而已。

证明收敛

我们知道已知观测数据的似然函数是 P ( Y , θ ) P(Y,\theta) P(Y,θ),对数似然函数为:
L ( ) = ∑ i = 1 M l o g P ( y i , θ ) = ∑ i = 1 M l o g ( P ( y i , Z ∣ θ ) P ( Z ∣ y i , θ ) ) = ∑ i = 1 M l o g P ( y i , Z ∣ θ ) − ∑ i = 1 M l o g P ( Z ∣ y i , θ ) \begin{aligned} L()=\sum_{i=1}^{M}logP(y^{i},\theta) &=\sum_{i=1}^{M}log(\frac{P(y^i,Z|\theta)}{P(Z|y^i,\theta)})\\ &=\sum_{i=1}^{M}logP(y^i,Z|\theta) - \sum_{i=1}^{M}logP(Z|y^i,\theta) \end{aligned} L()=i=1∑M​logP(yi,θ)​=i=1∑M​log(P(Z∣yi,θ)P(yi,Z∣θ)​)=i=1∑M​logP(yi,Z∣θ)−i=1∑M​logP(Z∣yi,θ)​
要证明收敛,就证明单调递增, ∑ i = 1 M l o g P ( y i , θ j + 1 ) > ∑ i = 1 M l o g P ( y i , θ j ) \sum_{i=1}^{M}logP(y^{i},\theta^{j+1})>\sum_{i=1}^{M}logP(y^{i},\theta^{j}) ∑i=1M​logP(yi,θj+1)>∑i=1M​logP(yi,θj)
由上文知道:
Q ( θ , θ i ) = ∑ Z l o g P ( Y , Z ∣ θ ) P ( Z ∣ Y , θ i ) = ∑ i = 1 M ∑ Z j l o g P ( y i , Z j ∣ θ ) P ( Z j ∣ y i , θ i ) \begin{aligned} Q(\theta,\theta^i)&=\sum_{Z}logP(Y,Z|\theta)P(Z|Y,\theta^i)\\ &=\sum_{i=1}^{M}\sum_{Z^j}logP(y^i,Z^j|\theta)P(Z^j|y^i,\theta^i) \end{aligned} Q(θ,θi)​=Z∑​logP(Y,Z∣θ)P(Z∣Y,θi)=i=1∑M​Zj∑​logP(yi,Zj∣θ)P(Zj∣yi,θi)​
我们构造一个函数 H H H,让他等于:
H ( θ , θ i ) = ∑ i = 1 M ∑ Z j l o g ( P ( Z ∣ y i , θ ) P ( Z ∣ y i , θ i ) ) H(\theta,\theta^{i})=\sum_{i=1}^{M}\sum_{Z^j}log(P(Z|y^i,\theta)P(Z|y^i,\theta^i)) H(θ,θi)=i=1∑M​Zj∑​log(P(Z∣yi,θ)P(Z∣yi,θi))
让 Q ( θ , θ i ) − H ( θ , θ i ) Q(\theta,\theta^i)-H(\theta,\theta^{i}) Q(θ,θi)−H(θ,θi):
Q ( θ , θ i ) − H ( θ , θ i ) = ∑ i = 1 M ∑ Z j l o g P ( y i , Z j ∣ θ ) P ( Z j ∣ y i , θ i ) − ∑ i = 1 M ∑ Z j l o g ( P ( Z j ∣ y i , θ ) P ( Z j ∣ y i , θ i ) ) = ∑ i = 1 M ∑ Z j l o g ( P ( y i , Z j ∣ θ ) − P ( Z j ∣ y i , θ ) ) = ∑ i = 1 M l o g P ( y i , θ ) \begin{aligned} Q(\theta,\theta^i)-H(\theta,\theta^{i})&=\sum_{i=1}^{M}\sum_{Z^j}logP(y^i,Z^j|\theta)P(Z^j|y^i,\theta^i) - \sum_{i=1}^{M}\sum_{Z^j}log(P(Z^j|y^i,\theta)P(Z^j|y^i,\theta^i)) \\ &=\sum_{i=1}^{M}\sum_{Z^j}log\bigg(P(y^i,Z^j|\theta)-P(Z^j|y^i,\theta)\bigg) \\ &=\sum_{i=1}^{M}logP(y^{i},\theta) \end{aligned} Q(θ,θi)−H(θ,θi)​=i=1∑M​Zj∑​logP(yi,Zj∣θ)P(Zj∣yi,θi)−i=1∑M​Zj∑​log(P(Zj∣yi,θ)P(Zj∣yi,θi))=i=1∑M​Zj∑​log(P(yi,Zj∣θ)−P(Zj∣yi,θ))=i=1∑M​logP(yi,θ)​所以:
∑ i = 1 M l o g P ( y i , θ j + 1 ) − ∑ i = 1 M l o g P ( y i , θ j ) = Q ( θ i + 1 , θ i ) − H ( θ i + 1 , θ i ) − ( Q ( θ i , θ i ) − H ( θ i , θ i ) ) = Q ( θ i + 1 , θ i ) − Q ( θ i , θ i ) − ( H ( θ i + 1 , θ i ) − H ( θ i , θ i ) ) \sum_{i=1}^{M}logP(y^{i},\theta^{j+1})-\sum_{i=1}^{M}logP(y^{i},\theta^{j}) \\ = Q(\theta^{i+1},\theta^i)-H(\theta^{i+1},\theta^{i}) - (Q(\theta^{i},\theta^{i})-H(\theta^{i},\theta^{i}))\\ = Q(\theta^{i+1},\theta^i)- Q(\theta^{i},\theta^{i}) -( H(\theta^{i+1},\theta^{i}) - H(\theta^{i},\theta^{i})) i=1∑M​logP(yi,θj+1)−i=1∑M​logP(yi,θj)=Q(θi+1,θi)−H(θi+1,θi)−(Q(θi,θi)−H(θi,θi))=Q(θi+1,θi)−Q(θi,θi)−(H(θi+1,θi)−H(θi,θi))
该公式左边已经被证明是大于0,证明右边: H ( θ i + 1 , θ i ) − H ( θ i , θ i ) < 0 H(\theta^{i+1},\theta^{i}) - H(\theta^{i},\theta^{i})<0 H(θi+1,θi)−H(θi,θi)<0:
H ( θ i + 1 , θ i ) − H ( θ i , θ i ) = ∑ Z j ( l o g ( P ( Z j ∣ Y , θ i + 1 ) P ( Z j ∣ Y , θ i ) ) ) P ( Z j ∣ Y , θ i ) = l o g ( ∑ Z j P ( Z j ∣ Y , θ i + 1 ) P ( Z j ∣ Y , θ i ) P ( Z j ∣ Y , θ i ) ) = l o g P ( Z ∣ Y , θ i + 1 ) = l o g 1 = 0 \begin{aligned} H(\theta^{i+1},\theta^{i}) - H(\theta^{i},\theta^{i}) &=\sum_{Z^j}\bigg(log(\frac{P(Z^j|Y,\theta^{i+1})}{P(Z^j|Y,\theta^i)}) \bigg)P(Z^j|Y,\theta^i) \\ &=log\bigg(\sum_{Z^j}\frac{P(Z^j|Y,\theta^{i+1})}{P(Z^j|Y,\theta^i)}P(Z^j|Y,\theta^i) \bigg)\\ &=logP(Z|Y,\theta^{i+1})=log1=0 \end{aligned} H(θi+1,θi)−H(θi,θi)​=Zj∑​(log(P(Zj∣Y,θi)P(Zj∣Y,θi+1)​))P(Zj∣Y,θi)=log(Zj∑​P(Zj∣Y,θi)P(Zj∣Y,θi+1)​P(Zj∣Y,θi))=logP(Z∣Y,θi+1)=log1=0​
其中不等式是由于Jensen不等式,由此证明了 ∑ i = 1 M l o g P ( y i , θ j + 1 ) > ∑ i = 1 M l o g P ( y i , θ j ) \sum_{i=1}^{M}logP(y^{i},\theta^{j+1})>\sum_{i=1}^{M}logP(y^{i},\theta^{j}) ∑i=1M​logP(yi,θj+1)>∑i=1M​logP(yi,θj),证明了EM算法的收敛性。但不能保证是全局最优,只能保证局部最优。

高斯混合分布

EM算法的一个重要应用场景就是高斯混合模型的参数估计。高斯混合模型就是由多个高斯模型组合在一起的混合模型(可以理解为多个高斯分布函数的线性组合,理论上高斯混合模型是可以拟合任意类型的分布),例如对于下图中的数据集如果用一个高斯模型来描述的话显然是不合理的:

两个高斯模型可以拟合数据集,如图所示:

如果有多个高斯模型,公式表示为:
P ( y ∣ θ ) = ∑ k = 1 K a k ϕ ( y ∣ θ k ) ϕ ( y ∣ θ k ) = 1 2 π δ k e x p ( − ( y − μ k ) 2 2 δ k 2 ) a k > 0 , ∑ a k = 1 P(y|\theta)=\sum_{k=1}^{K}a_k\phi(y|\theta_{k}) \\ \phi(y|\theta_{k})=\frac{1}{\sqrt{2\pi}\delta_{k}}exp(-\frac{(y-\mu_{k})^2}{2 \delta_{k}^{2}}) \\ a_k>0,\sum a_k =1 P(y∣θ)=k=1∑K​ak​ϕ(y∣θk​)ϕ(y∣θk​)=2π ​δk​1​exp(−2δk2​(y−μk​)2​)ak​>0,∑ak​=1
ϕ ( y ∣ θ k ) \phi(y|\theta_{k}) ϕ(y∣θk​)表示为第k个高斯分布密度模型,定义如上,其中 a k a_k ak​表示被选中的概率。在本次模型 P ( y ∣ θ ) P(y|\theta) P(y∣θ)中,观测数据是已知的,而观测数据具体来自哪个模型是未知的,有点像之前提过的三硬币模型,我们来对比一下,A硬币就像是概率 a k a_k ak​,用来表明具体的模型,而B、C硬币就是具体的模型,只不过这里有很多个模型,不仅仅是B、C这两个模型。我们用 γ j k \gamma_{jk} γjk​来表示,则:
γ j k = { 1 第j个观测数据来源于第k个模型 0 否则 \gamma_{jk} = \begin{cases} 1& \text{第j个观测数据来源于第k个模型}\\ 0& \text{否则} \end{cases} γjk​={10​第j个观测数据来源于第k个模型否则​
所以一个观测数据 y j y_j yj​的隐藏数据 ( γ j 1 , γ j 2 , . . . , γ j k ) (\gamma_{j1},\gamma_{j2},...,\gamma_{jk}) (γj1​,γj2​,...,γjk​),那么完全似然函数就是:

P ( y , γ ∣ θ ) = ∏ k = 1 K ∏ j = 1 N [ a k ϕ ( y ∣ θ k ) ] γ j k P(y,\gamma|\theta)= \prod_{k=1}^{K}\prod_{j=1}^{N}[a_{k}\phi(y|\theta_{k})]^{\gamma_{jk}} P(y,γ∣θ)=k=1∏K​j=1∏N​[ak​ϕ(y∣θk​)]γjk​

取对数之后等于:

l o g ( P ( y , γ ∣ θ ) ) = l o g ( ∏ k = 1 K ∏ j = 1 N [ a k ϕ ( y ∣ θ k ) ] γ j k ) = ∑ K k = 1 ( ∑ j = 1 N ( γ j k ) l o g ( a k ) + ∑ j = 1 N ( γ j k ) [ l o g ( 1 2 π ) − l o g ( δ k ) − ( y i − μ k ) 2 2 δ k 2 ] ) \begin{aligned} log(P(y,\gamma|\theta))&=log( \prod_{k=1}^{K}\prod_{j=1}^{N}[a_{k}\phi(y|\theta_{k})]^{\gamma_{jk}})\\ &=\sum_{K}^{k=1}\bigg(\sum_{j=1}^{N}(\gamma_{jk}) log(a_k)+\sum_{j=1}^{N}( \gamma_{jk})\bigg[log(\frac{1}{\sqrt{2\pi}})-log(\delta_{k})-\frac{(y_i-\mu_{k})^2}{2 \delta_{k}^{2}}\bigg]\bigg) \end{aligned} log(P(y,γ∣θ))​=log(k=1∏K​j=1∏N​[ak​ϕ(y∣θk​)]γjk​)=K∑k=1​(j=1∑N​(γjk​)log(ak​)+j=1∑N​(γjk​)[log(2π ​1​)−log(δk​)−2δk2​(yi​−μk​)2​])​

  • E 步 :
    Q ( θ . θ i ) = E [ l o g ( P ( y , γ ∣ θ ) ) ] = ∑ K k = 1 ( ∑ j = 1 N ( E γ j k ) l o g ( a k ) + ∑ j = 1 N ( E γ j k ) [ l o g ( 1 2 π ) − l o g ( δ k ) − ( y i − μ k ) 2 2 δ k 2 ] ) \begin{aligned} Q(\theta.\theta^i) &= E[log(P(y,\gamma|\theta))]\\ &=\sum_{K}^{k=1}\bigg(\sum_{j=1}^{N}(E\gamma_{jk}) log(a_k)+\sum_{j=1}^{N}(E\gamma_{jk})\bigg[log(\frac{1}{\sqrt{2\pi}})-log(\delta_{k})-\frac{(y_i-\mu_{k})^2}{2 \delta_{k}^{2}}\bigg]\bigg) \end{aligned} Q(θ.θi)​=E[log(P(y,γ∣θ))]=K∑k=1​(j=1∑N​(Eγjk​)log(ak​)+j=1∑N​(Eγjk​)[log(2π ​1​)−log(δk​)−2δk2​(yi​−μk​)2​])​
    其中我们定义 γ j k ^ \hat{\gamma_{jk}} γjk​^​:
    γ j k ^ = E ( γ j k ∣ y , θ ) = a k ϕ ( y i ∣ θ k ) ∑ k = 1 K a k ϕ ( y i ∣ θ k ) j = 1 , 2 , . . , N ; k = 1 , 2 , . . . , K n k = ∑ j = i N E γ j k \hat{\gamma_{jk}} = E(\gamma_{jk}|y,\theta)=\frac{a_k\phi(y_i|\theta_{k})}{\sum_{k=1}^{K}a_k\phi(y_i|\theta_{k}) }\\ j=1,2,..,N;k=1,2,...,K\\ n_k=\sum_{j=i}^{N}E\gamma_{jk} γjk​^​=E(γjk​∣y,θ)=∑k=1K​ak​ϕ(yi​∣θk​)ak​ϕ(yi​∣θk​)​j=1,2,..,N;k=1,2,...,Knk​=j=i∑N​Eγjk​
    于是化简得到:
    Q ( θ . θ i ) = ∑ K k = 1 ( n k l o g ( a k ) + ∑ j = 1 N ( E γ j k ) [ l o g ( 1 2 π ) − l o g ( δ k ) − ( y i − μ k ) 2 2 δ k 2 ] ) \begin{aligned} Q(\theta.\theta^i) &= \sum_{K}^{k=1}\bigg(n_k log(a_k)+\sum_{j=1}^{N}(E\gamma_{jk})\bigg[log(\frac{1}{\sqrt{2\pi}})-log(\delta_{k})-\frac{(y_i-\mu_{k})^2}{2 \delta_{k}^{2}}\bigg]\bigg) \end{aligned} Q(θ.θi)​=K∑k=1​(nk​log(ak​)+j=1∑N​(Eγjk​)[log(2π ​1​)−log(δk​)−2δk2​(yi​−μk​)2​])​

E 步 在代码设计上只有 γ j k ^ \hat{\gamma_{jk}} γjk​^​有用,用于M步的计算。

  • M步,
    θ i + 1 = a r g max ⁡ θ Q ( θ , θ i ) \theta^{i+1}=arg \max_{\theta}Q(\theta,\theta^i) θi+1=argθmax​Q(θ,θi)
    对 Q ( θ , θ i ) Q(\theta,\theta^i) Q(θ,θi)求导,得到每个未知量的偏导,使其偏导等于0,求解得到:
    μ k ^ = ∑ j = 1 N γ j k ^ y i ∑ j = 1 N γ j k ^ δ k ^ = ∑ j = 1 N γ j k ^ ( y i − μ k ) 2 ∑ j = 1 N γ j k ^ a k ^ = ∑ j = 1 N γ j k ^ N \hat{\mu_k}=\frac{\sum_{j=1}^{N}\hat{\gamma_{jk}}y_i}{\sum_{j=1}^{N}\hat{\gamma_{jk}}} \\ \\ \hat{\delta_k}=\frac{\sum_{j=1}^{N}\hat{\gamma_{jk}}(y_i-\mu_k)^2}{\sum_{j=1}^{N}\hat{\gamma_{jk}}} \\ \\ \\ \hat{a_k}=\frac{\sum_{j=1}^{N}\hat{\gamma_{jk}} }{N} μk​^​=∑j=1N​γjk​^​∑j=1N​γjk​^​yi​​δk​^​=∑j=1N​γjk​^​∑j=1N​γjk​^​(yi​−μk​)2​ak​^​=N∑j=1N​γjk​^​​
    给一个初始值,来回迭代就可以求得值内容。这一块主要用到了 Q ( θ . θ i ) Q(\theta.\theta^i) Q(θ.θi)的导数,并且用到了E步的 γ j k ^ \hat{\gamma_{jk}} γjk​^​。

总结

这里其实还有很多问题没讲,大家想了解的可以去学习统计学习方法这本书,讲解的还是挺全的。

混合高斯分布模型

EM算法更多是一种思想,用概率来解决问题的一种方法,具体的代码看自己选用模型,所以并没有通用的模型,本此代码主要是讲解混合高斯分布模型的

这其中的M步 完全按照了 公式来计算。

import numpy as np
import random
import math
import time
'''
数据集:伪造数据集(两个高斯分布混合)
数据集长度:1000
------------------------------
运行结果:
----------------------------
the Parameters set is:
alpha0:0.3, mu0:0.7, sigmod0:-2.0, alpha1:0.5, mu1:0.5, sigmod1:1.0
----------------------------
the Parameters predict is:
alpha0:0.4, mu0:0.6, sigmod0:-1.7, alpha1:0.7, mu1:0.7, sigmod1:0.9
----------------------------
'''

def loadData(mu0, sigma0, mu1, sigma1, alpha0, alpha1):
    '''
    初始化数据集
    这里通过服从高斯分布的随机函数来伪造数据集
    :param mu0: 高斯0的均值
    :param sigma0: 高斯0的方差
    :param mu1: 高斯1的均值
    :param sigma1: 高斯1的方差
    :param alpha0: 高斯0的系数
    :param alpha1: 高斯1的系数
    :return: 混合了两个高斯分布的数据
    '''
    # 定义数据集长度为1000
    length = 1000

    # 初始化第一个高斯分布,生成数据,数据长度为length * alpha系数,以此来
    # 满足alpha的作用
    data0 = np.random.normal(mu0, sigma0, int(length * alpha0))
    # 第二个高斯分布的数据
    data1 = np.random.normal(mu1, sigma1, int(length * alpha1))

    # 初始化总数据集
    # 两个高斯分布的数据混合后会放在该数据集中返回
    dataSet = []
    # 将第一个数据集的内容添加进去
    dataSet.extend(data0)
    # 添加第二个数据集的数据
    dataSet.extend(data1)
    # 对总的数据集进行打乱(其实不打乱也没事,只不过打乱一下直观上让人感觉已经混合了
    # 读者可以将下面这句话屏蔽以后看看效果是否有差别)
    random.shuffle(dataSet)

    #返回伪造好的数据集
    return dataSet


# 高斯分布公式,没有什么特殊的
def calcGauss(dataSetArr, mu, sigmod):
    '''
    根据高斯密度函数计算值
    依据:“9.3.1 高斯混合模型” 式9.25
    注:在公式中y是一个实数,但是在EM算法中(见算法9.2的E步),需要对每个j
    都求一次yjk,在本实例中有1000个可观测数据,因此需要计算1000次。考虑到
    在E步时进行1000次高斯计算,程序上比较不简洁,因此这里的y是向量,在numpy
    的exp中如果exp内部值为向量,则对向量中每个值进行exp,输出仍是向量的形式。
    所以使用向量的形式1次计算即可将所有计算结果得出,程序上较为简洁
    
    :param dataSetArr: 可观测数据集
    :param mu: 均值
    :param sigmod: 方差
    :return: 整个可观测数据集的高斯分布密度(向量形式)
    '''
    # 计算过程就是依据式9.25写的,没有别的花样
    result = (1 / (math.sqrt(2*math.pi)*sigmod**2)) * np.exp(-1 * (dataSetArr-mu) * (dataSetArr-mu) / (2*sigmod**2))
    # 返回结果
    return result


def E_step(dataSetArr, alpha0, mu0, sigmod0, alpha1, mu1, sigmod1):
    '''
    EM算法中的E步
    依据当前模型参数,计算分模型k对观数据y的响应度
    :param dataSetArr: 可观测数据y
    :param alpha0: 高斯模型0的系数
    :param mu0: 高斯模型0的均值
    :param sigmod0: 高斯模型0的方差
    :param alpha1: 高斯模型1的系数
    :param mu1: 高斯模型1的均值
    :param sigmod1: 高斯模型1的方差
    :return: 两个模型各自的响应度
    '''
    # 计算y0的响应度
    # 先计算模型0的响应度的分子
    gamma0 = alpha0 * calcGauss(dataSetArr, mu0, sigmod0)
    #print("gamma0=",gamma0.shape) # 1000, 维向量
    # 模型1响应度的分子
    gamma1 = alpha1 * calcGauss(dataSetArr, mu1, sigmod1)

    # 两者相加为E步中的分布
    sum = gamma0 + gamma1
    # 各自相除,得到两个模型的响应度
    gamma0 = gamma0 / sum
    gamma1 = gamma1 / sum

    # 返回两个模型响应度
    return gamma0, gamma1

def M_step(muo, mu1, gamma0, gamma1, dataSetArr):
    # 依据算法9.2计算各个值
    # 这里没什么花样,对照书本公式看看这里就好了
    
    # np.dot 点积:[1,2] [2,3] = [2,6]
    mu0_new = np.dot(gamma0, dataSetArr) / np.sum(gamma0)
    mu1_new = np.dot(gamma1, dataSetArr) / np.sum(gamma1)

    # math.sqrt  平方根 
    sigmod0_new = math.sqrt(np.dot(gamma0, (dataSetArr - muo)**2) / np.sum(gamma0))
    sigmod1_new = math.sqrt(np.dot(gamma1, (dataSetArr - mu1)**2) / np.sum(gamma1))

    alpha0_new = np.sum(gamma0) / len(gamma0)
    alpha1_new = np.sum(gamma1) / len(gamma1)

    # 将更新的值返回
    return mu0_new, mu1_new, sigmod0_new, sigmod1_new, alpha0_new, alpha1_new


## 训练主函数
def EM_Train(dataSetList, iter=500):
    '''
    根据EM算法进行参数估计
    算法依据“9.3.2 高斯混合模型参数估计的EM算法” 算法9.2
    :param dataSetList:数据集(可观测数据)
    :param iter: 迭代次数
    :return: 估计的参数
    '''
    # 将可观测数据y转换为数组形式,主要是为了方便后续运算
    dataSetArr = np.array(dataSetList)

    # 步骤1:对参数取初值,开始迭代
    alpha0 = 0.5
    mu0 = 0
    sigmod0 = 1
    alpha1 = 0.5
    mu1 = 1
    sigmod1 = 1

    # 开始迭代
    step = 0
    while (step < iter):
        # 每次进入一次迭代后迭代次数加1
        step += 1
        # 步骤2:E步:依据当前模型参数,计算分模型k对观测数据y的响应度
        gamma0, gamma1 = E_step(dataSetArr, alpha0, mu0, sigmod0, alpha1, mu1, sigmod1)
        # 步骤3:M步
        mu0, mu1, sigmod0, sigmod1, alpha0, alpha1 = M_step(mu0, mu1, gamma0, gamma1, dataSetArr)

    # 迭代结束后将更新后的各参数返回
    return alpha0, mu0, sigmod0, alpha1, mu1, sigmod1



if __name__ == '__main__':
    start = time.time()

    # 设置两个高斯模型进行混合,这里是初始化两个模型各自的参数
    # 见“9.3 EM算法在高斯混合模型学习中的应用”
    # alpha是“9.3.1 高斯混合模型” 定义9.2中的系数α
    # mu0是均值μ
    # sigmod是方差σ
    # 在设置上两个alpha的和必须为1,其他没有什么具体要求,符合高斯定义就可以
    
    alpha0 = 0.3  # 系数α
    mu0 = -2  # 均值μ
    sigmod0 = 0.5  # 方差σ

    alpha1 = 0.7  # 系数α
    mu1 = 0.5  # 均值μ
    sigmod1 = 1  # 方差σ

    # 初始化数据集
    dataSetList = loadData(mu0, sigmod0, mu1, sigmod1, alpha0, alpha1)

    #打印设置的参数
    print('---------------------------')
    print('the Parameters set is:')
    print('alpha0:%.1f, mu0:%.1f, sigmod0:%.1f, alpha1:%.1f, mu1:%.1f, sigmod1:%.1f' % (
        alpha0, alpha1, mu0, mu1, sigmod0, sigmod1
    ))

    # 开始EM算法,进行参数估计
    alpha0, mu0, sigmod0, alpha1, mu1, sigmod1 = EM_Train(dataSetList)

    # 打印参数预测结果
    print('----------------------------')
    print('the Parameters predict is:')
    print('alpha0:%.1f, mu0:%.1f, sigmod0:%.1f, alpha1:%.1f, mu1:%.1f, sigmod1:%.1f' % (
        alpha0, alpha1, mu0, mu1, sigmod0, sigmod1
    ))

    # 打印时间
    print('----------------------------')
    print('time span:', time.time() - start)

E步主要计算内容

其中我们定义 γ j k ^ \hat{\gamma_{jk}} γjk​^​:
γ j k ^ = E ( γ j k ∣ y , θ ) = a k ϕ ( y i ∣ θ k ) ∑ k = 1 K a k ϕ ( y i ∣ θ k ) j = 1 , 2 , . . , N ; k = 1 , 2 , . . . , K n k = ∑ j = i N E γ j k \hat{\gamma_{jk}} = E(\gamma_{jk}|y,\theta)=\frac{a_k\phi(y_i|\theta_{k})}{\sum_{k=1}^{K}a_k\phi(y_i|\theta_{k}) }\\ j=1,2,..,N;k=1,2,...,K\\ n_k=\sum_{j=i}^{N}E\gamma_{jk} γjk​^​=E(γjk​∣y,θ)=∑k=1K​ak​ϕ(yi​∣θk​)ak​ϕ(yi​∣θk​)​j=1,2,..,N;k=1,2,...,Knk​=j=i∑N​Eγjk​

M步 主要计算内容

这一步骤主要是对Q函数求导后的数据进行计算,利用了 E 步 的 γ j k ^ \hat{\gamma_{jk}} γjk​^​

import math
import copy
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 
#生成随机数据,4个高斯模型
def generate_data(sigma,N,mu1,mu2,mu3,mu4,alpha):
    global X                  #可观测数据集
    X = np.zeros((N, 2))       # 初始化X,2行N列。2维数据,N个样本
    X=np.matrix(X)
    global mu                 #随机初始化mu1,mu2,mu3,mu4
    mu = np.random.random((4,2))
    mu=np.matrix(mu)
    global excep              #期望第i个样本属于第j个模型的概率的期望
    excep=np.zeros((N,4))
    global alpha_             #初始化混合项系数
    alpha_=[0.25,0.25,0.25,0.25]
    for i in range(N):
        if np.random.random(1) < 0.1:  # 生成0-1之间随机数
            X[i,:]  = np.random.multivariate_normal(mu1, sigma, 1)     #用第一个高斯模型生成2维数据
        elif 0.1 <= np.random.random(1) < 0.3:
            X[i,:] = np.random.multivariate_normal(mu2, sigma, 1)      #用第二个高斯模型生成2维数据
        elif 0.3 <= np.random.random(1) < 0.6:
            X[i,:] = np.random.multivariate_normal(mu3, sigma, 1)      #用第三个高斯模型生成2维数据
        else:
            X[i,:] = np.random.multivariate_normal(mu4, sigma, 1)      #用第四个高斯模型生成2维数据
 
    print("可观测数据:\n",X)       #输出可观测样本
    print("初始化的mu1,mu2,mu3,mu4:",mu)      #输出初始化的mu


# E 期望
#  \hat{\gamma_{jk}}
def e_step(sigma,k,N):
    global X
    global mu
    global excep
    global alpha_
    for i in range(N):
        denom=0
        for j in range(0,k):
            #  sigma.I 表示矩阵的逆矩阵
            # np.transpose :矩阵转置   np.linalg.det():矩阵求行列式
            denom += alpha_[j]*  math.exp(-(X[i,:]-mu[j,:])*sigma.I*np.transpose(X[i,:]-mu[j,:]))  /np.sqrt(np.linalg.det(sigma))       #分母
        for j in range(0,k):
            numer = math.exp(-(X[i,:]-mu[j,:])*sigma.I*np.transpose(X[i,:]-mu[j,:]))/np.sqrt(np.linalg.det(sigma))        #分子
            excep[i,j]=alpha_[j]*numer/denom      #求期望
    print("隐藏变量:\n",excep)

    
def m_step(k,N):
    global excep
    global X
    global alpha_
    for j in range(0,k):
        denom=0   #分母
        numer=0   #分子
        for i in range(N):
            numer += excep[i,j]*X[i,:]
            denom += excep[i,j]
        mu[j,:] = numer/denom    #求均值
        alpha_[j]=denom/N        #求混合项系数

        #     #可视化结果
def plotShow():
    # 画生成的原始数据
    plt.subplot(221)
    plt.scatter(X[:,0].tolist(), X[:,1].tolist(),c='b',s=25,alpha=0.4,marker='o')    #T散点颜色,s散点大小,alpha透明度,marker散点形状
    plt.title('random generated data')
    #画分类好的数据
    plt.subplot(222)
    plt.title('classified data through EM')
    order=np.zeros(N)
    color=['b','r','k','y']
    for i in range(N):
        for j in range(k):
            if excep[i,j]==max(excep[i,:]):
                order[i]=j     #选出X[i,:]属于第几个高斯模型
            probility[i] += alpha_[int(order[i])]*math.exp(-(X[i,:]-mu[j,:])*sigma.I*np.transpose(X[i,:]-mu[j,:]))/(np.sqrt(np.linalg.det(sigma))*2*np.pi)    #计算混合高斯分布
        plt.scatter(X[i, 0], X[i, 1], c=color[int(order[i])], s=25, alpha=0.4, marker='o')      #绘制分类后的散点图
    #绘制三维图像
    ax = plt.subplot(223, projection='3d')
    plt.title('3d view')
    for i in range(N):
        ax.scatter(X[i, 0], X[i, 1], probility[i], c=color[int(order[i])])
    plt.show()
        
        
        
        
        
        
        
if __name__ == '__main__':
    iter_num=1000  #迭代次数
    N=500         #样本数目
    k=4            #高斯模型数
    probility = np.zeros(N)    #混合高斯分布
    u1=[5,35]
    u2=[30,40]
    u3=[20,20]
    u4=[45,15]
    sigma=np.matrix([[30, 0], [0, 30]])               #协方差矩阵
    alpha=[0.1,0.2,0.3,0.4]         #混合项系数
    generate_data(sigma,N,u1,u2,u3,u4,alpha)     #生成数据
    #迭代计算
    for i in range(iter_num):
        err=0     #均值误差
        err_alpha=0    #混合项系数误差
        Old_mu = copy.deepcopy(mu)
        Old_alpha = copy.deepcopy(alpha_)
        
        e_step(sigma,k,N)     # E步
        m_step(k,N)           # M步
        
        print("迭代次数:",i+1)
        print("估计的均值:",mu)
        print("估计的混合项系数:",alpha_)
        for z in range(k):
            err += (abs(Old_mu[z,0]-mu[z,0])+abs(Old_mu[z,1]-mu[z,1]))      #计算误差
            err_alpha += abs(Old_alpha[z]-alpha_[z])
        if (err<=0.001) and (err_alpha<0.001):     #达到精度退出迭代
            print(err,err_alpha)
            break

    
# 画图
plotShow()

在这里插入图片描述 参考博客
主要参考统计学习方法这本书,书籍地址:http://www.dgt-factory.com/uploads/2018/07/0725/%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95.pdf。
统计学习方法-代码解读
EM算法 - 期望极大算法

交换机背板带宽、交换容量与包转发率到底是啥? 在网络工程中,交换机是核心设备之一,而关于它的性能指标,背板带宽、交换容量、以及包转发率往往成为人们衡量其性能的重要参数。这些术语的定义、关系、以及在实际场景中的应用,都对交换机的选型与部署有着重要意义。本文将为您全面解读这些概念,帮助您深入了解交换机的核心性能指标。 阅读详情

相关推荐

遥感数据处理之MCD19A2数据的处理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 这一段时间一直在做modis气溶胶产品——MCD19A2这个数据的处理工作,总结了一些东西,在这里分享一下。 modis数据一般可以用MCTK和MRT这两个工具进行处理,下面先介绍一下用这两种工具处理MCD19A2的流程: 先解众惑:为什么使用MCD19A2数据处理出来的结果会有3个或4个或5个波段。 这里使用HDF Exploer这个软件,下载链接 1.使用MCTK处......

weixin_42176976的博客 1万+

EM 算法

EM 算法是 Dempster,Laind,Rubin 于 1977 年提出的求参数极大似然估计的一种方法,它可以从非完整数据集中对参数进行 MLE 估计,是一种非常简单实用的学习算法。这种方法可以广泛地应用于处理缺损数据,截尾数据,带有噪声等所谓的不完全数据 [1]  。 可以有一些比较形象的比喻说法把这个算法讲清楚。比如说食堂的大师傅炒了一份菜,要等分成两份给两个人吃,显然没有必要拿来天平一...

qq_40213457的博客 504

海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

https://www.hikrobotics.com/machinevision/service/download?module=0

weixin_41965898的博客 2万+

EM算法

一个例子:   EM算法是迭代求解最大值的算法,同时算法在每一次迭代时分为两步,E步和M步。一轮轮迭代更新隐含数据和模型分布参数,直到收敛,即得到我们需要的模型参数。 一个最直观了解EM算法思路的是K-Means算法。在K-Means聚类时,每个聚类簇的质心是隐含数据。我们会假设K个初始化质心,即EM算法的E步;然后计算得到每个样本最近的质心,并把样本聚类到最近的这个质心,即EM...

kylin_learn的博客 1122

在线考试系统源码+数据库+word+ppt(高分毕业设计)

本系统通过Spring Cloud实现微服务拆分,将授权、考试、监控等功能解耦,既保证了系统的扩展性,也便于后期维护。基于OAuth2.0的单点登录,解决多服务统一认证问题;考试与练习模式分离,满足不同场景需求;集成Druid与Hystrix,保障系统监控与稳定性。

weixin_44355158的博客 738

Zemax光机热集成分析:从FEA数据导入到光学性能评估实战

在精密光学系统设计中,环境温度变化和机械应力是导致像质恶化的关键因素,这涉及到光、机、热多物理场的耦合分析。其核心原理在于,通过有限元分析(FEA)软件(如ANSYS)模拟热与力学载荷下的结构变形和温度分布,并将这些物理场数据精准映射到光学设计软件(如Zemax)中,以评估其对调制传递函数(MTF)、点列图等核心光学指标的影响。这项技术的工程价值在于,它使设计从静态的理想模型跃升至动态的工程现实,能够在设计阶段就预测并补偿环境扰动,从而显著提升光学系统在航空航天、车载镜头、高功率激光等严苛工况下的可靠性与稳

weixin_30565327的博客 356

理解EM算法

介绍EM算法的材料里,我目前看过且觉得看了之后豁然开朗的就是NG老师的CS229讲义。 JerryLead 那里有中文版 结合混合高斯分布,在这两位牛人的基础上,谈一点自己觉得看待EM算法很重要的2个必须弄清楚的问题:为什么要有EM算法,为什么要分E步和M步。其中解释了一些介绍EM算法免不了要用到公式。 为什么要有EM算法 我把EM算法当做最大似然估计的拓展,解决难以给出解析解的最大似然估计(

Yiyang的专栏 1406

当传统CFD遇上AI:PINN如何帮我们省下90%的仿真计算时间?

本文探讨了物理信息神经网络(PINN)在计算流体力学(CFD)中的应用,如何通过无网格方法节省90%的仿真计算时间。PINN将物理定律编码到神经网络中,显著减少传统CFD中的网格生成和计算时间,同时保持高精度。文章还对比了PINN与传统方法的性能,并讨论了其独特优势和当前局限。

weixin_32678995的博客 321

EM(Expectation-Maximum)算法

EM算法的核心分为两步因为在最大化过程中存在两个参量rθ,其中若知道r,则知道θ;若知道θ,则知道r。且两个量未存在明显的关系,但又互相依存可以采用EM算法rrθθr。

Gowi的博客 1396

Briefings in Bioinformatics投稿经验分享

Briefings in Bioinformatics投稿经验分享

LiRongLu_的博客 3340

网络安全 | 企业网络安全的十大挑战及解决方案

网络安全 | 企业网络安全的十大挑战及解决方案,随着信息技术的飞速发展,企业数字化转型进程不断加速,网络安全问题日益成为企业运营与发展面临的关键挑战。本文深入剖析企业网络安全的十大挑战,包括网络攻击日益复杂、数据泄露风险、内部威胁、物联网安全、云安全、合规性要求、移动办公安全、供应链安全、人才短缺以及安全预算有限等,并针对每个挑战详细阐述相应的解决方案,旨在为企业构建全面、有效的网络安全体系提供指导与参考,助力企业在复杂多变的网络环境中保障自身信息资产安全,实现可持续发展。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

css 中 em 单位怎么用

em 是 css 中的一个相对长度单位,相对于当前对象内文本的字体尺寸;如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器默认字体尺寸。可以作用在 width、height、line-height、margin、border 等样式的设置上。

2301_80826038的博客 2189

【服务器电源架构与关键技术发展趋势】AI数据中心迅猛发展,服务器电源如何演变?

功率级跃升:机柜功率从 100kW 向 1MW 级发展,供电架构采用 HVDC + 固态变压器(SST),省去传统 UPS、PFC 环节; 母线电压升级:从 48V 向 400V→800V 演进,配套 AI 电弧检测、智能运维解决高压安全与维护难题; 能效(PUE)提升:目标 PUE<1.3,通过液冷 CDU 替代传统风冷,可将 PUE 降至 1.16(传统 AI 集群 PUE 达 1.6); 拓扑控制复杂化:功率拓扑从单相→三相、单级→多交错结构,适配高功率需求; 安全维度扩展:新增网络安全防护需求。

昔时扬尘处 1451

em算法 c语言,EM算法

EM算法作者:罗维初稿:2011年1月15日修正:2012年1月14日很碰巧,时隔一年了。面对经典的EM算法,我有了新的认识。经常有人谈到它就是"鸡生蛋,蛋生鸡"的解法,这个很通俗,但是只了解到这一层,是远不够的……EM算法的全名是Expectation Maximization,中文名叫期望最大化算法。它是一个在含有隐变量的模型中常用的算法,在最大似然估计(MLE)和最大后验估计(MAP)中常用...

weixin_32620249的博客 616

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

html与css中em怎么用,css中em什么意思

em是css中的一个相对长度单位,相对于当前对象内文本的字体尺寸;如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器默认字体尺寸。可以作用在width、height、line-height、margin、border等样式的设置上。本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。CSS中有众多单位,常用的px是绝对单位,em则是相对单位。在响...

weixin_33577842的博客 1557

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

html中em作用6,CSS中强大的EM

使用CSS也好久了,但一直都是在使用“px”来设置Web元素的相关属性,未敢使用“em”。主要原因是,对其并不什么了解,只知道一点概念性的东西,前段时间在项目中要求使用“em”作为单位设置元素,所以从头对“em”学习了一回。稍为有一点理解,今天特意整理了一份博文与大家一起分享,希望对童子们有些许的帮助。这篇教程将引导大家如何使用“em”来创建一个基本的弹性布局,从而学习其如何计算?又是如何使用“e...

weixin_35509069的博客 803

oracle的em能干什么,Oracle中EM的配置

手工配置Oracle 10G Enterprise Manager今天安装oracle,反复装了几遍都报下面错误;试了几种方法都不行;由于以下错误,Enterprise Manager配置失败启动Database Control时出错有关详细资料,请参阅E:\oracle\product\10.2.0\db_1\cfgtoollogs\dbca\oradb\emConfig.log中的日志文件。您...

weixin_34435322的博客 2158

EM 无法启动,重新完全配置EM

  公司的电脑改了IP ,于是EM无法启动了  环境:ORACLE 10G   OS:WINXP SP2  D:/Documents and Settings/guanhao>emctl start dbconsole  OC4J Configuration issue. E:/oracle/product/10.2.0/db_1/oc4j/j2ee/OC4J_DBConsole  _s

Tisty的兵工厂--新Blog:http://www.UbuntuSky.cn 2103

html的em属性,css中的em是什么意思?

em是CSS中的一个相对单位,它的单位长度是根据元素的文本垂直长度来决定的。可以作用在width、height、line-height、margin、padding、border等样式的设置上。css中em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。在响应式和移动端设计的大前提下,使用em能够更方便快捷的一次性调整web文档...

weixin_35157304的博客 5982

CSS中的em运用详解,1em等于多少像素?

今天要看完它: 使用CSS也好久了,但一直都是在使用“px”来设置Web元素的相关属性,未敢使用“em”。主要原因是,对其并不什么了解,只知道一点概念性的东西,前段时间在项目中要求使用“em”作为单位设置元素,所以从头对“em”学习了一回。稍为有一点理解,今天特意整理了一份博文与大家一起分享,希望对童子们有些许的帮助。 这篇教程将引导大家如何使用“em”来创建一个基本的弹性布局,从而学习其如何计算?又是如何使用“em”对层进行弹性扩展?又是如何扩展文本和图像等内容?下在我们就一起带着这些问题开始今.

Darcy的专栏 2765

html中的em等于多少像素,CSS中的em运用详解,1em等于多少像素?

使用CSS也好久了,但一直都是在使用“px”来设置Web元素的相关属性,未敢使用“em”。主要原因是,对其并不什么了解,只知道一点概念性的东西,前段时间在项目中要求使用“em”作为单位设置元素,所以从头对“em”学习了一回。稍为有一点理解,今天特意整理了一份博文与大家一起分享,希望对童子们有些许的帮助。这篇教程将引导大家如何使用“em”来创建一个基本的弹性布局,从而学习其如何计算?又是如何使用“e...

weixin_30844603的博客 1473

Oracle 配置EM

Oracle EM 配置

m0_49929446的博客 3939

oracle的em能干什么,Oracle入门之EM配置

ORACLE 11g R2 64位启动em,出现如下错误:[root@localhost ~]# su - oracle[oracle@localhost ~]$ emctl start dbconsoleEnvironmOracle 11g R2 64位启动em,出现如下错误:[root@localhost ~]# su - oracle[oracle@localhost ~]$ emctl s...

weixin_33583419的博客 724
上一篇: pandas 分组
下一篇: pandas 变形
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值