返回
从似然函数到 EM 算法:深入理解和代码实现
人工智能
2023-10-17 22:28:42
引言
在机器学习和统计建模领域,似然函数和 EM 算法扮演着至关重要的角色。似然函数量化了给定观测值下参数的可能性,而 EM 算法则是一种强大的迭代算法,用于寻找参数的最大似然估计。本文将深入探讨似然函数和 EM 算法的概念,并提供详细的代码实现。
似然函数
似然函数衡量了在给定观测数据的情况下,模型参数的可能性。它表示为:
L(θ | x) = P(x | θ)
其中:
- L(θ | x) 是参数 θ 的似然函数
- P(x | θ) 是在参数 θ 下观测到数据 x 的概率
似然函数的值越高,表明参数 θ 越有可能是数据的生成源。
EM 算法
EM 算法(期望最大化算法)是一种迭代算法,用于寻找参数的最大似然估计。它适用于包含无法观测的隐性变量的概率模型。
EM 算法包括两个交替步骤:
- E 步(期望步骤): 计算在当前参数估计值下隐性变量的后验概率的期望。
- M 步(最大化步骤): 最大化似然函数,将隐性变量的期望值作为给定值。
通过交替进行 E 步和 M 步,EM 算法可以逐渐收敛到参数的最大似然估计值。
代码实现
以下 Python 代码提供了 EM 算法的简化实现,用于估计高斯混合模型(GMM)的参数:
import numpy as np
import scipy.stats as stats
class GMM:
def __init__(self, k):
self.k = k
self.means = np.random.randn(k, 2)
self.covs = np.array([np.eye(2)] * k)
self.weights = np.ones(k) / k
def e_step(self, x):
# 计算后验概率
p_x_given_z = np.zeros((x.shape[0], self.k))
for i in range(self.k):
p_x_given_z[:, i] = stats.multivariate_normal.pdf(x, mean=self.means[i], cov=self.covs[i])
p_z_given_x = p_x_given_z * self.weights / np.sum(p_x_given_z * self.weights, axis=1)[:, np.newaxis]
return p_z_given_x
def m_step(self, x, p_z_given_x):
# 更新参数
self.weights = np.mean(p_z_given_x, axis=0)
for i in range(self.k):
self.means[i] = np.average(x, weights=p_z_given_x[:, i])
self.covs[i] = np.cov(x, rowvar=False, aweights=p_z_given_x[:, i])
def fit(self, x, max_iter=100):
for _ in range(max_iter):
p_z_given_x = self.e_step(x)
self.m_step(x, p_z_given_x)
def predict(self, x):
# 计算后验概率
p_x_given_z = np.zeros((x.shape[0], self.k))
for i in range(self.k):
p_x_given_z[:, i] = stats.multivariate_normal.pdf(x, mean=self.means[i], cov=self.covs[i])
p_z_given_x = p_x_given_z * self.weights / np.sum(p_x_given_z * self.weights, axis=1)[:, np.newaxis]
return np.argmax(p_z_given_x, axis=1)
应用
EM 算法广泛应用于各种机器学习和统计建模任务,包括:
- 聚类分析
- 混合模型估计
- 隐马尔可夫模型(HMM)
- 自然语言处理
结论
似然函数和 EM 算法是概率建模和机器学习的基础工具。似然函数提供了量化参数可能性的方法,而 EM 算法则提供了一种有效的迭代方法来寻找参数的最大似然估计值。通过深入理解这些概念和实施代码实现,数据科学家和机器学习从业者可以有效地解决各种现实世界问题。