EM Algorithm

#Expectation Maximization Algorithm EM算法和以前学的都不太同样,EM算法更多的是一种思想,因此后面用几个例子讲解,同时也会重点讲解GMM高斯混合模型。 ###①极大似然估计 极大似然估计这里面用的比较多。假设咱们想要知道咱们学生身高的分布,首先先假设这些学生都是符合高斯分布$$N(μ, σ^2)$$咱们要作的就是要估计这两个参数究竟是多少。学生这么多,挨个挨个来确定是不切实际的,因此天然就是抽样了。 为了统计学生身高,咱们抽样200我的组成样本git

X = {x_1,x_2,x_3,x_4,...x_{200}}

咱们须要估计的参数$$θ = [μ, σ]^T$$ 首先估计一下抽到这两百人的几率一共是多少,抽到男生A的几率github

P(x_A|θ)$$抽到学生B的几率$$P(x_B|θ)$$因此同时抽到这两个学生的几率就是$$P(x_A|θ) * P(x_B|θ)

那么同时抽到这200个学生的G几率$$L(θ) = L(x_1,x_2,x_3...,x_200;θ) = \prod_{i=1}^{200}P(x_i|θ)$$ 最后再取一个对数就行了:算法

H(θ) = \sum_{i=1}^{200}InP(x_i|θ)

####notation和log 上面有一条公式里面是同时存在了;和|,这两个符号差异其实有点大的。**|通常咱们是用来表示条件几率,好比$$P(x|θ)$$就是表示x在θ的条件下发生的几率。框架

P(A|B) = \frac{P(A,B)}{P(B)}

也是一个意思。 分号;表示的就是表示后面的是待估计的参数,也就是说P(x;θ)意思就是后面的θ是须要估计的参数而不是条件,因此|也有另外一层意思,若是不是表示条件几率,那么就是表示后面有待估计参数。 固然是在|不表示条件几率的状况下。** 这两种表示法是源于两种学派的不一样理解: 频率派认为参数为固定的值,是指真实世界中,参数值就是某个定值。 贝叶斯派认为参数是随机变量,是指取这个值是有必定几率的。固然,不管是;仍是|,他们都是表示条件几率的意思,只不过这两个学派理解不同而已。 notation的问题解决了以后就是log的问题了,为何须要log化,讲道理,是不须要的。可是求log有这么几个好处: 1.计算简单,累乘是很难计算的,log以后能够变换成累加。 2.几率累乘是会出现数字很是小的状况,log以后就能够避免这种状况。 3.log以后函数的梯度方向是没有变化的,对于函数优化的方向影响很小。dom

似然函数的执行步骤: 1.获得似然函数 2.取对数整理 3.求导数,另导数为零 4.解方程获得解函数

###②Jensen不等式 首先引出凸函数的概念$$f(x)^{''} > 0$$那么就是凸函数,因此它的图像就是一个勾形的,看起来是一个凹函数,其实是凸函数。 学习

凸函数的性质很显而易见了$$E[f(x)] >= f(E(x))$$
其实很明显的,看图就知道了,E(x)其实就是a到b的平均值,上面的结论很容易证明。那么若是想要取到等号,须要改变上面?取等号的意思就是相切,相切的意思就是a = b,既然a = b了,那么x天然就是常数了,因此当且仅当$$P(x = E(x)) == 1$$若是是凹函数,那么就是方向相反了。 ###③EM算法的推导 正常来看先是要引入一个最大似然函数:$$L(θ) = \sum_{i=1}^{n}logP(x;θ)$$但这样实际上是和难求的,P(x|θ)彻底混在了一块儿,根本求不出来,因此咱们要引入一个辅助变量z。

####隐变量Z 隐变量是观测不到的,好比作一个抽样,从3个袋子里面抽取小球。而抽取这些小球的过程是不可见的,抽取的过程其实就是隐变量,而这些隐变量,也就是过程能够告诉咱们这个x是从哪一个袋子来的,由此来区分。这个隐变量和HMM里面的隐含序列不是一个东西,隐含序列是当前x的状态,而不是抽取x的过程。因此在这里,通俗点讲,这个z就是用来找到x的组类的,也就是说z来告诉这个x你是属于哪一组的。 另外须要注意的是,隐变量是不能够随便添加的,添加隐变量以后不能影响边缘几率。也就是说,原来是P(x),添加以后就是P(x,z),那么必须有:P(x) = \int_zP(x, z){\rm dz}优化

