机器学习笔记——EM算法
EM(期望最大,Expectation-Maximization)算法是一种常用的迭代优化算法,通常用于含有隐变量或不完全数据的问题中,旨在估计模型的参数,使得对观测数据的对数似然函数达到最大化。它广泛应用于混合高斯模型(GMM)、隐马尔可夫模型(HMM)、协同过滤等问题中。
# EM 算法的基本思想
EM 算法通过迭代地执行两个步骤:
- E 步(期望步,Expectation Step):在当前参数的基础上,计算隐含变量的期望值。
- M 步(最大化步,Maximization Step):给定隐含变量的期望值,最大化似然函数,重新估计模型参数。
这个过程会在 E 步和 M 步之间反复迭代,直到模型的参数收敛到一个局部最优解。
# EM 算法的核心步骤
假设我们有一些带有隐变量的数据,数据的联合分布为 P (X,Z∣θ),其中:
- X 是观测数据(可见数据)。
- Z 是隐变量(隐藏数据)。
- θ 是模型的参数,我们希望通过 EM 算法来估计这些参数。
EM 算法的目标是通过最大化对观测数据的似然函数来估计参数:
由于隐变量 Z 的存在,直接求解对数似然比较复杂,因此通过 EM 算法来迭代优化。具体步骤如下:
# 1. 初始化:
首先,我们对参数 θ 进行初始化。这些初始值可以随机选取或通过某些启发式方法得到。
# 2. E 步(期望步):
在 E 步中,给定当前模型参数 θ(t),计算隐变量的条件期望。直观上讲,这一步是计算在当前参数下,隐变量 Z 的可能取值。具体而言,E 步计算的是后验分布:
这相当于在当前参数 θ(t) 下,给定观测数据 X,计算 Z 的期望值,从而得到一个新的目标函数 Q (θ) 来表示。
# 3. M 步(最大化步):
在 M 步中,最大化步骤是通过更新参数 θ 来最大化上一步中计算得到的 Q (θ∣θ(t)):
这一优化过程可以被视为是寻找使得期望似然函数最大的参数。
# 4. 迭代过程:
重复执行 E 步和 M 步,直到参数 θ 的变化足够小(即达到某个收敛条件),或者对数似然函数的改进趋于停止。
# EM 算法的直观理解
- 初始参数:在初始参数下,模型对数据的描述可能不太准确,但给定参数后,我们可以计算隐含变量的期望值(E 步)。
- 隐变量的更新:基于当前参数的模型假设,推断每个数据点的隐变量(如在高斯混合模型中,这是每个数据点属于哪个高斯成分的概率)。
- 参数的更新:在给定隐变量的期望值后,最大化似然估计,更新模型参数,使模型更好地拟合观测数据(M 步)。
- 重复:这一过程反复执行,随着参数的更新,模型逐渐收敛到一个能解释数据的较优状态。
# EM 算法的应用示例
高斯混合模型(GMM) 是 EM 算法的典型应用场景。假设数据是由多个高斯分布混合生成的,我们不知道每个数据点来自哪个高斯分布。EM 算法帮助我们估计每个数据点属于哪个高斯分布(隐含变量),以及每个高斯分布的参数。
GMM 中的 EM 算法过程:
- 初始化:初始化每个高斯成分的均值、协方差矩阵和混合系数。
- E 步:根据当前的高斯成分参数,计算每个数据点属于每个高斯分布的概率(即计算隐含变量的期望值)。
- M 步:利用这些概率来更新每个高斯分布的参数(均值、协方差和混合系数)。
- 迭代:不断重复 E 步和 M 步,直到参数收敛。
# 优缺点
-
优点:
- 适用于隐变量模型,尤其是观测数据不完整或带有噪声的情况。
- 每次更新步骤都会增加对数似然函数的值,保证算法的收敛性。
-
缺点:
- EM 算法只能保证局部最优解,无法保证找到全局最优解。
- 对初始参数较为敏感,容易陷入局部最优。
- 在某些模型中,E 步可能计算复杂或涉及数值不稳定性。
# 总结
EM 算法通过两个步骤交替迭代:E 步估计隐变量的期望,M 步最大化期望似然函数,逐步优化模型参数。它是处理隐变量或不完全数据的一种常用方法,广泛应用于聚类分析、混合模型和隐马尔可夫模型等领域。
# 代码实现
# 高斯混合模型(GMM)中的 EM 算法
在这个例子中,我们有两组高斯分布的数据,并希望使用 EM 算法估计它们的参数。
# 代码说明
- 数据生成:我们生成了两组二维高斯分布的数据,分别表示两个类。
- EM 算法:
- E 步:在
e_step
函数中,给定当前参数(均值、协方差和权重),计算每个数据点属于每个高斯成分的后验概率(即责任度responsibilities
)。 - M 步:在
m_step
函数中,使用 E 步计算的责任度来更新每个高斯成分的参数(包括均值、协方差和混合系数)。 - 对数似然函数:在
compute_log_likelihood
中,我们计算了当前参数下数据的对数似然,用于判断算法是否收敛。
- E 步:在
- 迭代过程:EM 算法会不断执行 E 步和 M 步,直到对数似然函数收敛。
# 结果解释
最终输出的参数包括:
- 混合系数(weights):表示每个高斯成分的权重,即每个类的比例。
- 均值(means):每个高斯分布的中心位置。
- 协方差矩阵(covariances):描述每个高斯分布的形状和大小。
1 | import numpy as np |