正在加载中...

展开本页目录
算法教程GMM-高斯混合模型

GMM-高斯混合模型

No.117 · 在线教程

高斯混合模型(Gaussian Mixture Model, GMM)是一类典型的概率式软聚类方法。它假定样本总体由若干个高斯分布成分混合生成,每个样本同时对多个成分具有不同的后验归属概率,因此比 K-Means 这类硬划分方法更适合描述椭球状簇结构和簇间边界不清晰的数据。

GMM-高斯混合模型

1. 方法概述

高斯混合模型(Gaussian Mixture Model, GMM)是一类典型的概率式软聚类方法。它假定样本总体由若干个高斯分布成分混合生成,每个样本同时对多个成分具有不同的后验归属概率,因此比 K-Means 这类硬划分方法更适合描述椭球状簇结构和簇间边界不清晰的数据。

本项目中的 GMM-高斯混合模型 模块并不是直接调用 sklearn.mixture.GaussianMixture,而是实现了自写的 EM(Expectation-Maximization)迭代求解流程。程序支持:

  1. kmeansrandom 两种初始化方式;
  2. fulldiagspherical 三种协方差结构;
  3. noneminmaxzscore 三种预处理方式;
  4. 输出成分权重、均值、协方差、责任度矩阵、硬划分结果、对数似然收敛曲线以及 AICBIC 指标。

设共有 \(n\) 个样本、\(p\) 个参与聚类的数值特征。对所选特征列构成原始特征矩阵

$$ X=(x_{ij})_{n\times p},\quad i=1,2,\ldots,n,\ j=1,2,\ldots,p \tag{1} $$

若用户额外指定样本名称列 label_col,则该列只用于结果展示与回填,不参与模型估计;若未指定,程序会自动生成 样本1, 样本2, \ldots, 样本n 作为样本标识。

2. 问题定义与符号说明

设需要用 \(K\) 个高斯成分刻画样本分布,其中 \(K=\texttt{n\_components}\)。GMM 假定单个样本 \(x_i\) 的边际密度满足

$$ p(x_i)=\sum_{k=1}^{K}\pi_k\,\mathcal{N}(x_i\mid \mu_k,\Sigma_k) \tag{2} $$

其中 \(\pi_k\) 为第 \(k\) 个成分的混合权重,满足

$$ \sum_{k=1}^{K}\pi_k=1,\qquad \pi_k\ge 0 \tag{3} $$

项目实现中的核心任务,是在给定 \(K\)、协方差结构、初始化方式和收敛阈值的条件下,估计参数集合

$$ \Theta=\{\pi_k,\mu_k,\Sigma_k\}_{k=1}^{K} \tag{4} $$

并进一步输出每个样本对各个成分的责任度(后验概率)、硬划分标签和模型信息准则。

2.1 符号说明

符号 含义
\(n\) 样本数量
\(p\) 特征维数
\(K\) 高斯成分数 n_components
\(x_i\) 第 \(i\) 个样本特征向量
\(\pi_k\) 第 \(k\) 个成分的混合权重
\(\mu_k\) 第 \(k\) 个成分均值向量
\(\Sigma_k\) 第 \(k\) 个成分协方差结构
\(r_{ik}\) 样本 \(x_i\) 对成分 \(k\) 的责任度
\(N_k\) 第 \(k\) 个成分的有效样本量
\(\ell\) 全样本对数似然
\(\lambda\) 协方差正则项 reg_covar
\(\varepsilon\) 收敛阈值 tol

3. 核心数学模型

3.1 高斯密度与责任度

对一般的全协方差情形,高斯密度可写为

$$ \mathcal{N}(x_i\mid \mu_k,\Sigma_k)= \frac{1}{(2\pi)^{p/2}|\Sigma_k|^{1/2}} \exp\left(-\frac{1}{2}(x_i-\mu_k)^\top \Sigma_k^{-1}(x_i-\mu_k)\right) \tag{5} $$

