楼主: 李菘蓝
90 0

[学科前沿] 【机器学习】2.EM算法和GMM高斯混合模型 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-8-28
最后登录
2018-8-28

楼主
李菘蓝 发表于 2025-12-10 12:43:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

EM算法与高斯混合模型(GMM)系统解析

一、基础概念梳理

在深入理解EM算法与高斯混合模型之前,需掌握以下关键前置知识。这些概念构成了整个理论体系的基石。

概念 定义与作用
隐变量(Latent Variable) 指无法直接观测但对可观测数据产生影响的变量,是EM算法处理的核心对象。例如,在GMM中表示样本所属的具体高斯成分。
最大似然估计(MLE) 基于已知观测数据,寻找使数据出现概率最大的模型参数。适用于无隐变量情形下的参数估计问题。
高斯分布(正态分布) 单变量形式:
$$ \mathcal{N}(x|\mu, \sigma^2) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}} $$
多变量形式:
$$ \mathcal{N}(\mathbf{x}|\boldsymbol{\mu}, \boldsymbol{\Sigma}) = \frac{1}{(2\pi)^{d/2}|\boldsymbol{\Sigma}|^{1/2}}e^{-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^T\boldsymbol{\Sigma}^{-1}(\mathbf{x}-\boldsymbol{\mu})} $$
其中 $ d $ 表示特征维度。
GaussianMixture

二、期望最大化算法(EM算法)详解

1. 算法概述

EM算法是一种用于含有隐变量的概率模型进行参数估计的迭代方法。其核心思想在于交替执行两个步骤——“期望步”(E步)和“最大化步”(M步),逐步逼近含隐变量情况下的最大似然解。

2. 核心原理

当存在隐变量时,原始的对数似然函数 $ \log p(X|\Theta) $ 难以直接优化。EM算法通过引入证据下界(ELBO),构造一个可优化的替代目标函数,并利用Q函数作为桥梁,确保每轮迭代后似然值不会下降。

3. 迭代流程

步骤 操作说明
初始化 设定初始参数 $ \Theta^{(0)} $(如随机设定),并指定收敛阈值 $ \epsilon $
E步 计算在当前参数下隐变量的后验分布,构建Q函数:
$$ Q(\Theta|\Theta^{(t)}) = \mathbb{E}_{Z|X,\Theta^{(t)}}[\log p(X,Z|\Theta)] $$
M步 最大化Q函数以更新参数:
$$ \Theta^{(t+1)} = \arg\max_{\Theta} Q(\Theta|\Theta^{(t)}) $$
收敛判断 若参数变化量 $ |\Theta^{(t+1)} - \Theta^{(t)}| < \epsilon $ 或对数似然增量小于 $ \epsilon $,则停止;否则返回E步继续迭代。
from sklearn.mixture import GaussianMixture

4. 收敛性质

EM算法具有良好的单调收敛性:每一轮迭代都保证对数似然值不减少,最终会收敛至局部最优解。但由于依赖初始值设定,可能无法达到全局最优。

三、高斯混合模型(GMM)结构分析

1. 模型基本定义

高斯混合模型是由 $ K $ 个高斯分布(称为“成分”)加权组合而成的概率密度模型,能够有效拟合多峰或非正态分布的数据结构。

(1)单变量GMM表达式:

$$ p(x) = \sum_{k=1}^K \pi_k \mathcal{N}(x|\mu_k, \sigma_k^2) $$

(2)多变量GMM表达式:

