Skip to content

EM 算法

EM(Expectation-Maximization)算法用于含有隐变量的概率模型参数估计。它常用于高斯混合模型、隐马尔可夫模型等场景。

概念详解

假设观测变量为 X,隐变量为 Z,模型参数为 θ。我们希望最大化观测数据的对数似然:

logp(X|θ)=logZp(X,Z|θ)

由于求和在对数内部,直接优化通常困难。EM 算法通过两步迭代解决:

  • E 步:用当前参数估计隐变量后验分布。
  • M 步:在该后验分布下最大化完全数据似然的期望。

数学公式及其推导

引入任意分布 q(Z)

logp(X|θ)=logZq(Z)p(X,Z|θ)q(Z)

由 Jensen 不等式:

logp(X|θ)Zq(Z)logp(X,Z|θ)q(Z)

右侧称为证据下界:

L(q,θ)=Zq(Z)logp(X,Z|θ)Zq(Z)logq(Z)

E 步令 q(Z)=p(Z|X,θold),M 步最大化:

Q(θ,θold)=EZ|X,θold[logp(X,Z|θ)]θnew=argmaxθQ(θ,θold)

应用代码:一维高斯混合模型

python
import numpy as np

np.random.seed(0)
X = np.r_[np.random.normal(-2, 0.6, 100), np.random.normal(2, 0.8, 100)]
K = 2
pi = np.ones(K) / K
mu = np.array([-1.0, 1.0])
sigma = np.ones(K)

def normal_pdf(x, mu, sigma):
    return np.exp(-0.5 * ((x - mu) / sigma) ** 2) / (np.sqrt(2 * np.pi) * sigma)

for _ in range(50):
    gamma = np.zeros((len(X), K))
    for k in range(K):
        gamma[:, k] = pi[k] * normal_pdf(X, mu[k], sigma[k])
    gamma /= gamma.sum(axis=1, keepdims=True)

    Nk = gamma.sum(axis=0)
    pi = Nk / len(X)
    mu = (gamma * X[:, None]).sum(axis=0) / Nk
    sigma = np.sqrt((gamma * (X[:, None] - mu) ** 2).sum(axis=0) / Nk)

print("pi:", pi)
print("mu:", mu)
print("sigma:", sigma)

小结

EM 的本质是“先估计隐变量分布,再更新模型参数”。它保证观测似然不下降,但可能收敛到局部最优。