EM 算法中,E 步需要计算样本 \(x_i\) 由第 \(k\) 个成分产生的后验概率,也就是责任度:

$$ r_{ik}= \frac{\pi_k\,\mathcal{N}(x_i\mid \mu_k,\Sigma_k)} {\sum_{h=1}^{K}\pi_h\,\mathcal{N}(x_i\mid \mu_h,\Sigma_h)} \tag{6} $$

本项目在实现时不是直接按式(6) 计算,而是先在对数域中求

$$ \log r_{ik} = \log \pi_k+\log \mathcal{N}(x_i\mid \mu_k,\Sigma_k) -\log\sum_{h=1}^{K}\exp\!\left(\log \pi_h+\log \mathcal{N}(x_i\mid \mu_h,\Sigma_h)\right) \tag{7} $$

并通过 logsumexp 完成归一化,以提升数值稳定性。

3.2 参数初始化

程序提供两种初始化方式。

init_method="kmeans",则先从样本中随机抽取 \(K\) 个点作为初始中心,再执行最多 10 轮简化 K-Means 更新,随后将样本按最近中心做硬分配,并构造 one-hot 责任度矩阵。

init_method="random",则直接随机生成责任度矩阵并按行归一化,使得

$$ \sum_{k=1}^{K}r_{ik}^{(0)}=1,\qquad i=1,2,\ldots,n \tag{8} $$

无论使用哪种初始化,程序都会先计算

$$ N_k=\sum_{i=1}^{n}r_{ik} \tag{9} $$

再由此得到初始权重与均值:

$$ \pi_k=\frac{N_k}{n} \tag{10} $$

$$ \mu_k=\frac{\sum_{i=1}^{n}r_{ik}x_i}{N_k} \tag{11} $$

接着按当前责任度和均值估计协方差参数。

3.3 三种协方差结构

本项目允许三种协方差建模方式。

covariance_type="full",则第 \(k\) 个成分的协方差矩阵按

$$ \Sigma_k= \frac{1}{N_k}\sum_{i=1}^{n}r_{ik}(x_i-\mu_k)(x_i-\mu_k)^\top+\lambda I \tag{12} $$

估计,其中 \(\lambda=\texttt{reg\_covar}\) 为对角正则项,\(I\) 为单位矩阵。

covariance_type="diag",则每个成分只保留逐维方差,记第 \(j\) 个特征的方差为 \(\sigma_{kj}^2\),则

$$ \sigma_{kj}^2= \frac{1}{N_k}\sum_{i=1}^{n}r_{ik}(x_{ij}-\mu_{kj})^2+\lambda \tag{13} $$

covariance_type="spherical",则每个成分只使用一个共享于全部维度的标量方差 \(\sigma_k^2\):

$$ \sigma_k^2= \frac{1}{N_k p}\sum_{i=1}^{n}r_{ik}\|x_i-\mu_k\|_2^2+\lambda \tag{14} $$

因此,这三种结构的复杂度与表达能力依次递减:full 最灵活,spherical 最简化。

3.4 EM 迭代与收敛判据

在第 \(t\) 轮 EM 迭代中:

  1. E 步利用当前 \(\Theta^{(t)}\) 按式(6) 或式(7) 计算责任度;
  2. M 步利用式(9) 至式(14) 更新 \(\Theta^{(t+1)}\)。

程序记录每轮全样本对数似然:

$$ \ell^{(t)}= \sum_{i=1}^{n}\log\left(\sum_{k=1}^{K}\pi_k^{(t)}\mathcal{N}(x_i\mid \mu_k^{(t)},\Sigma_k^{(t)})\right) \tag{15} $$

当相邻两轮对数似然的增量满足

$$ \left|\ell^{(t)}-\ell^{(t-1)}\right|<\varepsilon \tag{16} $$

时,程序提前停止;否则继续迭代,直到达到 max_iter。这里的 \(\varepsilon\) 对应界面参数 tol

3.5 硬划分结果与模型选择指标

