EM算法,超全解释

背景介绍

EM算法(Expectation-Maximization algorithm)是一种经典的统计学算法,最早由Arthur Dempster、Nan Laird和Donald Rubin三位学者于1977年提出。其原始目的是解决缺失数据(Missing Data)下的极大似然估计问题。

随着时间的推移,EM算法被广泛应用于各种领域,如机器学习、自然语言处理、图像处理、计算机视觉等。它的优秀的性能和有效性使得它成为目前最流行的参数估计算法之一。

值得一提的是,EM算法和Bayesian算法是两种具有代表性的统计算法,它们的发展历程和应用场景有相当的重叠。EM算法主要用于模型学习,Bayesian算法主要用于模型选择。两种算法的结合也在近年来的研究中越来越受到关注,并取得了不少成功。

算法流程

以下是EM算法的基本流程:

  1. 初始化概率模型参数,包括隐变量。
  2. E步:根据当前模型参数和观测数据,计算隐变量的后验概率分布。
  3. M步:根据隐变量的后验概率分布,计算模型参数的极大似然估计。
  4. 重复执行第2步和第3步,直到收敛或达到最大迭代次数。

其中,E步计算的是隐变量在给定当前模型参数下的后验概率分布,M步计算的是模型参数的极大似然估计值。

示例

以高斯混合模型(Gaussian Mixture Model,简称GMM)为例,介绍EM算法的应用。

首先,假设我们有一个由nnn个样本组成的观测数据集{x(1),x(2),⋯ ,x(n)}\{x^{(1)},x^{(2)},\cdots,x^{(n)}\}{x(1),x(2),,x(n)},每个样本x(i)x^{(i)}x(i)是一个kkk维向量。我们的目标是将这些样本分为CCC个类别,每个类别用一个高斯分布表示。

假设第ccc个类别的高斯分布的均值为μc\mu_cμc,协方差矩阵为Σc\Sigma_cΣc,混合系数为πc\pi_cπc。则该模型的概率密度函数可以表示为:

p(x;θ)=∑c=1CπcN(x;μc,Σc) p(x;\theta)=\sum_{c=1}^C\pi_c\mathcal{N}(x;\mu_c,\Sigma_c) p(x;θ)=c=1CπcN(x;μc,Σc)

其中,θ={π1,μ1,Σ1,⋯ ,πC,μC,ΣC}\theta=\{\pi_1,\mu_1,\Sigma_1,\cdots,\pi_C,\mu_C,\Sigma_C\}θ={π1,μ1,Σ1,,πC,μC,ΣC}表示模型参数。

EM算法的流程如下:

1. E步

计算第iii个样本属于第ccc个类别的后验概率:

wc(i)=πcN(x(i);μc,Σc)∑j=1CπjN(x(i);μj,Σj) w^{(i)}_c=\frac{\pi_c\mathcal{N}(x^{(i)};\mu_c,\Sigma_c)}{\sum_{j=1}^C\pi_j\mathcal{N}(x^{(i)};\mu_j,\Sigma_j)} wc(i)=j=1CπjN(x(i);μj,Σj)πcN(x(i);μc,Σc)

2. M步

根据上一步计算得到的后验概率,分别计算每个类别的参数的极大似然估计值:

πc=1n∑i=1nwc(i)μc=∑i=1nwc(i)x(i)∑i=1nwc(i)Σc=∑i=1nwc(i)(x(i)−μc)(x(i)−μc)⊤∑i=1nwc(i) \begin{aligned} \pi_c &= \frac{1}{n}\sum_{i=1}^nw^{(i)}_c \\ \mu_c &= \frac{\sum_{i=1}^n w^{(i)}_c x^{(i)}}{\sum_{i=1}^n w^{(i)}_c} \\ \Sigma_c &= \frac{\sum_{i=1}^n w^{(i)}_c (x^{(i)}-\mu_c)(x^{(i)}-\mu_c)^\top}{\sum_{i=1}^nw^{(i)}_c} \end{aligned} πcμcΣc=n1i=1nwc(i)=i=1nwc(i)i=1nwc(i)x(i)=i=1nwc(i)i=1nwc(i)(x(i)μc)(x(i)μc)

3. 重复执行E步和M步,直到收敛或达到最大迭代次数。

代码

应用

1-数据聚类:EM算法可以用来聚类,尤其是在数据中存在缺失数据或混合分布的情况下。例如,通过EM算法,可以将一组样本分成若干个聚类,每个聚类用一个高斯分布来描述。

2-图像分割:EM算法可以用来对一幅图像进行分割,将图像中的像素点分成若干类。例如,对于一幅包含不同色彩物体的图像,通过EM算法,可以将这些物体分成不同的类别,便于进一步进行图像处理、目标跟踪等任务。

3-自然语言处理:EM算法可以用来处理自然语言中的语法分析、词性标注等问题。例如,通过对一组文本进行EM算法分析,可以得到各个词汇的词性,帮助人们更好地理解文本的含义。

4-机器学习:EM算法在机器学习中也有广泛应用。例如,在分类问题中,通过EM算法,可以将样本分成若干个类别,并且确定每个类别的概率分布。这些概率分布可以用来预测新样本的类别。

代码

以下是一个简单的EM算法的Python代码实现,用于解决高斯混合模型的参数估计问题:

import numpy as np

# 定义高斯分布函数
def gaussian(x, mu, sigma):
    return 1 / (np.sqrt(2 * np.pi) * sigma) * np.exp(-(x - mu) ** 2 / (2 * sigma ** 2))

# EM算法
def EM(X, K):
    # 初始化模型参数
    N, d = X.shape
    pi = np.ones(K) / K
    mu = np.random.rand(K, d)
    sigma = np.ones((K, d))

    # 迭代求解
    for t in range(100):
        # E步骤:计算每个样本属于每个分布的概率
        Z = np.zeros((N, K))
        for i in range(N):
            for j in range(K):
                Z[i][j] = pi[j] * np.prod(gaussian(X[i], mu[j], sigma[j]))

        # 归一化
        Z = Z / np.sum(Z, axis=1, keepdims=True)

        # M步骤:更新模型参数
        Nk = np.sum(Z, axis=0)
        pi = Nk / N
        for j in range(K):
            mu[j] = np.sum(Z[:, j].reshape((-1, 1)) * X, axis=0) / Nk[j]
            sigma[j] = np.sqrt(np.sum(Z[:, j].reshape((-1, 1)) * (X - mu[j]) ** 2, axis=0) / Nk[j])

    return pi, mu, sigma

该代码接受一个Nxd的数据矩阵X和聚类数K作为输入,返回高斯混合模型的参数(混合系数π、均值μ和标准差σ)。其中,第一步是初始化模型参数,然后进入EM算法迭代过程,对于每次迭代,通过E步骤计算每个样本属于每个分布的概率,然后通过M步骤更新模型参数。最后,返回迭代结束后的模型参数。

该代码实现仅适用于均值和方差相同的高斯分布。如果需要应用于均值和方差不同的高斯分布,则需要对代码进行适当的修改。

总结

本文介绍了EM算法的基本流程及其在高斯混合模型中的应用。EM算法是一种求解含有隐变量的概率模型参数的迭代算法,已经广泛应用于信号处理、计算机视觉、自然语言处理等领域。希望本文能够对读者有所帮助。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