(十)EM算法

作者: Pan_Ziheng | 来源:发表于2020-08-07 22:08 被阅读0次

1.EM算法是什么

 EM算法的英文全称是Expectation Maximization Algorithm——期望极大化算法,它采用迭代的方式逼近带隐变量的似然函数。通过对似然函数的一个下界求偏导,得到每一步参数估计的过程。
 这个名称由于缺乏作用对象,让人一头雾水。这里的期望是什么?为什么我们要极大化这个期望,我们试图优化什么?
 这里的期望的含义其实是针对极大似然估计中的似然函数来说的,这里的期望就是似然函数的一个下界,我们的目的是求这样一个期望: \theta^{(i+1)}=argmax\space E(log(P(x_{i},z_{j};\theta))) 这个下界是根据詹森不等式(Jensen's inequality)放缩得到的,为什么要放缩呢?因为我们试图找出一个下界,极大化这个带参数的下界之后,可以无限近似于似然函数。你想,如果这个做法ok的话,意味着什么?意味着我们可以通过这个过程找出极大似然估计或最大后验估计的参数近似解。这也意味着我们可以搞一个迭代法来得到一个近似解。但是即便我说的天花乱坠,这个下界要是不收敛那也白搭。而下界要收敛必须满足两个条件:
 1.这个下界的取值要单调递增(因为每回迭代的结果要比上一次的取值更大)
 2.这个下界必须有上界(这个上界就是对数似然函数,且这一点可以由詹森不等式保证,这个也是EM的核心)
大白话就是单调有界必有极限

EM算法收敛性证明:

我们来证明一下它确实是收敛的。
 首先,在极大似然估计中,我们的目的是根据手头上的n个样本,最大化P(X;\theta)后,将参数\theta估计出来;引入对数:\sum_{i=1}^{n} log(P(x_{i};\theta));x_{i}\in X;此时引入辅助变量Z;我们的对数似然函数就变成了:
\sum_{i=1}^{n} log(P(x_{i};\theta))=\sum_{i=1}^{n}log(\sum_{j=1}^{m}P(x_{i},z_{j};\theta))
设置变分函数:q(z_{j};\theta);那么:
L(\theta)=\sum_{i=1}^{n} log(P(x_{i};\theta))=\sum_{i=1}^{n}log(\sum_{j=1}^{m}P(x_{i},z_{j};\theta))\\ =\sum_{i=1}^{n}log(\sum_{j=1}^{m}(q(z_{j};\theta)*\frac{P(x_{i},z_{j};\theta)}{q(z_{j};\theta)}))
根据琴生不等式,对数函数为凸函数(因为\sum_{j=1}^{m}\sum_{i=1}^{n}q(z_{j};\theta^{(i)})=1:等号在\frac{P(x_{i},z_{j};\theta)}{q(z_{j};\theta)}为常数时取到):
\sum_{i=1}^{n}log(\sum_{j=1}^{m}(q(z_{j};\theta)*\frac{P(x_{i},z_{j};\theta)}{q(z_{j};\theta)})) \geq \sum_{j=1}^{m}\sum_{i=1}^{n}q(z_{j};\theta^{(i)})*log(\frac{P(x_{i},z_{j};\theta)}{q(z_{j};\theta^{(i)})})\\=\sum_{j=1}^{m}\sum_{i=1}^{n}q(z_{j};\theta^{(i)})*log(P(x_{i},z_{j};\theta))-\sum_{j=1}^{m}\sum_{i=1}^{n}q(z_{j};\theta^{(i)})*log(q(z_{j};\theta))
上面的这个下界,就是用来逼近原对数似然函数的,这里我们已经证明了算法收敛的一个条件,有界性;但是在继续进行下一步的时候,我们还有一个问题没搞清楚,那就是变分函数q的具体形式,实际上,我们可以通过琴生不等式等号成立的条件导出我们要的这个变分函数q。
C为常数:\frac{P(x_{i},z_{j};\theta)}{q(z_{j};\theta)}=C\\因为\sum_{j=1}^{m}q(z_{j};\theta)=1; 所以\sum_{j=1}^{m}P(x_{i},z_{j};\theta)=P(x_{i},\theta)=C;\\ 因此:q(z_{j};\theta)=\frac{P(x_{i},z_{j};\theta)}{C}=\frac{P(x_{i},z_{j};\theta)}{\sum_{j=1}^{m}P(x_{i},z_{j};\theta)}=\frac{P(x_{i},z_{j};\theta)}{P(x_{i},\theta)}=P(z_{j}|x_{i},\theta)
接着我们代入变分函数q的形式,定义这个下界的第一项:
Q(\theta|\theta^{(i)})=\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(P(x_{i},z_{j};\theta))
定义下界的第二项:
H(\theta|\theta^{(i)})=-\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(P(z_{j}|x_{i},\theta))
对于第二项,我们看看随着迭代步数的增大,它是否是递增的,
H(\theta^{(i+1)} |\theta^{(i)})-H(\theta^{(i)} |\theta^{(i)})\\ =-\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(P(z_{j}|x_{i},\theta^{(i+1)}))+\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(P(z_{j}|x_{i},\theta^{(i)}))\\ =\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(\frac{P(z_{j}|x_{i},\theta^{(i)})}{P(z_{j}|x_{i},\theta^{(i+1)})})\\=-\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(\frac{P(z_{j}|x_{i},\theta^{(i+1)})}{P(z_{j}|x_{i},\theta^{(i)})}) \\=KL(P(z_{j}|x_{i},\theta^{(i)})\space||\space P(z_{j}|x_{i},\theta^{(i+1)}))
我们将不同参数的P(z_{j}|x_{i},\theta^{(i+1)})P(z_{j}|x_{i},\theta^{(i)})看作是两个分布,那么这个结果实际上是一个KL散度,它表征两个分布的相似度,其结果总是大于等于0的。
大于等于0的原因:
因为-log为凹函数,根据琴生不等式:\\-\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(\frac{P(z_{j}|x_{i},\theta^{(i+1)})}{P(z_{j}|x_{i},\theta^{(i)})}) \geq -log(\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*\frac{P(z_{j}|x_{i},\theta^{(i+1)})}{P(z_{j}|x_{i},\theta^{(i)})})\\=-log(\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i+1)}))=-log(1)=0
所以:
H(\theta^{(i+1)} |\theta^{(i)})-H(\theta^{(i)} |\theta^{(i)})=KL(P(z_{j}|x_{i},\theta^{(i)})\space||\space P(z_{j}|x_{i},\theta^{(i+1)})) \geq 0
H为一个递增的序列,那么剩下的就是Q是否递增了,基于前面提到的这个下界是有上界的,上界就是我们的对数似然函数。在这个前提下,现在我们只要证明,Q递增是整个下界递增的充分必要条件即可。
必要性:
Q(\theta^{(i+1)}|\theta^{(i)})- Q(\theta^{(i)}|\theta^{(i)})\\=\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(P(x_{i},z_{j};\theta^{(i+1)}))-\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(P(x_{i},z_{j};\theta^{^{(i)}}))\\=\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(\frac{P(x_{i},z_{j};\theta^{^{(i+1)}})}{P(x_{i},z_{j};\theta^{^{(i)}})})\\=\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(\frac{P(z_{j}|x_{i},\theta^{(i+1)})*P(x_{i};\theta^{^{(i+1)}})}{P(z_{j}|x_{i},\theta^{(i)})*P(x_{i};\theta^{^{(i)}})})\\\geq log(\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i+1)})*\frac{P(x_{i};\theta^{^{(i+1)}})}{P(x_{i};\theta^{^{(i)}})})
当整个下界递增,即:{P(x_{i};\theta^{^{(i+1)}})}\geq{P(x_{i};\theta^{^{(i)}})}
那么:Q(\theta^{(i+1)}|\theta^{(i)})- Q(\theta^{(i)}|\theta^{(i)})\geq log(\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i+1)})*\frac{P(x_{i};\theta^{^{(i+1)}})}{P(x_{i};\theta^{^{(i)}})}) \geq 0
所以 Q单调递增,必要性得证。
充分性:
因为:log({P(x_{i};\theta^{^{(i+1)}})})-log({P(x_{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)})
前面已经证明:
H(\theta^{(i+1)}|\theta^{(i)})- H(\theta^{(i)}|\theta^{(i)})\geq 0
又因为:
Q(\theta^{(i+1)}|\theta^{(i)})- Q(\theta^{(i)}|\theta^{(i)})\geq 0
所以:
log({P(x_{i};\theta^{^{(i+1)}})})-log({P(x_{i};\theta^{^{(i)}})})\geq 0
即,在Q递增的情况下,整个下界递增。
充分性得证。
证毕。

回答最初的问题:

 这个算法名称里提及的期望究竟是什么?
我们说了这么多,实际都是要做一件事,那就是:
\theta^{(i+1)}=argmax\space Q(\theta|\theta^{(i)})
由于前面证明过整个下界有界。且只要找到让第i次迭代的Q函数最大的\theta作为下一次迭代的参数,我们就可以让Q递增,让算法收敛。
我们来看看Q的形式。
Q(\theta|\theta^{(i)})=\sum_{j=1}^{m}\sum_{i=1}^{n}P(z_{j}|x_{i},\theta^{(i)})*log(P(x_{i},z_{j};\theta))=E(log(P(x_{i},z_{j};\theta))) \\即:\theta^{(i+1)}=argmax\space E(log(P(x_{i},z_{j};\theta)))
这就是为什么叫期望最大算法的原因。

2.概率PCA的EM推导与应用

 我们以概率PCA,来展开EM的应用:
 当然这里的应用只涉及变分函数已知情况下的应用,并不涉及广义EM的内容,日后看完文献在来唠唠广义EM,AVE,GAN等内容。
 我们先来算一下PPCA的EM期望的形式:
E(log(P(x_{i},z_{j};\theta)))=E(log(P(x_{i}|z;\theta))+log(P(z;\theta)))
概率PCA中,我们有提到:
X-\mu|(Z,\sigma)\tilde{}N(WZ,\sigma^{2}I_{p})
Z\tilde{}N(0,I_{q})
所以:
log(P(x_{i}-\mu|z;\theta))=-log({(2\pi)^{-\frac{p}{2}}|\sigma^2I_{p}|^{\frac{1}{2}}}){-\frac{1}{2\sigma^2}\cdot (\vec{x_{i}}-\vec{\mu}-W\vec{z})^{T}(\vec{x_{i}}-\vec{\mu}-W\vec{z})}
log(P(z;\theta))=-log({(2\pi)^{-\frac{p}{2}}|\sigma^2I_{q}|^{\frac{1}{2}}}){-\frac{1}{2}\cdot \vec{z}^{T}\vec{z}}
所以期望里面是这个式子:
F=E[-log({(2\pi)^{-\frac{p}{2}}|\sigma^2 I_{p}|}){-\frac{1}{2\sigma^2}\cdot (\vec{x_{i}}-\vec{\mu}-W\vec{z})^{T}(\vec{x_{i}}-\vec{\mu}-W\vec{z})} -log({(2\pi)^{-\frac{p}{2}}|I_{q}|^{\frac{1}{2}}}){-\frac{1}{2}\cdot \vec{z}^{T}\vec{z}}]
我们的目的是要估计出W\sigma^2;那么我们分别对它们求偏导:
\frac{\partial F}{\partial W}=E(d[-\frac{1}{2\sigma^2}tr(\vec{z}^TW^TW\vec{z})+\frac{1}{2\sigma^2}tr(2\vec{z}^TW^T(\vec{x_{i}}-\vec{\mu}))])\\ =E(-\frac{1}{2\sigma^2}tr(\vec{z}^T(dW^T)W\vec{z})-\frac{1}{2\sigma^2}tr(\vec{z}^TW^T(dW)\vec{z})+\frac{1}{2\sigma^2}tr(2\vec{z}^T(dW^T)(\vec{x_{i}}-\vec{\mu}))])\\=E(-\frac{1}{\sigma^2}tr(W\vec{z}\vec{z}^T(dW^T))+\frac{1}{\sigma^2}tr((\vec{x_{i}}-\vec{\mu})\vec{z}^T(dW^T)))\\ =-E(\frac{1}{\sigma^2}tr([W\vec{z}\vec{z}^T-(\vec{x_{i}}-\vec{\mu})\vec{z}^T](dW^T)))\\=E(W\vec{z}\vec{z}^T-(\vec{x_{i}}-\vec{\mu})\vec{z}^T)=WE(\vec{z}\vec{z}^T)-(\vec{x_{i}}-\vec{\mu})E(\vec{z}^T)=0
所以:
W_{i+1}=(\vec{x_{i}}-\vec{\mu})E(\vec{z}^T)[E(\vec{z}\vec{z}^T)]^{-1}
\frac{\partial F}{\partial \sigma^2}=E(-\frac{1}{2\sigma^2}tr(I_{p}d\sigma^2)+\frac{1}{2}tr(Sd\sigma^2)+\frac{1}{2}tr(\vec{z}\vec{z}^TW^TW)-\frac{1}{2}tr(2(\vec{x_{i}}-\vec{\mu})\vec{z}^TW^T) )
因为:
(\vec{x_{i}}-\vec{\mu})E(\vec{z}^T)=W_{i+1}[E(\vec{z}\vec{z}^T)]
代入偏导中
\frac{\partial F}{\partial \sigma^2}=-\frac{1}{2\sigma^2}tr(I_{p}d\sigma^2)+\frac{1}{2}tr(Sd\sigma^2)+\frac{1}{2}tr(E(\vec{z}\vec{z}^T)W_{i+1}^TW_{i+1}d\sigma^2)-tr(W_{i+1}[E(\vec{z}\vec{z}^T)]W_{i+1}^T)d\sigma^2 )\\=-\frac{1}{2\sigma^2}tr(I_{p}d\sigma^2)+\frac{1}{2}tr(Sd\sigma^2)-\frac{1}{2}tr(E(\vec{z}\vec{z}^T)W_{i+1}^TW_{i+1}d\sigma^2)\\=-\frac{1}{2\sigma^2}p+\frac{1}{2}tr(S)-\frac{1}{2}tr(E(\vec{z}\vec{z}^T)W_{i+1}^TW_{i+1})=0
所以:
\sigma_{i+1}^2=\frac{1}{p}tr(S)-tr(E(\vec{z}\vec{z}^T)W_{i+1}^TW_{i+1})
我们偏导得到的结果就是:
W_{i+1}=(\vec{x_{i}}-\vec{\mu})E(\vec{z}^T)[E(\vec{z}\vec{z}^T)]^{-1}\\ \sigma_{i+1}^2=\frac{1}{p}tr(S)-tr(E(\vec{z}\vec{z}^T)W_{i+1}^TW_{i+1})
我们会发现我们还有两个估计量没解决,一个是一阶估计量E(\vec{z}^T),另一个是二阶估计量E(\vec{z}\vec{z}^T)
在概率PCA中,我们提到过:
(Z|X-\mu) \tilde{}N((W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu),\sigma^{2}(W^{T}W+\sigma^{2}I_{q})^{-1})
那么我们就有了一阶估计量:
E(z)=(W_{i}^{T}W_{i}+\sigma_{i}^{2}I_{q})^{-1}W_{i}^{T}(X-\mu)
二阶估计量可以通过简单的计算得到:
E(zz^{T})=\sigma_{i}^{2}(W_{i}^{T}W_{i}+\sigma_{i}^{2}I_{q})^{-1}-E(z^{T})E(z)\\=\sigma_{i}^{2}(W_{i}^{T}W_{i}+\sigma_{i}^{2}I_{q})^{-1}-(W_{i}^{T}W_{i}+\sigma_{i}^{2}I_{q})^{-1}W_{i}^{T}(X-\mu)(X-\mu)^{T}W_{i}(W_{i}^{T}W_{i}+\sigma_{i}^{2}I_{q})^{-1}
剩下的代入即可.