虽然 GMM 本质上输出的是软责任度,但项目为了便于展示,同时生成硬划分结果。对第 \(i\) 个样本,其最终成分标签定义为

$$ \hat y_i=\arg\max_{1\le k\le K} r_{ik} \tag{17} $$

实现中为了与界面和 Excel 展示一致,最终输出标签记为 1,2,\ldots,K,即在 argmax 结果基础上加 1。同时程序还输出最大责任度

$$ r_i^{\max}=\max_{1\le k\le K} r_{ik} \tag{18} $$

用于描述样本被当前硬划分吸收的确定性强弱。

除责任度外,程序还根据最终对数似然输出信息准则:

$$ \mathrm{AIC}=-2\ell+2q \tag{19} $$

$$ \mathrm{BIC}=-2\ell+q\ln n \tag{20} $$

其中 \(q\) 为模型自由参数个数。项目代码中采用

$$ q=(K-1)+Kp+q_\Sigma \tag{21} $$

$$ q_\Sigma= \begin{cases} K\,\dfrac{p(p+1)}{2}, & \text{full}\\[6pt] Kp, & \text{diag}\\[4pt] K, & \text{spherical} \end{cases} \tag{22} $$

因此,AICBIC 可以用于比较不同成分数或不同协方差结构下的模型优劣;在同一数据集上,这两个指标通常越小越好。

4. 数据预处理与结果反变换

项目支持 noneminmaxzscore 三种预处理方式。

normalize="minmax" 时,第 \(j\) 个特征按

$$ z_{ij}=\frac{x_{ij}-x_j^{\min}}{x_j^{\max}-x_j^{\min}} \tag{23} $$

变换到 \([0,1]\) 区间。若某列极差为 0,代码会将缩放因子置为 1 以避免除零。

normalize="zscore" 时,第 \(j\) 个特征按

$$ z_{ij}=\frac{x_{ij}-\bar x_j}{s_j} \tag{24} $$

标准化,其中 \(\bar x_j\) 为均值,\(s_j\) 为总体标准差;若 \(s_j=0\),程序同样会以 1 替代。不过在真正进入计算前,界面校验已要求所选特征列不能是常数列,因此这里更多是数值安全保护。

normalize="none",则直接令 \(z_{ij}=x_{ij}\)。

由于 GMM 的均值参数是在预处理空间中估计的,程序会额外输出 Means_Original,把均值反变换回原始尺度。对 Min-Max 归一化,有

$$ \mu_{kj}^{(\text{orig})}=\mu_{kj}^{(\text{norm})}\cdot (x_j^{\max}-x_j^{\min})+x_j^{\min} \tag{25} $$

对 Z-score 标准化,有

$$ \mu_{kj}^{(\text{orig})}=\mu_{kj}^{(\text{norm})}\cdot s_j+\bar x_j \tag{26} $$

因此,论文中若需要解释“每个聚类中心在原始指标上的实际水平”,应优先使用 Means_Original 而不是 Means

5. 算法流程

结合当前项目代码,GMM-高斯混合模型 的完整计算流程可概括为:

  1. 读取 .xlsx.xls.csv 数据文件;CSV 会依次尝试 utf-8-sigutf-8gbk 编码。
  2. 在上传阶段检查数据中是否至少存在一个完整可转为数值的列。
  3. 在“特征设置”页选择可选的样本名称列 label_col,并勾选参与建模的数值特征列。
  4. 程序再次检查所选特征列是否存在空值、非数值项或常数列。
  5. 若用户误把 label_col 同时勾为特征列,核心计算前会自动将其从 feature_cols 中移除。
  6. normalize 设置对特征矩阵执行预处理,得到模型输入矩阵。
  7. init_method 初始化责任度、权重、均值与协方差参数。
  8. 执行 EM 迭代,逐轮记录对数似然,直到满足式(16) 或达到最大迭代次数。
  9. 基于最终责任度生成硬划分、最大责任度、成分汇总和 AICBIC 指标。
  10. 导出 Excel、绘制 loglikelihood_curve.pngcluster_scatter.png,并自动生成复现脚本 repro_gmm_高斯混合模型.py

