观文听傑

返回

上一篇的 PCA 用连续坐标压缩数据;更早的 K 均值则把每个样本硬分给唯一中心。但在两类用户的消费行为明显重叠时,“只属于 A 或 B”会抹掉边界样本的不确定性,而且圆形等方差簇也未必符合真实几何。

高斯混合模型(Gaussian Mixture Model,GMM)假设数据由若干高斯成分混合生成。它不只学习中心,还学习成分比例与协方差,并输出每个样本来自各成分的后验概率。本文只讲透三个紧密环节:混合似然、软责任度,以及期望最大化(Expectation-Maximization,EM)的 E 步—M 步循环。

01 为什么“最近中心”表达不了重叠?#

设两个顾客与两类中心的距离几乎相同。K 均值仍必须输出标签 0 或 1;标签在分界线两侧会突然翻转,也无法回答“模型有多确定”。GMM 改为描述生成过程:

先选潜在成分 zᵢ                 再由该成分生成 xᵢ

π = [π₁,...,πₖ] ──抽样──► zᵢ ──选择 μₖ,Σₖ──► xᵢ [D]

观测训练数据只有 X [N,D] ◄─────┘  zᵢ 未被观测

推理:xᵢ ──各成分密度──► 未归一化证据 [K]
              └────────► 责任度 γᵢ [K],各项和为 1
text

对第 ii 个样本,先以概率 πk\pi_k 选择成分 zi=kz_i=k,再生成:

xizi=kN(μk,Σk)x_i\mid z_i=k\sim\mathcal N(\mu_k,\Sigma_k)

其中 xi,μkRDx_i,\mu_k\in\mathbb R^DΣkRD×D\Sigma_k\in\mathbb R^{D\times D},混合权重满足 πk0\pi_k\ge 0k=1Kπk=1\sum_{k=1}^K\pi_k=1

02 混合模型优化的是什么?#

边缘化看不见的 ziz_i,单个样本密度是:

p(xiθ)=k=1KπkN(xiμk,Σk)p(x_i\mid\theta)=\sum_{k=1}^{K}\pi_k\mathcal N(x_i\mid\mu_k,\Sigma_k)

训练最大化全部样本的对数似然(Log-Likelihood):

(θ)=i=1Nlog[k=1KπkN(xiμk,Σk)]\ell(\theta)=\sum_{i=1}^{N}\log\left[ \sum_{k=1}^{K}\pi_k\mathcal N(x_i\mid\mu_k,\Sigma_k) \right]

困难来自“对数里面还有求和”。若每个 ziz_i 已知,就能分别统计每个成分;若参数已知,又能推断 ziz_i。EM 正是交替解决这两个容易的子问题。

03 E 步怎样把证据变成责任度?#

给定旧参数 θold\theta^{old},E 步计算后验:

γik=p(zi=kxi,θold)=πkN(xiμk,Σk)j=1KπjN(xiμj,Σj)\gamma_{ik}=p(z_i=k\mid x_i,\theta^{old}) =\frac{\pi_k\mathcal N(x_i\mid\mu_k,\Sigma_k)} {\sum_{j=1}^{K}\pi_j\mathcal N(x_i\mid\mu_j,\Sigma_j)}

Γ=[γik]RN×K\Gamma=[\gamma_{ik}]\in\mathbb R^{N\times K} 称为责任度(Responsibility)矩阵。每行和为 1;每列和

Nk=i=1NγikN_k=\sum_{i=1}^{N}\gamma_{ik}

是成分 kk 的有效样本数,不必是整数。与 K 均值的 one-hot 分配相比,Γ\Gamma 保留了重叠区域的不确定性。

04 M 步为何是加权均值与协方差?#

M 步固定 Γ\Gamma,最大化完整数据对数似然的期望。更新式为:

πknew=NkN,μknew=1Nki=1Nγikxi\pi_k^{new}=\frac{N_k}{N},\qquad \mu_k^{new}=\frac{1}{N_k}\sum_{i=1}^{N}\gamma_{ik}x_i Σknew=1Nki=1Nγik(xiμknew)(xiμknew)\Sigma_k^{new}=\frac{1}{N_k}\sum_{i=1}^{N} \gamma_{ik}(x_i-\mu_k^{new})(x_i-\mu_k^{new})^\top

数据流与形状如下:

形状含义
XX[N,D][N,D]NNDD 维样本
Γ\Gamma[N,K][N,K]每个样本对每个成分的责任度
NkN_k[K][K]各成分有效样本数
μ\mu[K,D][K,D]各成分均值
Σ\Sigma[K,D,D][K,D,D]full 协方差
π\pi[K][K]混合权重

EM 每轮不会降低训练似然,但只保证走向局部最优或鞍点附近;初始化不同,答案可能不同。

05 用三个一维点手算一轮 E 步#

x=[0,1,2]x=[0,1,2],两个成分初始权重都为 0.50.5,均值 μ1=0\mu_1=0μ2=2\mu_2=2,方差都为 1。省略两个成分共有的 1/2π1/\sqrt{2\pi},高斯密度只需比较 exp[(xμ)2/2]\exp[-(x-\mu)^2/2]

x=0x=0,两个未归一化证据为:

a1=0.5e0=0.5,a2=0.5e20.0677a_1=0.5e^0=0.5,\qquad a_2=0.5e^{-2}\approx0.0677

所以 γ010.881\gamma_{01}\approx0.881γ020.119\gamma_{02}\approx0.119。同理:

Γ[0.8810.1190.5000.5000.1190.881]\Gamma\approx \begin{bmatrix} 0.881 & 0.119\\ 0.500 & 0.500\\ 0.119 & 0.881 \end{bmatrix}

于是 N1=N2=1.5N_1=N_2=1.5,新的权重仍为 0.50.5,均值更新为:

μ1new=0×0.881+1×0.5+2×0.1191.50.492\mu_1^{new}=\frac{0\times0.881+1\times0.5+2\times0.119}{1.5} \approx0.492

对称地 μ2new1.508\mu_2^{new}\approx1.508。中间点没有被武断地独占,而是向两个均值各贡献 0.50.5 个样本。

06 训练与推理的完整伪代码#

这里的 logsumexp 先减最大值再求指数,避免高维高斯密度下溢到 0。直接计算许多很小的密度再相除,常会得到 0 / 0 -> NaN

07 用 NumPy 写出可检查的一维 EM#

下面刻意限制为一维、对角方差,让更新本体保持透明:

多维 full 协方差还需稳定计算 log-determinant 与线性方程,生产代码不应手写矩阵逆。

08 用 scikit-learn 1.9 正确落地#

当前官方 GaussianMixture API 提供 predict_proba、逐样本 score_samples、平均对数似然 score、AIC/BIC 与收敛属性:

fit_predict 的最终标签可能与“先 fitpredict(X_train)”在边界样本上略有不同,因为前者返回最后一次 E 步的标签,而参数还可能在最后一次 M 步改变。若业务需要最终参数下的统一推理语义,应显式 fit 后调用 predictpredict_proba

09 协方差类型控制什么几何?#

covariance_type参数形状等概率线几何代价与偏差
spherical[K][K]每簇一个半径的圆/球最省参数,限制最强
diag[K,D][K,D]轴对齐椭圆不能表达特征相关
tied[D,D][D,D]各簇共享形状类似共享协方差思想
full[K,D,D][K,D,D]每簇可旋转椭圆最灵活,也最易过拟合

full 的协方差参数量随 KD2KD^2 增长。小样本高维数据中,应先考虑降维、diag/tied、更强 reg_covar 或带先验的 BayesianGaussianMixture,而不是默认使用最自由的模型。

10 怎样选择 K,而不是只看训练似然?#

增加成分几乎总能提高训练似然,因此不能用它单独选 KK。常用贝叶斯信息准则(Bayesian Information Criterion,BIC):

BIC=plogN2(θ^)\mathrm{BIC}=p\log N-2\ell(\hat\theta)

pp 是自由参数数目,值越小越好。还应结合留出集平均对数似然、成分稳定性、最小有效样本数和业务可解释性:

BIC 假设候选模型与独立同分布数据足够吻合;它不是“真实簇数探测器”。

11 最常见的失败与调试路径#

  1. 协方差塌缩:某成分抓住单个点,方差趋近 0、似然趋向无穷。检查最小特征值、weights_,提高 reg_covar
  2. 没有收敛:检查 converged_n_iter_ 和警告;增加 max_iter 前先缩放特征、换初始化并排查异常值。
  3. 局部最优:提高 n_init,比较不同种子的 lower_bound_ 和留出似然,不只看一次结果。
  4. 概率过度解读predict_proba 是模型假设下的成分后验,不是经真实类别校准的置信度。
  5. 数据泄漏:缩放器只能在训练集拟合;时序数据必须用过去训练、未来验证。
  6. 离群点牵引:高斯尾部仍可能用巨大协方差解释异常点;检查稳健预处理或显式异常模型。
  7. 维度过高:样本协方差近奇异;画特征值谱,核对每个成分的有效样本数是否远小于维数。

线上至少监控平均 score_samples、低密度样本比例、成分权重、均值漂移、协方差特征值和最大责任度分布。最大责任度普遍下降,可能表示簇开始重叠或出现了训练外模式。

12 GMM 与相近方法的边界#

方法分配/表示核心假设主要边界
K 均值最近中心硬分配近似等方差球形簇不给概率,不建模协方差
GMM后验概率软分配有限个高斯混合需给上限或 KK,怕奇异与异常值
核密度估计每个样本贡献核平滑密度不直接产生少数全局成分
LDA/QDA有标签的类后验类条件高斯是监督分类,标签已知
DBSCAN密度连通与噪声局部密度阈值可找非凸簇,但不输出生成概率

当真实结构是月牙、环或不同密度的连通区域时,多加几个高斯也许能近似密度,却未必给出符合语义的簇。

13 今天真正需要记住什么?#

GMM 用 πk\pi_kμk\mu_kΣk\Sigma_k 描述多个高斯成分;E 步把每个样本的成分证据归一化为责任度,M 步用责任度做加权统计。EM 单调改善训练目标,却不保证全局最优,也不能自动证明簇真实存在。可靠实践需要 log 空间计算、多次初始化、协方差正则、留出似然与稳定性诊断。

14 思考题与小练习#

  1. 延续三点例子,用更新后的两个均值和原方差再做一次 E 步。中间点责任度是否改变?两端样本为何变得更不确定或更确定?
  2. 对同一二维数据分别拟合 sphericaldiagtiedfull GMM,列出参数形状、BIC、留出似然和最小协方差特征值。
  3. 人为加入一个远离主体的孤立点,逐渐减小 reg_covar,观察成分权重、协方差行列式与训练似然;解释“似然更高但模型更坏”的原因。

相关工作#

15 下一篇预告#

GMM 能把圆团推广成重叠椭圆,却仍用若干参数化分布解释全部样本。下一篇将研究 DBSCAN:不预先指定簇数,只用 ε\varepsilon 邻域、核心点和密度可达关系,怎样沿弯曲形状扩展簇并把稀疏点标为噪声。

一个样本能同时像两个簇吗?高斯混合模型与 EM 软聚类
https://zwjcode.cn/blog/gmm-em-soft-clustering
作者
发布于 2026年8月27日
版权协议 CC BY-NC-SA 4.0
评论加载似乎遇到了问题,请尝试刷新页面。