$$ p(\mathbf{x}) = \sum_{k=1}^K \pi_k \mathcal{N}(\mathbf{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k) $$

参数解释与约束条件:

  • $ \pi_k $:第 $ k $ 个成分的混合权重(即先验概率),满足 $ \sum_{k=1}^K \pi_k = 1 $ 且 $ \pi_k \geq 0 $;
  • $ \boldsymbol{\mu}_k $:第 $ k $ 个高斯成分的 $ d $ 维均值向量;
  • $ \boldsymbol{\Sigma}_k $:第 $ k $ 个成分对应的 $ d \times d $ 协方差矩阵,要求为正定矩阵;

整体模型参数集合为: $ \Theta = \{ \pi_k, \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k \}_{k=1}^K $

gmm = GaussianMixture(n_components=K,  # 高斯成分数<br>                       covariance_type='full',  # 协方差类型:full/ diag/ spherical/ tied<br>                       max_iter=100,  # 最大迭代次数<br>                       tol=1e-6,  # 收敛阈值<br>                       random_state=42)

在高斯混合模型(GMM)中,参数集合表示为:

Θ = {π,...,π_K, μ,...,μ_K, Σ,...,Σ_K},其中 π_k 表示第 k 个高斯成分的混合系数,μ_k 为其均值向量,Σ_k 为协方差矩阵。

EM算法求解GMM的核心流程

GMM的参数估计广泛采用EM(期望-最大化)算法,其关键在于引入隐变量 z_{nk} 来表示样本归属。设 z_{nk} = 1 表示第 n 个样本属于第 k 个高斯成分,且满足 ∑ z_{nk} = 1,即每个样本仅归属于一个成分。

(1)E步:计算“责任” γ_{nk}

“责任”γ_{nk} 指在当前参数 Θ^(t) 和观测数据 x_n 的条件下,样本 n 属于第 k 个高斯成分的后验概率,计算公式如下:

γ_{nk} = p(z_{nk}=1 | x_n, Θ^(t)) = [π_k^(t) · N(x_n | μ_k^(t), Σ_k^(t))] / [∑_{j=1}^K π_j^(t) · N(x_n | μ_j^(t), Σ_j^(t))]

该值反映了每个样本对各个高斯成分的隶属程度,是软聚类的基础。

(2)M步:基于责任更新模型参数

利用E步得到的责任权重 γ_{nk},重新估计模型参数以最大化Q函数。各参数的更新规则如下:

参数类型 更新公式
混合系数 π_k π_k^(t+1) = (1/N) ∑_{n=1}^N γ_{nk}
均值 μ_k μ_k^(t+1) = [∑_{n=1}^N γ_{nk} x_n] / [∑_{n=1}^N γ_{nk}]
协方差 Σ_k Σ_k^(t+1) = [∑_{n=1}^N γ_{nk} (x_n μ_k^(t+1))(x_n μ_k^(t+1))] / [∑_{n=1}^N γ_{nk}]

其中 N 为总样本数,更新后的参数将用于下一轮E步迭代。

(3)收敛判断条件

当以下任一条件满足时,算法停止迭代:

  • 参数变化的L2范数小于预设阈值(例如 1e-6);
  • 对数似然 log p(X|Θ) 的增量低于指定容差。

GMM与K-Means的对比分析

尽管两者均可用于聚类任务,但GMM与K-Means在建模思想和输出结果上存在本质差异:

对比维度 GMM(高斯混合模型) K-Means(K均值聚类)
聚类方式 软聚类 — 输出每个样本属于各类别的概率分布 硬聚类 — 每个样本唯一归属于某一类别
模型假设 数据服从多个高斯分布的线性组合,同时建模均值与协方差结构 假设簇呈球形,仅依赖欧氏距离最小化,只考虑中心点位置
求解策略 使用EM算法进行迭代优化 通过重复分配与中心更新实现收敛
输出内容 包含完整概率模型(π, μ, Σ)及聚类标签 仅提供聚类标签与簇中心
对异常值的鲁棒性 较敏感,因协方差受离群点影响较大 同样敏感,因距离度量易被极端值干扰

Python实现方法与实例演示

1. 主要API接口(基于sklearn)

scikit-learn 提供了 GaussianMixture 类来实现GMM建模,常用操作包括初始化、训练与预测等。

GaussianMixture
导入模块
from sklearn.mixture import GaussianMixture
模型初始化设置
gmm = GaussianMixture(n_components=K,  # 高斯成分数<br>                       covariance_type='full',  # 协方差类型:full/ diag/ spherical/ tied<br>                       max_iter=100,  # 最大迭代次数<br>                       tol=1e-6,  # 收敛阈值<br>                       random_state=42)

可配置成分数量 K、协方差类型(如 'full', 'diag')、正则化参数等。

模型训练
gmm.fit(X)

输入数据 X 应为形状为 (n_samples, n_features) 的二维数组。

聚类标签预测(硬划分)
labels = gmm.predict(X)

返回每个样本最可能所属的成分索引。

成员概率预测(软划分)
probs = gmm.predict_proba(X)

输出形状为 (n_samples, K),表示各样本属于K个成分的概率。

获取训练后模型参数
gmm.weights_
gmm.means_
gmm.covariances_

2. 实战案例:使用GMM拟合二维模拟数据

构建一个人工生成的二维数据集,展示GMM如何识别潜在的多模态分布结构,并进行软聚类划分。通过可视化责任概率或最终聚类结果,可直观理解模型对复杂形状簇的适应能力。

步骤1:生成模拟数据

import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from scipy.stats import multivariate_normal

# 创建二维高斯混合模型所需的数据集
np.random.seed(42)

# 设置高斯成分数量与样本总数
K = 3
n_samples = 500

# 第一个高斯成分:中心位于[0, 0],协方差矩阵为[[1, 0.5], [0.5, 1]],生成200个样本
mean1 = [0, 0]
cov1 = [[1, 0.5], [0.5, 1]]
data1 = np.random.multivariate_normal(mean1, cov1, 200)

# 第二个高斯成分:均值为[5, 5],协方差[[1, -0.5], [-0.5, 1]],采样150次
mean2 = [5, 5]
cov2 = [[1, -0.5], [-0.5, 1]]
data2 = np.random.multivariate_normal(mean2, cov2, 150)

# 第三个高斯成分:位置在[0, 8],单位协方差矩阵[[1, 0], [0, 1]],生成150个点
mean3 = [0, 8]
cov3 = [[1, 0], [0, 1]]
data3 = np.random.multivariate_normal(mean3, cov3, 150)

# 将三组数据合并成完整数据集
X = np.vstack([data1, data2, data3])

# 构建真实类别标签(用于后续对比)
y_true = np.hstack([np.zeros(200), np.ones(150), 2 * np.ones(150)])

# 展示原始数据分布情况
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=y_true, cmap='viridis', alpha=0.6)
plt.title('原始模拟数据(3个高斯成分)')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.show()
GaussianMixture
步骤2:使用sklearn实现GMM拟合 # 利用scikit-learn中的GaussianMixture类进行模型训练 gmm = GaussianMixture( n_components=3, # 设定成分数量为3 covariance_type='full', # 使用全协方差结构 max_iter=200, # 最大迭代次数 tol=1e-6, # 收敛阈值 random_state=42 ) # 对合成数据X执行模型拟合 gmm.fit(X) # 输出训练后得到的模型参数 print("=== GMM模型参数 ===") print(f"混合系数(π):{gmm.weights_}") print(f"均值向量(μ):\n{gmm.means_}") print(f"协方差矩阵(Σ):\n{gmm.covariances_}") # 进行聚类预测并获取每个样本属于各成分的概率 labels_pred = gmm.predict(X) probs_pred = gmm.predict_proba(X) # 可视化模型拟合结果 plt.figure(figsize=(8, 6)) plt.scatter(X[:, 0], X[:, 1], c=labels_pred, cmap='viridis', alpha=0.6) # 绘制等高线以表示整体概率密度分布 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100)) zz = np.zeros_like(xx) for k in range(K): rv = multivariate_normal(gmm.means_[k], gmm.covariances_[k]) zz += gmm.weights_[k] * rv.pdf(np.dstack((xx, yy))) # 添加黑色等高线增强可视化效果 plt.contour(xx, yy, zz, levels=5, colors='black', alpha=0.5) plt.title('GMM拟合结果(sklearn)') plt.xlabel('特征1') plt.ylabel('特征2') plt.show()
from sklearn.mixture import GaussianMixture
步骤3:手动实现EM算法拟合GMM(核心逻辑) def gmm_em(X, K, max_iter=200, tol=1e-6): """ 手动实现EM算法对高斯混合模型进行参数估计 参数说明: X: 输入数据矩阵,维度为(n_samples, n_features) K: 混合成分数目(即高斯分布个数) """

返回值说明:

  • pi:混合系数,形状为 (K,)
  • mu:均值向量,形状为 (K, n_features)
  • sigma:协方差矩阵,形状为 (K, n_features, n_features)
  • gamma:责任矩阵(后验概率),形状为 (n_samples, K)

算法参数定义:

  • max_iter:设定最大迭代次数
  • tol:收敛判断的阈值

GaussianMixture

模型实现流程如下:

  1. 初始化阶段
    • 混合系数 pi 使用均匀分布进行初始化,即每个成分初始权重相等:pi = np.ones(K) / K
    • 均值 mu 通过从样本中随机选取 K 个数据点作为初始聚类中心
    • 协方差 sigma 初始化为 K 个单位矩阵,每个成分对应一个
  2. E步(期望步骤):计算责任矩阵 gamma
    • 对每一个样本和每一个高斯成分,计算其概率密度值
    • 结合当前混合系数,得到联合概率:gamma[:, k] = pi[k] * multivariate_normal.pdf(X, mean=mu[k], cov=sigma[k])
    • 按行归一化,获得后验概率 gamma,表示每个样本属于各成分的可能性
    • 同时计算当前的对数似然值并记录,用于后续收敛判断
  3. M步(最大化步骤):更新模型参数
    • 根据最新的责任矩阵,重新估计混合系数 pi_new = gamma.sum(axis=0) / n_samples
    • 更新均值向量:mu_new[k] = (gamma[:, k].reshape(-1,1) * X).sum(axis=0) / gamma[:, k].sum()
    • 更新协方差矩阵:利用偏差外积与责任加权求和的方式更新 sigma_new
  4. 收敛性检测
    • 比较新旧参数之间的差异是否小于预设阈值 tol
    • 若混合系数、均值、协方差的变化均低于阈值,则判定收敛并终止迭代

完成参数更新后,将 pi, mu, sigma 设置为新值,并进入下一轮迭代,直至达到最大迭代次数或满足收敛条件。

最终返回优化后的 pi, mu, sigma 和 gamma 矩阵。

调用自定义 EM-GMM 方法拟合数据:

pi_manual, mu_manual, sigma_manual, gamma_manual = gmm_em(X, K=3, max_iter=200, tol=1e-6)

输出手动实现模型的拟合结果:

=== 手动EM-GMM模型参数 ===
混合系数(π):[pi_manual]
均值(μ):
[mu_manual]
协方差(Σ):
[sigma_manual]

from sklearn.mixture import GaussianMixture

可视化部分处理:

基于 gamma_manual 的最大值索引确定每个样本的类别标签:

labels_manual = np.argmax(gamma_manual, axis=1)

绘制散点图展示聚类结果:

  • 使用 plt.scatter 显示样本分布,颜色由预测标签决定,采用 viridis 色图
  • 设置透明度 alpha=0.6 以增强视觉层次感

添加等高线以反映概率密度分布:

  • 构建网格范围:x_min, x_max = X[:,0].min()-1, X[:,0].max()+1;y_min, y_max 同理
  • 生成坐标网格:xx, yy = np.meshgrid(...)
  • 初始化 zz 矩阵存储联合概率密度值
  • 对每个高斯成分累加其贡献,形成整体密度图

gmm = GaussianMixture(n_components=K,  # 高斯成分数<br>                       covariance_type='full',  # 协方差类型:full/ diag/ spherical/ tied<br>                       max_iter=100,  # 最大迭代次数<br>                       tol=1e-6,  # 收敛阈值<br>                       random_state=42)

3. 案例结果说明

所生成的模拟数据包含三个二维高斯分布成分,实验表明,无论是使用sklearn库中的实现,还是手动编写的EM算法,均能有效拟合出这三个成分的基本参数。尽管由于初始参数设置不同,手动实现与sklearn输出的具体参数值存在一定差异,但两者在聚类效果上保持高度一致。

通过绘制等高线图,可以直观地观察到每个高斯成分的覆盖区域,清晰展现其分布形态;同时,混合系数(即权重)反映了各个成分在整体样本中所占的比例,符合预期分布规律。

GaussianMixture
aic()
bic()
五、关键注意事项 成分数K的选择 在实际应用中,应合理选择高斯成分的数量K。推荐利用信息准则进行判断,例如AIC(赤池信息量准则)或BIC(贝叶斯信息准则)。sklearn提供的GMM模型支持这两种方法,可用于辅助确定最优K值。 初始值敏感性 EM算法对初始参数较为敏感,容易收敛至局部最优解。为提升稳定性,建议采用多次随机初始化策略,并从中选取最终对数似然值最高的模型作为结果。 协方差类型选择 GMM中协方差矩阵的结构可通过参数设定,常见选项包括:full(完全协方差)、diag(对角协方差)、spherical(球形协方差)和tied(共享协方差)。应根据数据的实际分布特征进行选择。例如,球形协方差假设各维度独立且方差相同,这与K-Means的隐含假设相似。
covariance_type
数据预处理要求 由于GMM对特征尺度敏感,在建模前应对数据进行标准化处理,以避免某些维度因量纲过大而主导协方差结构。
StandardScaler
六、总结 EM算法是一种适用于含有隐变量的概率模型参数估计的通用迭代框架,而高斯混合模型(GMM)是其典型应用场景之一。其核心思想在于交替执行“责任”(即样本属于各成分的后验概率)的计算与模型参数的更新,从而逐步逼近真实的数据分布。 相较于K-Means这类硬聚类方法,GMM提供的是基于概率的软划分结果,能够更好地描述现实世界中数据的不确定性与重叠性,具备更强的表达能力。因此,GMM广泛应用于聚类分析、密度估计以及生成式建模等多个机器学习任务中。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:EM算法 机器学习 混合模型 GMM Multivariate
相关内容:算法高斯混合

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-25 01:57