6. 关键参数说明

6.1 n_components

成分数 \(K\),界面允许范围为 250,默认值为 3。项目在 _prepare_data() 中要求样本数量不少于成分数,否则直接报错。

6.2 covariance_type

协方差结构,可选值为:

  1. full
  2. diag
  3. spherical

默认值为 fullfull 表达能力最强,但参数最多;spherical 约束最强,适合结构较简单的数据。

6.3 max_iter

最大迭代次数,界面允许范围为 101000,默认值为 100。若对数似然未提前满足收敛条件,程序会以最后一轮参数作为输出。

6.4 tol

对数似然收敛阈值,界面允许范围为 1e-61e-1,默认值为 1e-4。该值越小,通常需要更多迭代才能停止。

6.5 reg_covar

协方差正则项,界面允许范围为 1e-81e-2,默认值为 1e-6。该参数直接加到协方差或方差项中,用于缓解协方差矩阵奇异、行列式非正或求逆不稳定的问题。

6.6 init_method

初始化方式,可选 kmeansrandom,默认值为 kmeans。其中 kmeans 在本项目里是一个最多 10 轮的简化初始化流程,并不是外部库的完整 K-Means 实现。

6.7 normalize

预处理方式与界面映射关系如下:

  • none
  • Min-Maxminmax
  • Z-Scorezscore

当特征量纲差异明显时,通常建议优先尝试 minmaxzscore

6.8 random_state

随机种子。界面允许输入 -1999999,其中 -1 会在程序内部转为 None,表示每次随机初始化;输入具体整数时,则可提高结果复现性。当前结果目录中的复现脚本会记录本次实际使用的种子值。

7. 评价指标与输出结果解释

程序导出的 Excel 文件固定命名为 gmm_results.xlsx。在当前开发环境下,结果目录通常形如:

results/GMM-高斯混合模型分析结果_<时间戳>/

若软件被打包运行,则结果目录可能写入用户主目录下的 ~/.GMM-高斯混合模型系统/results/。当前实现会输出以下工作表:

  1. Parameters:参数配置、特征列、样本数、最终对数似然与输出文件路径。
  2. RawData:原始数据表。
  3. ProcessedData:处理后的建模数据,包含样本名称列与预处理后的特征列。
  4. Weights:各成分的混合权重 \(\pi_k\)。
  5. Means:预处理空间中的成分均值。
  6. Means_Original:反变换回原始尺度后的成分均值。
  7. Covariances:协方差参数;不同协方差结构下其表格形态不同。
  8. Responsibilities:完整责任度矩阵、最大责任度与硬划分标签。
  9. Labels:样本名称、硬划分与最大责任度。
  10. LogLikelihood:每轮迭代的对数似然历史。
  11. MetricsAICBIC
  12. ClusterSummary:各硬划分成分的样本数量。
  13. Charts:图表文件路径索引。

同时,结果目录下还会生成:

  1. plots/loglikelihood_curve.png
  2. plots/cluster_scatter.png
  3. repro_gmm_高斯混合模型.py
  4. repro_inputs/ 下的复现输入文件

从结果解释角度看:

  1. Weights 反映各高斯成分在总体中的相对占比。
  2. 最大责任度 越接近 1,说明样本更明确地归属于某一个成分。
  3. LogLikelihood 曲线若较快趋于平稳,说明 EM 已基本收敛。
  4. AICBIC 适合用于比较不同 \(K\) 或不同协方差结构的模型,通常越小越好。
  5. Means 用于解释预处理空间中的中心,Means_Original 用于解释原始指标尺度下的中心。
  6. cluster_scatter.png 只展示处理后数据的前两维;当仅有一个特征时,程序会绘制单特征散点并把纵轴置零。
  7. 结果页界面中的责任度表只预览前 50 行,完整责任度结果应以导出的 Excel 为准。

8. 论文写作模板

8.1 方法描述模板

