EM算法:混合高斯模型的参数估计

1. 引言

在机器学习领域,参数估计是一个经常遇到的问题。当我们拥有一些观测数据,但是并不知道数据生成过程的具体参数时,我们就需要通过已有的观测数据来估计这些参数。EM算法(Expectation Maximization Algorithm)就是一种常用的参数估计方法,特别适用于混合高斯模型等概率模型的参数估计。

本文将介绍EM算法的基本原理,并用Python代码实现混合高斯模型参数的估计。

2. EM算法原理

EM算法是一种迭代算法,用于求解含有隐变量(latent variable)的概率模型的极大似然估计。其基本思想是通过迭代的方式,先从当前的参数估计出隐变量的期望(expectation),然后用这个期望来重新估计参数(maximization)。通过不断迭代,最终得到模型的最优参数估计。

具体来说,EM算法的步骤如下:

  1. 初始化模型参数;
  2. E步:根据当前的参数估计隐变量的期望;
  3. M步:根据上一步计算的隐变量期望,重新估计模型参数;
  4. 重复步骤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