跳到主要内容

高斯混合模型与 EM 算法

一、直观理解:数据是若干“椭圆团”的随机拼盘​

高斯混合模型(GMM)假设样本来自 KK 个高斯分布的加权和:

p(x)=∑k=1Kπk N(x∣μk,Σk)p(x)=\sum_{k=1}^{K}\pi_k\,\mathcal{N}(x\mid\mu_k,\Sigma_k)

每个分量是一个椭圆团(由协方差决定形状与方向),πk\pi_k 是该团的混合比重。聚类时,看样本更可能来自哪个分量,得到软分配(责任度)。

参数未知时用 EM 算法:E 步估计“这个点有多大可能来自第 kk 团”,M 步把责任度当权重更新 π,μ,Σ\pi,\mu,\Sigma,交替直到似然不再提升。

二、适用场景与优缺点​

类型说明
适用场景簇呈椭圆;需要概率模型与软标签;密度估计;可接受中等计算量。
核心优点比 K-means 灵活(不同大小/方向);有似然与 BIC 选 KK;生成式解释清晰。
局限与缺点正态假设;高维 Σ\Sigma 难估;局部最优;对初始化敏感;非椭圆复杂形状不如谱/密度法。

K-means 可视为等方、硬分配的极限特例。

三、核心原理​

1. 潜变量​

zi∈{1,…,K}z_i\in\{1,\ldots,K\} 指示来源分量。完全数据对数似然依赖 (xi,zi)(x_i,z_i)。

2. EM​

E 步责任度:

γik=P(zi=k∣xi)=πkN(xi∣μk,Σk)∑jπjN(xi∣μj,Σj)\gamma_{ik}=P(z_i=k\mid x_i)=\frac{\pi_k\mathcal{N}(x_i\mid\mu_k,\Sigma_k)}{\sum_j\pi_j\mathcal{N}(x_i\mid\mu_j,\Sigma_j)}

M 步:

Nk=∑iγik, πk=Nkn, μk=1Nk∑iγikxiN_k=\sum_i\gamma_{ik},\ \pi_k=\frac{N_k}{n},\ \mu_k=\frac{1}{N_k}\sum_i\gamma_{ik}x_i Σk=1Nk∑iγik(xi−μk)(xi−μk)T\Sigma_k=\frac{1}{N_k}\sum_i\gamma_{ik}(x_i-\mu_k)(x_i-\mu_k)^\mathsf{T}

每次 EM 不降低观测数据对数似然,但可能到局部极大。

3. 选 KK​

AIC/BIC:在似然与参数量间权衡;BIC 惩罚更强,常用。

四、关键决策​

决策点建议
协方差结构对角/共享/满矩阵;小样本用共享或对角
初值K-means++ 启动 + 多重启
KKBIC + 业务
正则对 Σ\Sigma 加 RegularizationValue 防奇异
标准化有助于数值稳定
硬标签arg⁡max⁡kγik\arg\max_k\gamma_{ik}

五、MATLAB 示例​

rng(5);
X = [mvnrnd([0 0],[1 0.6;0.6 1],50);
mvnrnd([4 1],[1 -0.4;-0.4 0.8],50)];
Xz = zscore(X);

% 拟合 GMM
K = 2;
gm = fitgmdist(Xz, K, ...
"Replicates", 5, ...
"CovarianceType", "full", ...
"RegularizationValue", 1e-6, ...
"Options", statset("MaxIter", 500, "Display", "off"));

idx = cluster(gm, Xz);
P = posterior(gm, Xz); % n x K 责任度

figure; gscatter(Xz(:,1), Xz(:,2), idx); hold on;
% 画置信椭圆可自写或用 gmPDF 等高线
gmPDF = @(x,y) arrayfun(@(a,b) pdf(gm, [a b]), x, y);
fcontour(gmPDF, [min(Xz(:,1)) max(Xz(:,1)) min(Xz(:,2)) max(Xz(:,2))]);
title("GMM 聚类与密度等高线");

fprintf("对数似然 = %.2f, AIC=%.1f, BIC=%.1f\n", ...
gm.NegativeLogLikelihood*(-1), gm.AIC, gm.BIC);

% 用 BIC 选 K
bics = zeros(1,5);
for k = 1:5
gmk = fitgmdist(Xz, k, "Replicates", 3, "RegularizationValue", 1e-6);
bics(k) = gmk.BIC;
end
figure; plot(1:5, bics, "-o");
xlabel("K"); ylabel("BIC"); title("GMM 的 BIC 选 K(越小越好)");
[~, bestK] = min(bics);
fprintf("BIC 建议 K=%d\n", bestK);

% 软分配示例
fprintf("前 5 个样本责任度:\n"); disp(P(1:5,:));

六、如何解释结果​

  1. πk,μk,Σk\pi_k,\mu_k,\Sigma_k:比重、中心、形状方向;
  2. 责任度:边界点的软归属;
  3. BIC 曲线:模型复杂度权衡;
  4. 与 K-means:椭圆拉伸簇上 GMM 更合理;
  5. 报告:协方差类型、正则、重启次数、BIC、KK。

七、常见误区​

1. 高维满协方差 + 小样本​

奇异或过拟合,应约束 Σ\Sigma。

2. 单次 EM 当全局最优​

必须 Replicates。

3. 把责任度解释为“真实比例身份”​

是模型推断,依赖正态混合假设。

4. 非高斯多峰硬套很少分量​

需更多分量或改模型,但分量过多难解释。

5. 只报似然不报 BIC/测试​

似然随 KK 升不说明更好。

八、小结​

GMM 用多个高斯分量的混合描述数据,EM 在责任度与参数之间交替估计;聚类、密度与软标签一体完成。

它是从 K-means 走向概率建模的自然升级:当簇大小方向不同且近似椭圆时,GMM+BIC 往往比纯 SSE 更有说服力。

(本节完)