3.代码:

import numpy as np
class EM_Algorithm_For_PPCA:
    def __init__(self,data,q):
        self.X=data
        self.q=q
        self.n=np.shape(self.X)[0]
        self.p=np.shape(self.X)[1]
        self.H=np.identity(self.n)-(1/self.n)*np.ones([self.n,self.n])
        self.x_bar=np.average(self.X,axis=0)
        self.sigma_square=np.random.rand(1)
        self.W=np.random.random([self.p,self.q])
    def Moment_Calculation(self,x_i):
        self.inv_M=np.linalg.inv(self.W.T.dot(self.W)+self.sigma_square*np.identity(self.q))
        self.Ez=self.inv_M.dot(self.W.T).dot(np.array([x_i]).T-np.array([self.x_bar]).T)
        self.first_order_moment=self.Ez
        self.second_order_moment=self.sigma_square*self.inv_M+self.Ez.dot(self.Ez.T)
        return self.first_order_moment,self.second_order_moment
    def E_step(self,x_i): return self.Moment_Calculation(x_i)
    def M_step(self,x_i):
        self.x_i_minus_mu=(np.array([x_i]).T-np.array([self.x_bar]).T)
        self.Ez,self.Ez_EzT=self.E_step(x_i)
        self.W=(np.array([x_i]).T-np.array([self.x_bar]).T).dot(self.Ez.T).dot(np.linalg.inv(self.Ez_EzT))
        self.sigma_square=(1/self.p)*np.trace((1/self.n)*self.x_i_minus_mu.dot(self.x_i_minus_mu.T))-np.trace(self.Ez_EzT.dot(self.W.T.dot(self.W)))
        return self.W, self.sigma_square
    def iteration_step(self):
        for i,x_i in enumerate(self.X):
            self.W,self.sigma_square=self.M_step(x_i)
            print("The {} [info]: W = ".format(i),self.W,"  ","Sigma= ",self.sigma_square)
        return np.linalg.inv(self.W.T.dot(self.W)+self.sigma_square*np.identity(self.q)).dot(self.W.T).dot(self.X.T).dot(self.H)