可将当前项目实现表述为:

“本文采用高斯混合模型(GMM)对样本进行软聚类分析。首先选取研究对象的数值型指标,并根据需要进行 Min-Max 归一化或 Z-score 标准化处理。随后假定样本总体由 \(K\) 个高斯成分混合生成,利用期望最大化(EM)算法交替估计各成分的混合权重、均值和协方差参数。在 E 步中计算样本属于各高斯成分的后验责任度,在 M 步中据此更新模型参数,并以对数似然变化作为收敛判据。最终输出样本责任度矩阵、基于最大责任度得到的硬划分结果,以及 AIC、BIC 等模型选择指标,用于分析样本的潜在分组结构。”

若需要更贴近本项目工程实现,还可补充说明:本文实现支持 fulldiagspherical 三种协方差结构,并同时输出预处理空间与原始尺度下的成分均值,以增强结果解释性。

8.2 结果解释模板

结果部分可写为:GMM 通过责任度矩阵刻画每个样本属于不同潜在高斯成分的概率强度,并据此得到硬划分结果。若 AIC 与 BIC 在当前成分数下较低,说明模型在复杂度与拟合效果之间取得了较优平衡;若部分样本责任度分散,则可解释为其潜在类别归属存在不确定性。

8.3 表格标题模板

表题可写为:GMM 聚类责任度与模型选择指标汇总表。

8.4 图表题注模板

图注可写为:GMM 聚类结果及高斯成分中心分布图。

8.5 表格示例

建议列名:样本编号、硬划分标签、各成分责任度、混合权重、AIC、BIC、成分均值。

9. 实现说明与注意事项

  1. GMM 适合处理簇边界模糊、样本可能同时接近多个中心、且簇形状不一定是球状的数据。
  2. 当前实现要求所选特征列全部为数值型,且不能包含空值、非数值项或常数列。
  3. 程序要求 n_components >= 2,且样本数不能小于成分数;否则无法完成初始化与参数估计。
  4. kmeans 初始化虽然通常比纯随机更稳定,但当前项目中的 K-Means 只是简化版预初始化,最多执行 10 轮,因此不同随机种子下结果仍可能变化。
  5. full 协方差参数较多,在高维、小样本场景下更容易出现数值不稳定,实际应用中可结合 reg_covarAICBIC 和可解释性综合选择。
  6. 输出的硬划分标签是基于责任度最大值生成的附加结果,不能替代责任度矩阵本身所包含的软聚类信息。
  7. 若论文需要解释簇中心在原始指标上的实际大小,应使用 Means_Original;若需要与责任度、协方差估计保持同一空间,则应使用 Means
  8. 当前散点图仅基于前两维处理后特征绘制,因此只能作为可视化辅助,不能完整代表高维空间中的真实聚类结构。
  9. AICBIC 的比较应建立在同一数据集与同一预处理方案基础上,否则结论不宜直接横向对比。

10. 论文写作建议

论文中建议把 GMM 的结果分成“软聚类信息”和“硬聚类信息”两层展示:

  1. 软聚类:责任度矩阵、各成分权重;
  2. 硬聚类:最终标签、簇规模、中心位置。

若研究需要选择最优成分数,最好同时报告 AICBIC,而不是只看一种准则。解释结果时,应优先使用 Means_Original 讨论原始变量尺度下的簇特征。

11. 单篇终审补充

11.1 图题与表题对齐建议

当前 GMM 模块的真实导出页名较完整,建议论文终稿直接按软件结果写表题。实际工作簿包含:

  • Parameters
  • RawData
  • ProcessedData
  • Weights
  • Means
  • Means_Original
  • Covariances
  • Responsibilities
  • Labels
  • LogLikelihood
  • Metrics
  • ClusterSummary
  • Charts

其中 Responsibilities 是软聚类核心页,Weights / Means / Covariances 对应混合模型参数,LogLikelihood 表示 EM 收敛过程。正文主表可优先选 ClusterSummaryMetricsResponsibilities 的摘要,而不要只保留 Labels