因此咱们引入隐变量的缘由是为了转化成和这几个高斯模型相关的式子,不然无从下手。化简一下上式子:$$L(θ) = \sum_{i=1}^{n}logP(x;θ)=\sum_{i=1}^{n}log\sum_zP(x, z;θ)$$既然z能够指定x,那么咱们只须要求解出z就行了。 注意上面凸函数所提到的一个指望性质,这里就可使用了。由于虽然优化了上面的式子,仍是不能求出来,由于z变量实在是太抽象了,找不到一个合适的公式来表示它。EM的一个方法就是用优化下界函数的方法来达到优化目标函数的目的。 既然z很抽象,那么咱们就须要一个转变一下。对于每个样例x都会对应一个z,那么假设一个分布Q(z)是知足了z的分布的,而Q(z)知足的条件是\sum_zQ_i(z) == 1,Q_i(z) > 0Qi意味着每个x对应的z都会对应着一个Q了,这里有点复杂,再详细解释一下。一个x对应一组z,z是一个向量,可是每个z又会分别对应一个一个分布Q。觉得最后获得的z不会是一个数字,而是一个几率,也就是说Q(z)获得的是这个x样例属于这个类别的几率是多少。而z的数量,一个是当前有多少个分布混合在一块儿的数量。 再梳理一下:如今的样本是xi,那么每个xi将会对应着一组的z,每个xi同时也会对应着一个分布Qi,z其实就是反应了这个样本是来自于哪一个分布的。好比这个x是A1分布作了3,A2分布作了5,那么z可能就是={3,5}。因此Qi(z)获得的是这个x属于这些个分布的几率,也就是说这些分布对x作了多少百分比的功,天然就是要等于1了。 还要注意的是,上面的\sum_zQ_i(z) = 1这个并不能获得Qi(z)就是分布对x作了多少功的结论,获得这个结论是后面下界函数与目标函数相等获得的。这里只是知道了总和等于1,由于是分布的总和嘛。 如今就到了公式的化简:$$\sum_ilogP(x^{(i)};θ) = \sum_ilog\sum_{z^{(i)}}P(x^{(i)},z^{i};θ) = \sum_ilog\sum_{z^{(i)}}Q_i(z^{(i)})\frac{P(x^{i},z^{i};θ)}{Q_i(z^{(i)})}$$ 仔细看一下这个式子$$\sum_zQ_i(z^{(i)})\frac{P(x^{i},z^{i};θ)}{Q_i(z^{(i)})}$$这个式子其实就是求\frac{P(x^{i},z^{i};θ)}{Q_i(z^{(i)})}的指望,假设\frac{P(x^{i},z^{i};θ)}{Q_i(z^{(i)})} = x,那么能够利用上面E[f(x)] >= f(E(x))。因而化简:.net

\sum_ilog\sum_{z^{(i)}}Q_i(z^{(i)})\frac{P(x^{i},z^{i};θ)}{Q_i(z^{(i)})} >= \sum_i\sum_{z^{(i)}}Q_i(z^{(i)})log\frac{P(x^{i},z^{i};θ)}{Q_i(z^{(i)})}$$这个时候就获得了下界函数,上面也讲过了,想要相等,天然就是x要是常数,因此$$\frac{P(x^{i},z^{i};θ)}{Q_i(z^{(i)})} = c$$既然$\sum_zQ_i(z) = 1$,并且z也是同样的,由于一个样本嘛。因此上下加和(若是是离散的,那就sum一下,连续的那就积分,这里是离散的,因此就是sum一下)。因而有$$\frac{\sum_zP(x^i,z^i;θ)}{\sum_zQ_i(z^i)} = c

因而有: 3d

因此Q(z)计算的是后验几率。计算在当前参数θ和已经抽样到x的条件下,这个x是从z来的几率。其实就是z对x作了多少贡献。 因此整个EM算法步骤就很清晰了:

####EM算法计算步骤: E-step: 对于每个x_i,求Q_i^{(t)}(z) = P(z^i|x^i;θ^{(t)}) M-step: θ = argmax_θ\sum_i\sum_{z^{(i)}}Q_i(z^i)log\frac{P(x^i,z^i;θ)}{Q_i(z^i)} 这时候就可使用求导迭代的方法求解了。

这就是整一个EM算法的框架了,能够看到其实没有比较具体的算法,大体上就是一个框架。那么问题来了,怎么样证实这东西是一个收敛的??

