GMM-高斯混合模型
高斯混合模型(Gaussian Mixture Model, GMM)是一类典型的概率式软聚类方法。它假定样本总体由若干个高斯分布成分混合生成,每个样本同时对多个成分具有不同的后验归属概率,因此比 K-Means 这类硬划分方法更适合描述椭球状簇结构和簇间边界不清晰的数据。
GMM-高斯混合模型
1. 方法概述
高斯混合模型(Gaussian Mixture Model, GMM)是一类典型的概率式软聚类方法。它假定样本总体由若干个高斯分布成分混合生成,每个样本同时对多个成分具有不同的后验归属概率,因此比 K-Means 这类硬划分方法更适合描述椭球状簇结构和簇间边界不清晰的数据。
本项目中的 GMM-高斯混合模型 模块并不是直接调用 sklearn.mixture.GaussianMixture,而是实现了自写的 EM(Expectation-Maximization)迭代求解流程。程序支持:
kmeans与random两种初始化方式;full、diag、spherical三种协方差结构;none、minmax、zscore三种预处理方式;- 输出成分权重、均值、协方差、责任度矩阵、硬划分结果、对数似然收敛曲线以及
AIC、BIC指标。
设共有 \(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 迭代中:
- E 步利用当前 \(\Theta^{(t)}\) 按式(6) 或式(7) 计算责任度;
- 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} $$
因此,AIC 和 BIC 可以用于比较不同成分数或不同协方差结构下的模型优劣;在同一数据集上,这两个指标通常越小越好。
4. 数据预处理与结果反变换
项目支持 none、minmax、zscore 三种预处理方式。
当 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-高斯混合模型 的完整计算流程可概括为:
- 读取
.xlsx、.xls或.csv数据文件;CSV 会依次尝试utf-8-sig、utf-8、gbk编码。 - 在上传阶段检查数据中是否至少存在一个完整可转为数值的列。
- 在“特征设置”页选择可选的样本名称列
label_col,并勾选参与建模的数值特征列。 - 程序再次检查所选特征列是否存在空值、非数值项或常数列。
- 若用户误把
label_col同时勾为特征列,核心计算前会自动将其从feature_cols中移除。 - 按
normalize设置对特征矩阵执行预处理,得到模型输入矩阵。 - 按
init_method初始化责任度、权重、均值与协方差参数。 - 执行 EM 迭代,逐轮记录对数似然,直到满足式(16) 或达到最大迭代次数。
- 基于最终责任度生成硬划分、最大责任度、成分汇总和
AIC、BIC指标。 - 导出 Excel、绘制
loglikelihood_curve.png与cluster_scatter.png,并自动生成复现脚本repro_gmm_高斯混合模型.py。
6. 关键参数说明
6.1 n_components
成分数 \(K\),界面允许范围为 2 到 50,默认值为 3。项目在 _prepare_data() 中要求样本数量不少于成分数,否则直接报错。
6.2 covariance_type
协方差结构,可选值为:
fulldiagspherical
默认值为 full。full 表达能力最强,但参数最多;spherical 约束最强,适合结构较简单的数据。
6.3 max_iter
最大迭代次数,界面允许范围为 10 到 1000,默认值为 100。若对数似然未提前满足收敛条件,程序会以最后一轮参数作为输出。
6.4 tol
对数似然收敛阈值,界面允许范围为 1e-6 到 1e-1,默认值为 1e-4。该值越小,通常需要更多迭代才能停止。
6.5 reg_covar
协方差正则项,界面允许范围为 1e-8 到 1e-2,默认值为 1e-6。该参数直接加到协方差或方差项中,用于缓解协方差矩阵奇异、行列式非正或求逆不稳定的问题。
6.6 init_method
初始化方式,可选 kmeans 与 random,默认值为 kmeans。其中 kmeans 在本项目里是一个最多 10 轮的简化初始化流程,并不是外部库的完整 K-Means 实现。
6.7 normalize
预处理方式与界面映射关系如下:
无→noneMin-Max→minmaxZ-Score→zscore
当特征量纲差异明显时,通常建议优先尝试 minmax 或 zscore。
6.8 random_state
随机种子。界面允许输入 -1 到 999999,其中 -1 会在程序内部转为 None,表示每次随机初始化;输入具体整数时,则可提高结果复现性。当前结果目录中的复现脚本会记录本次实际使用的种子值。
7. 评价指标与输出结果解释
程序导出的 Excel 文件固定命名为 gmm_results.xlsx。在当前开发环境下,结果目录通常形如:
results/GMM-高斯混合模型分析结果_<时间戳>/
若软件被打包运行,则结果目录可能写入用户主目录下的 ~/.GMM-高斯混合模型系统/results/。当前实现会输出以下工作表:
Parameters:参数配置、特征列、样本数、最终对数似然与输出文件路径。RawData:原始数据表。ProcessedData:处理后的建模数据,包含样本名称列与预处理后的特征列。Weights:各成分的混合权重 \(\pi_k\)。Means:预处理空间中的成分均值。Means_Original:反变换回原始尺度后的成分均值。Covariances:协方差参数;不同协方差结构下其表格形态不同。Responsibilities:完整责任度矩阵、最大责任度与硬划分标签。Labels:样本名称、硬划分与最大责任度。LogLikelihood:每轮迭代的对数似然历史。Metrics:AIC与BIC。ClusterSummary:各硬划分成分的样本数量。Charts:图表文件路径索引。
同时,结果目录下还会生成:
plots/loglikelihood_curve.pngplots/cluster_scatter.pngrepro_gmm_高斯混合模型.pyrepro_inputs/下的复现输入文件
从结果解释角度看:
Weights反映各高斯成分在总体中的相对占比。最大责任度越接近 1,说明样本更明确地归属于某一个成分。LogLikelihood曲线若较快趋于平稳,说明 EM 已基本收敛。AIC与BIC适合用于比较不同 \(K\) 或不同协方差结构的模型,通常越小越好。Means用于解释预处理空间中的中心,Means_Original用于解释原始指标尺度下的中心。cluster_scatter.png只展示处理后数据的前两维;当仅有一个特征时,程序会绘制单特征散点并把纵轴置零。- 结果页界面中的责任度表只预览前 50 行,完整责任度结果应以导出的 Excel 为准。
8. 论文写作模板
8.1 方法描述模板
可将当前项目实现表述为:
“本文采用高斯混合模型(GMM)对样本进行软聚类分析。首先选取研究对象的数值型指标,并根据需要进行 Min-Max 归一化或 Z-score 标准化处理。随后假定样本总体由 \(K\) 个高斯成分混合生成,利用期望最大化(EM)算法交替估计各成分的混合权重、均值和协方差参数。在 E 步中计算样本属于各高斯成分的后验责任度,在 M 步中据此更新模型参数,并以对数似然变化作为收敛判据。最终输出样本责任度矩阵、基于最大责任度得到的硬划分结果,以及 AIC、BIC 等模型选择指标,用于分析样本的潜在分组结构。”
若需要更贴近本项目工程实现,还可补充说明:本文实现支持 full、diag、spherical 三种协方差结构,并同时输出预处理空间与原始尺度下的成分均值,以增强结果解释性。
8.2 结果解释模板
结果部分可写为:GMM 通过责任度矩阵刻画每个样本属于不同潜在高斯成分的概率强度,并据此得到硬划分结果。若 AIC 与 BIC 在当前成分数下较低,说明模型在复杂度与拟合效果之间取得了较优平衡;若部分样本责任度分散,则可解释为其潜在类别归属存在不确定性。
8.3 表格标题模板
表题可写为:GMM 聚类责任度与模型选择指标汇总表。
8.4 图表题注模板
图注可写为:GMM 聚类结果及高斯成分中心分布图。
8.5 表格示例
建议列名:样本编号、硬划分标签、各成分责任度、混合权重、AIC、BIC、成分均值。
9. 实现说明与注意事项
- GMM 适合处理簇边界模糊、样本可能同时接近多个中心、且簇形状不一定是球状的数据。
- 当前实现要求所选特征列全部为数值型,且不能包含空值、非数值项或常数列。
- 程序要求
n_components >= 2,且样本数不能小于成分数;否则无法完成初始化与参数估计。 kmeans初始化虽然通常比纯随机更稳定,但当前项目中的 K-Means 只是简化版预初始化,最多执行 10 轮,因此不同随机种子下结果仍可能变化。full协方差参数较多,在高维、小样本场景下更容易出现数值不稳定,实际应用中可结合reg_covar、AIC、BIC和可解释性综合选择。- 输出的硬划分标签是基于责任度最大值生成的附加结果,不能替代责任度矩阵本身所包含的软聚类信息。
- 若论文需要解释簇中心在原始指标上的实际大小,应使用
Means_Original;若需要与责任度、协方差估计保持同一空间,则应使用Means。 - 当前散点图仅基于前两维处理后特征绘制,因此只能作为可视化辅助,不能完整代表高维空间中的真实聚类结构。
AIC和BIC的比较应建立在同一数据集与同一预处理方案基础上,否则结论不宜直接横向对比。
10. 论文写作建议
论文中建议把 GMM 的结果分成“软聚类信息”和“硬聚类信息”两层展示:
- 软聚类:责任度矩阵、各成分权重;
- 硬聚类:最终标签、簇规模、中心位置。
若研究需要选择最优成分数,最好同时报告 AIC 与 BIC,而不是只看一种准则。解释结果时,应优先使用 Means_Original 讨论原始变量尺度下的簇特征。
11. 单篇终审补充
11.1 图题与表题对齐建议
当前 GMM 模块的真实导出页名较完整,建议论文终稿直接按软件结果写表题。实际工作簿包含:
ParametersRawDataProcessedDataWeightsMeansMeans_OriginalCovariancesResponsibilitiesLabelsLogLikelihoodMetricsClusterSummaryCharts
其中 Responsibilities 是软聚类核心页,Weights / Means / Covariances 对应混合模型参数,LogLikelihood 表示 EM 收敛过程。正文主表可优先选 ClusterSummary、Metrics 与 Responsibilities 的摘要,而不要只保留 Labels。
图文件位于结果目录 plots/ 子目录,当前实现生成:
loglikelihood_curve.pngcluster_scatter.png
因此图题建议写成“GMM 对数似然收敛曲线图”“GMM 聚类散点图”。不要写成“高斯椭球图”或“EM 参数更新图”,因为当前软件没有导出这些更细的可视化。
11.2 终审说明
这篇文档最容易被写成“KMeans 的概率版”,但从真实实现看,GMM 的辨识度主要体现在 Responsibilities 和 Covariances 两块输出。如果论文只展示标签与中心,实际上会损失掉混合模型最关键的概率解释层。
另外,当前 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,实测工作表为:
ParametersRawDataProcessedDataWeightsMeansMeans_OriginalCovariancesResponsibilitiesLabelsLogLikelihoodMetricsClusterSummaryCharts
这套页名对应的是完整的概率聚类输出,而不是简化版的“中心 + 标签”导出。其中 Responsibilities 与 Covariances 是论文写作中最容易被遗漏、但又最能区分 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。 - 正文应围绕
RawData、ProcessedData、Means、Covariances、Responsibilities、Labels、BIC_AIC、Charts来写。 - 图证应对应
loglikelihood_curve.png与cluster_scatter.png,并把责任度和模型选择指标写清。 - 复现脚本应按
repro_gmm_高斯混合模型.py + repro_inputs/window2_gmm_baseline_input.csv的口径说明。