if __name__ == '__main__':
    from sklearn.datasets import load_diabetes
    import seaborn as sns
    import matplotlib.pyplot as plt
    def plot(dfData):
        plt.subplots(figsize=(9, 9))
        sns.heatmap(dfData, annot=True, vmax=1, square=True, cmap="Blues")
        plt.show()
    data = load_diabetes()
    X = data["data"]
    EM=EM_Algorithm_For_PPCA(X,4)
    dimensional_reduction=EM.iteration_step()
    H=np.identity(np.shape(dimensional_reduction)[1])-(1/np.shape(dimensional_reduction)[1])*np.ones([np.shape(dimensional_reduction)[1],np.shape(dimensional_reduction)[1]])
    S=(1/np.shape(dimensional_reduction)[1])*dimensional_reduction.dot(H).dot(dimensional_reduction.T)

结果展示:


结果展示.png

相关文章

  • EM 算法

    参考: 从最大似然到EM算法浅解 (EM算法)The EM Algorithm EM算法及其推广学习笔记 EM算法...

  • (十)EM算法

    1.EM算法是什么  EM算法的英文全称是Expectation Maximization Algorithm——...

  • 再学习EM算法

    EM 算法是十大经典的机器学习算法,【PS:MC是二十世纪十大算法】 回顾下经典的EM算法,对其理解加深 1. 学...

  • EM算法

    EM算法作为数据挖掘领域十大经典算法之一,在统计学习领域也有诸多应用。EM算法(Expectation-maxim...

  • EM算法

    问题 1. 什么是EM 2. EM算法流程是怎么样的 3. EM算法的优缺点 1. EM算法介绍 EM算法...

  • 04 EM算法 - EM算法收敛证明

    03 EM算法 - EM算法流程和直观案例 八、EM算法收敛证明 EM算法的收敛性只要我们能够证明对数似然函数的值...

  • 01 EM算法 - 大纲 - 最大似然估计(MLE)、贝叶斯算法

    EM算法的讲解的内容包括以下几个方面: 1、最大似然估计2、K-means算法3、EM算法4、GMM算法 EM算法...

  • 十大经典算法(九)

    十、EM算法 最大期望算法(Expectation-maximization algorithm,又译为期望最大化...

  • EM算法

    EM算法 EM算法基本思想 ​ 最大期望算法(Expectation-Maximization algorit...

  • 机器学习(十):EM算法与GMM算法原理及案例分析

    一、简介 EM算法 最大期望算法(Expectation-maximization algorithm,简称EM,...

网友评论

    本文标题:(十)EM算法

    本文链接:https://www.haomeiwen.com/subject/tjwqdktx.html