####证实EM算法的收敛性 既然是极大似然估计,那么须要证实的天然就是L(θ^{t}) <= L(θ^{(t+1)}),也就是说极大似然估计要单调递增。由于每一次都是极大,那么随着时间增长,天然就是要增大的了。 当给定一个θ^{(t)}的时候,至关于t时间的EM算法进行了E步了,因此有:

L(θ^{t}) = \sum_i\sum_{z^{(i)}}Q_i^{t}(z^i)log\frac{P(x^i,z^i;θ^{t})}{Q_i(z^i)}$$而后就走M步,M步以前尚未求最大,因此:$$L(θ^{(t+1)}) >= \sum_i\sum_{z^i}Q_i^{(t)}(z^i)log\frac{P(x^i,z^i;θ^{(t+1)})}{Q_i(z^i)}$$**这一步有点复杂,这里是M-step了,$θ^{(t+1)}$是L(θ)求极大值获得的,而最重要的是L和后面下界函数的关系。这两个东西是不相等的,下界函数等于目标函数的条件是x为constant,x == constant意味着Q得求出来,这里看这个Q貌似是出来了,可是这个Q是$Q^t_i$,是上一个时刻的,而不是这个时刻的,因此t+1时刻Q尚未被固定住,也就是没有知足x == constant的条件,因此下界函数小于等于目标函数。接下来就简单了,直接把$θ^{(t+1)}$换成$θ^{(t)}$就行了。**![](https://upload-images.jianshu.io/upload_images/10624272-e4c4d749e2aa0ded.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这样就证实了收敛性。

>>####EM algorithm的优化方法:
>>以前讨论过,这种方法是迭代,使用极大似然估计和迭代的方法来进行优化,但实际上这更像是一种坐标上升的方法:
![](https://upload-images.jianshu.io/upload_images/10624272-544bd237ec99baf9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
一次固定一个变量,对另外的求极值,最后逐步逼近极值。对应到EM上,E步:固定 θ,优化Q;M步:固定 Q,优化 θ;交替将极值推向极大。Kmeans也是这样更新的,固定中心点,优化Ein;优化完成,更新中心点。SMO也是,固定$α_{3-n}$更新α1和α2。

#④GMM的推导
能够直接把高斯混合模型代入EM框架里面。
**存在多个高斯分布混合生成了一堆数据X,取各个高斯分布的几率是$φ_1,φ_2,φ_3,...$**,第i个高斯分布的均值是$μ_i$,方差是$σ$,求法φ,μ,σ。
按照套路,第一个E-step求出Q,因而有:$$w_j^{(i)} = Q_i(z^{(i)} = j) = P(z^{i} = j |x^i;φ,μ,Σ)

意思就是求出第i个样本属于第j个分布的几率是多少。以后就是M-step了,就是化简了:

\sum_{i=1}^m\sum_{z^{(i)}}Q_i(z^{(i)})log\frac{p(x^i,z^i;φ,μ,Σ)}{Q_i(z^{(i)})}=\sum_{i=1}^m\sum_{j=1}^kQ_i(z^i = j)log\frac{P(x^i|z^i = j;μ,Σ)P(z^i = j;φ)}{Q_i(z^i = j)}

这里可能须要解释一下,根据P(A|B) = P(AB)P(B)至于条件,由于很明显,z是隐变量,只是指明了x是属于哪一个类别,和μ,Σ没有什么关系,因此直接忽略那两个参数了,因此P(z)是没有那两个参数的,z是表明了分布,因此每个分布的几率确定是包括了,因此就只有一个几率的参数。P(x|z)是自己的几率,就是已经知道分布是那个了,求属于这个分布的几率是多少,既然已经选定了分布那么天然就不须要再看φ了,由于φ是各个分布的几率。

以后就是求导数了:
导数等于0,因而有:$$μ_j = \frac{\sum_{i=1}^mw_j^{(i)}x^{(i)}}{\sum_{i=1}^{m}w_j^{(i)}}$$μ就出来了。 对于φ,那就简单了,实际上须要优化的式子:

\sum_{i=1}^{m}\sum_{j=1}^{k}w_j^{i}logφ_j$$求导等于0。
要注意的是φ还有一个条件:$\sum_{j=1}^{k}φ_j = 1$。有条件,那么问题来了,不能直接求导,因此只能用拉格朗日乘子法求解,因而构造式子:$L(φ) = \sum_{i=1}^{m}\sum_{j=1}^{k}w_j^ilogφ_j + β(\sum_{j=1}^{k}φ_j - 1)$
接着求导$\sum_{i=1}^{m}\frac{w_j^{(i)}}{φ_j}+β = 0$。因而获得$φ_j = \frac{\sum_{i=1}^{m}w_j^{i}}{-β}$,再改变一下,两边加和,获得$\sum_{j=1}^{k}φ_j = \frac{\sum_{i=1}^{m}\sum_{j=1}^{k}w_j^{(i)}}{-β}$,这个就简单了,$\sum_{j=1}^{k}w_j^i = 1$,因此-β = m。那么:
![](https://upload-images.jianshu.io/upload_images/10624272-e76886d2bd920041.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Σ也是同样:
![](https://upload-images.jianshu.io/upload_images/10624272-735036c5f3e898e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这样整个推导就算结束了。
#⑤硬币模型
如今有两个硬币AB,进行5次试验每一次投10次,并不知道是哪一个硬币投的,求两种硬币的正面的几率。
首先E-step:
首先先初始化一下,$θ_A = 0.6,θ_B = 0.5$
第一个试验选中A的几率:
$$P(z = A|x_1;θ) = \frac{P(z = A,x_1|θ)}{P(z = A,x_1|θ)+P(z = B,x_1|θ)} = \frac{(0.6)^5*(0.4)^5}{(0.6)^5*(0.4)^5 + (0.5)^{10}} = 0.45$$一样求得$P(z = B|x_1;θ) = 0.55$
计算机出每个试验的几率而后相加求均值。
以后就是M-step了:
![](https://upload-images.jianshu.io/upload_images/10624272-2d21573def70f1f6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
$μ_j$表示选择了A的几率,$1-μ_j$表示选择了B的几率。以后就是求导更新了。
#⑥代码实现
方差的求解就不玩了,主要就是迭代求解μ和φ的值了。
首先是生成数据,4个高斯分布,每个高斯分布的sigma都是同样的,不同的只有μ和α,也就是φ,习惯上把前面的一个参数叫作权值,因此用α来表示。
```
def generate_data(sigma, N, mu1, mu2, mu3, mu4, alpha):
    global X
    X = np.zeros((N, 2))
    X = np.matrix(X)
    global mu
    mu = np.random.random((4, 2))
    mu = np.matrix(mu)
    global expect
    expect = np.zeros((N, 4))
    global alphas
    alphas = [0.25, 0.25, 0.25, 0.25]
    for i in range(N):
        if np.random.random(1) < 0.1:
            X[i, :] = np.random.multivariate_normal(mu1, sigma, 1)
        elif 0.1 <= np.random.random(1) < 0.3:
            X[i, :] = np.random.multivariate_normal(mu2, sigma, 1)
        elif 0.3 <= np.random.random(1) < 0.6:
            X[i, :] = np.random.multivariate_normal(mu3, sigma, 1)
        else:
            X[i, :] = np.random.multivariate_normal(mu4, sigma, 1)
    plt.title('Generator')
    plt.scatter(X[:, 0].tolist(), X[:, 1].tolist(), c = 'b')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.show()
```
这四个模型的比例分别是1:2:3:4,使用EM来找到他们属于的类别。
![](https://upload-images.jianshu.io/upload_images/10624272-ed6bdb6587db87d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
其实若是用kmeans聚类的话更加快速,可是这里仍是用EM。
E-step:
```
def e_step(sigma, k, N):
    global X
    global mu
    global expect
    global alphas
    for i in range(N):
        W = 0
        for j in range(k):
            W += alphas[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(k):
            w = math.exp(-(X[i, :] - mu[j, :]) * sigma.I * np.transpose(X[i, :] - mu[j, :])) / np.sqrt(np.linalg.det(sigma))
            expect[i, j] = alphas[j]*w/W
            pass
```
就是按照公式来求解w便可,求解每个分布对样本点作了多少的功,以后求单个样本点求比例。
M-step:
```
def m_step(k, N):
    global expect
    global X
    global alphas
    for j in range(k):
        mathor = 0
        son = 0
        for i in range(N):
            son += expect[i, j]*X[i, :]
            mathor += expect[i, j]
        mu[j, :] = son / mathor
        alphas[j] = mathor / N
```
直接按照公式优化便可。
```
if __name__ == '__main__':
    iterNum = 1000
    N = 500
    k = 4
    probility = np.zeros(N)
    mu1 = [5, 35]
    mu2 = [30, 40]
    mu3 = [20, 20]
    mu4 = [45, 15]
    sigma = np.matrix([[30, 0], [0, 30]])
    alpha = [0.1, 0.2, 0.3, 0.4]
    generate_data(sigma, N, mu1, mu2, mu3, mu4, alpha)
    for i in range(iterNum):
        print('iterNum : ', i)
        err = 0
        err_alpha = 0
        Old_mu = copy.deepcopy(mu)
        Old_alpha = copy.deepcopy(alphas)
        e_step(sigma, k, N)
        m_step(k, N)
        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] - alphas[z])
        if (err <= 0.001) and (err_alpha < 0.001):
            print(err, err_alpha)
            break
    color = ['blue', 'red', 'yellow', 'green']
    markers  = ['<', 'x', 'o', '>']
    order = np.zeros(N)
    for i in range(N):
        for j in range(k):
            if expect[i, j] == max(expect[i, ]):
                order[i] = j
        plt.scatter(X[i, 0], X[i, 1], c = color[int(order[i])], alpha=0.5, marker=markers[int(order[i])])
    plt.show()
    print('standedμ:',mu4, mu3, mu2, mu1)
    print('standedα:',alpha)
    print('new μ:', mu)
    print('new α:',alphas)
```
运行函数。看看结果:
![](https://upload-images.jianshu.io/upload_images/10624272-a85506d016bce0bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/10624272-5cf9e38f6ac2a4e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
结果其实仍是相差不大。达到预期。

#⑦EM的另外一种理解方法
上面所讲的其实只是一种理解方法,在李航老师的统计学习方法里面是另外一种比较厉害的解法:
**1.E-step:求出Q函数。
2.M-step:利用Q函数求极大值。**
**其实这两种方法是彻底同样的,Q函数就是下界函数,![](https://upload-images.jianshu.io/upload_images/10624272-1c18b5cacb8882f9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)这个公式和上面的:![](https://upload-images.jianshu.io/upload_images/10624272-94b9cd251a48dcf1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)是同样的,至于为何有下面这个$Q_i(z^i)$![](https://upload-images.jianshu.io/upload_images/10624272-3c3ac6b0ff7f9663.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)这是李航老师书上的,既然θ是已经知道了,那么天然就能够去掉,由于在log下面作分母就至关因而常数了,拆开能够变减号嘛,在前面的就不能够。回来看看咱们刚刚推导的,实际上是同样的,下面的那个Q确实能够去掉,由于是事先知道的了。在使用Jensen不等式的时候,须要假设隐变量服从某种形式的几率分布,才能够将推导过程的一部分当作是指望的表达形式从而应用Jensen不等式。然而这个分布不是随便指定的。咱们令Jensen不等式取等号的时候,能够计算出这个分布其实就是:已知观测数据的隐变量的后验几率分布。因为求Q函数须要先求出隐变量的后验几率的指望,所以,这就能够解释为何EM算法的“通俗”理解角度的E步骤是求隐变量的指望了。有时候在用EM算法解决某个具体问题的时候,会发现M步骤极大化的竟然是彻底数据的对数似然函数。这是由于,Q函数虽然是彻底数据的对数似然函数的某种指望,可是求这个指望的过程有时其实就是将隐变量的后验几率的指望代入就能够了。所以,本质上咱们其实仍是在求Q函数的极大。**
**事实上,李航老师的Estep求出Q函数,其实就是通俗理解里面的求出Q(z)并代入下界函数的过程。由于求出Q(z)就至关于这个Q(z)被固定了,能够去掉了,因而就和李航老师的式子同样了。有机会再补一些李航老师的推导,勃大精深。**
#⑧总结
**EM和Kmeans算法其实很相似,事实上步骤基本能够用EM框架来替换,可是Kmeans算法是硬分类,说一是一,可是EM算法不太同样,是软分类,百分之几是那个,百分之几是这个。** 

**缺点也仍是有的:初值敏感,局部最优。由于存在了隐变量,因此致使了直接对x作极大似然是不可行的,log已经在sum的外面了。因此EM算法就转向了下界函数,而这种方法原本就不保证找到局部最优解。**

**若是将样本看做观察值,潜在类别看做是隐藏变量,那么聚类问题也就是参数估计问题。若是一个目标函数存在多个变量,那么梯度降低牛顿法这些逼近方法就用不了了。但咱们可使用坐标上升方法,固定一个变量,对另一个求导数,而后替换最后逐步逼近极值点。对应到EM算法也是同样,E步求隐含的z变量,Mstep求解其余参数。**

>>####最后符上GitHub代码:
>>**https://github.com/GreenArrow2017/MachineLearning/tree/master/MachineLearning/ExpectationMaximization**
相关文章
相关标签/搜索