图文件位于结果目录 plots/ 子目录,当前实现生成:

  • loglikelihood_curve.png
  • cluster_scatter.png

因此图题建议写成“GMM 对数似然收敛曲线图”“GMM 聚类散点图”。不要写成“高斯椭球图”或“EM 参数更新图”,因为当前软件没有导出这些更细的可视化。

11.2 终审说明

这篇文档最容易被写成“KMeans 的概率版”,但从真实实现看,GMM 的辨识度主要体现在 ResponsibilitiesCovariances 两块输出。如果论文只展示标签与中心,实际上会损失掉混合模型最关键的概率解释层。

另外,当前 repro 脚本已经统一使用 repro_inputs/... 相对路径,且样例中既可能来自 window2_gmm_baseline_input.csv,也可能来自 gmm_sample.csv。因此论文或软件说明应写成“复现实验输入来自结果目录中的 repro_inputs 副本”,而不要把样例文件名写死。

11.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/聚类与降维/GMM-高斯混合模型,本次采用的代表性结果目录为 具体的算法3/聚类与降维/GMM-高斯混合模型/results/GMM-高斯混合模型分析结果_20260329_171246。该目录里主结果、图、复现脚本和 repro_inputs 都来自同一轮导出,适合做单轮证据绑定。

主结果工作簿为 具体的算法3/聚类与降维/GMM-高斯混合模型/results/GMM-高斯混合模型分析结果_20260329_171246/gmm_results.xlsx,实测工作表为:

  • Parameters
  • RawData
  • ProcessedData
  • Weights
  • Means
  • Means_Original
  • Covariances
  • Responsibilities
  • Labels
  • LogLikelihood
  • Metrics
  • ClusterSummary
  • Charts

这套页名对应的是完整的概率聚类输出,而不是简化版的“中心 + 标签”导出。其中 ResponsibilitiesCovariances 是论文写作中最容易被遗漏、但又最能区分 GMM 与 KMeans 的核心证据;Means_Original 则是解释原始变量尺度下簇特征时更适合引用的页。

当前目录中的真实图文件为:

  • 具体的算法3/聚类与降维/GMM-高斯混合模型/results/GMM-高斯混合模型分析结果_20260329_171246/plots/loglikelihood_curve.png
  • 具体的算法3/聚类与降维/GMM-高斯混合模型/results/GMM-高斯混合模型分析结果_20260329_171246/plots/cluster_scatter.png

因此图题只能按真实工程结果写成“对数似然收敛曲线图”和“聚类散点图”。该目录里没有额外导出的高斯椭球图,也没有单独的参数更新轨迹图,正文不应超出真实产物范围。

复现实物方面,该目录中实际存在:

  • 具体的算法3/聚类与降维/GMM-高斯混合模型/results/GMM-高斯混合模型分析结果_20260329_171246/repro_gmm_高斯混合模型.py
  • 具体的算法3/聚类与降维/GMM-高斯混合模型/results/GMM-高斯混合模型分析结果_20260329_171246/repro_inputs/window2_gmm_baseline_input.csv

脚本内明确写成 INPUT_FILE = 'repro_inputs/window2_gmm_baseline_input.csv',并通过本地候选路径解析逻辑优先读取结果目录内副本。因此这一轮的真实口径应写成“主结果工作簿已固化,repro 入口脚本绑定相对路径输入副本”,而不是写成固定依赖某个绝对路径或固定绑定 gmm_sample.csv

11. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/聚类与降维/GMM-高斯混合模型/results/GMM-高斯混合模型分析结果_20260329_171246
  • 正文应围绕 RawDataProcessedDataMeansCovariancesResponsibilitiesLabelsBIC_AICCharts 来写。
  • 图证应对应 loglikelihood_curve.pngcluster_scatter.png,并把责任度和模型选择指标写清。
  • 复现脚本应按 repro_gmm_高斯混合模型.py + repro_inputs/window2_gmm_baseline_input.csv 的口径说明。