EM算法:混合高斯模型的参数估计
1. 引言
在机器学习领域,参数估计是一个经常遇到的问题。当我们拥有一些观测数据,但是并不知道数据生成过程的具体参数时,我们就需要通过已有的观测数据来估计这些参数。EM算法(Expectation Maximization Algorithm)就是一种常用的参数估计方法,特别适用于混合高斯模型等概率模型的参数估计。
本文将介绍EM算法的基本原理,并用Python代码实现混合高斯模型参数的估计。
2. EM算法原理
EM算法是一种迭代算法,用于求解含有隐变量(latent variable)的概率模型的极大似然估计。其基本思想是通过迭代的方式,先从当前的参数估计出隐变量的期望(expectation),然后用这个期望来重新估计参数(maximization)。通过不断迭代,最终得到模型的最优参数估计。
具体来说,EM算法的步骤如下:
- 初始化模型参数;
- E步:根据当前的参数估计隐变量的期望;
- M步:根据上一步计算的隐变量期望,重新估计模型参数;
- 重复步骤2和步骤3,直到参数收敛。
3. 混合高斯模型
混合高斯模型是一种常用的概率模型,常用于对多个高斯分布进行建模。具体来说,混合高斯模型可以表示为多个高斯分布的线性组合,即
$$ p(x) = \sum_{k=1}^{K} \pi_k \cdot \mathcal{N}(x; \mu_k, \Sigma_k) $$
其中,$x$为随机变量,$\pi_k$表示第$k$个高斯分布的权重,$\mathcal{N}(x; \mu_k, \Sigma_k)$表示高斯分布的概率密度函数,$\mu_k$和$\Sigma_k$分别为第$k$个高斯分布的均值和协方差矩阵。
4. EM算法实现
下面我们将使用Python实现EM算法来估计混合高斯模型的参数。首先,我们需要导入相应的库:
import numpy as np
import matplotlib.pyplot as plt
然后,我们定义一个生成混合高斯分布的函数:
def generate_mixture_data(pi, mu, sigma, n):
"""
生成混合高斯分布的观测数据
"""
K = len(pi) # 高斯分布的个数
data = []
for _ in range(n):
k = np.random.choice(K, p=pi) # 根据权重选择高斯分布
sample = np.random.multivariate_normal(mu[k], sigma[k])
data.append(sample)
return np.array(data)
接下来,我们定义EM算法的具体实现:
def em_algorithm(data, K, max_iter=100):
"""
EM算法
"""
N, D = data.shape # 观测数据的维度
pi = np.ones(K) / K # 初始化权重
mu = np.random.rand(K, D) # 初始化均值
sigma = np.array([np.eye(D) for _ in range(K)]) # 初始化协方差矩阵
for _ in range(max_iter):
# E步
gamma = np.zeros((N, K))
for k in range(K):
gamma[:, k] = pi[k] * gaussian_pdf(data, mu[k], sigma[k])
gamma /= np.sum(gamma, axis=1, keepdims=True)
# M步
Nk = np.sum(gamma, axis=0)
pi = Nk / N
for k in range(K):
mu[k] = np.sum(gamma[:, k].reshape(-1, 1) * data, axis=0) / Nk[k]
x_mu = data - mu[k]
sigma[k] = np.dot((gamma[:, k