(十)EM算法

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348