通俗易懂讲透 GMM 高斯混合聚类
通俗易懂讲透 GMM 高斯混合聚类|本科生/研究生都能看懂
本文用大白话+生活案例+公式拆解+完整代码+可视化,把 GMM(高斯混合模型)从原理、EM 算法、优缺点到实战讲得明明白白,适合机器学习入门、面试复习、课程笔记。
一、先搞懂:GMM 到底是什么?
一句话定义:
GMM = 用多个“钟形曲线(高斯分布)”去拟合数据,按概率做软聚类的算法。
和 K-Means 最大区别:
- K-Means:硬分组,一个点只能属于一类
- GMM:软分组,一个点可以按概率属于多个类
比如:这个点 70% 属于A类,30% 属于B类
二、超通俗例子:饮料分类
你要把饮料分成两类:
- 气泡饮料(可乐、雪碧)
- 果汁饮料(橙汁、苹果汁)
用两个特征:
- 甜度
- 气泡强度
GMM 做的事:
- 假设两类饮料各自服从一个高斯分布(钟形)
- 算出每瓶饮料属于哪一类的概率
- 自动调整两个分布的中心、形状,让数据拟合最好
三、GMM 核心思想(3 句话)
- 数据是由K 个高斯分布混合生成的
- 每个簇 = 一个高斯分布(均值 + 协方差)
- 用EM 算法迭代求解:先算概率,再更新分布
四、GMM 最关键的 3 个参数
对每个高斯分布 k:
- π_k:权重(这个簇占多少比例)
- μ_k:均值(中心位置)
- Σ_k:协方差矩阵(形状、方向、胖瘦)
五、EM 算法是什么?(最简单解释)
GMM 用 EM 算法训练,只做两件事:
1. E 步(Expectation)
算每个点属于每个簇的概率(叫责任度 γ)
2. M 步(Maximization)
用这些概率重新估计 μ、Σ、π
不断循环,直到分布不再变化。
六、核心公式(看懂就行)
1. 单个高斯分布
P ( x ) = 1 ( 2 π ) d / 2 ∣ Σ ∣ 1 / 2 exp ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) P(x) = \frac{1}{(2\pi)^{d/2}|\Sigma|^{1/2}} \exp\left(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\right)P(x)=(2π)d/2∣Σ∣1/21exp(−21(x−μ)TΣ−1(x−μ))
2. 混合分布
P ( x ) = ∑ k = 1 K π k ⋅ P ( x ∣ μ k , Σ k ) P(x) = \sum_{k=1}^K \pi_k \cdot P(x|\mu_k,\Sigma_k)P(x)=k=1∑Kπk⋅P(x∣μk,Σk)
3. 责任度(E 步)
γ i k = π k P ( x i ∣ μ k , Σ k ) ∑ j π j P ( x i ∣ μ j , Σ j ) \gamma_{ik} = \frac{\pi_k P(x_i|\mu_k,\Sigma_k)}{\sum_j \pi_j P(x_i|\mu_j,\Sigma_j)}γik=∑jπjP(xi∣μj,Σj)πkP(xi∣μk,Σk)
4. M 步更新
μ k = ∑ γ i k x i ∑ γ i k \mu_k = \frac{\sum \gamma_{ik}x_i}{\sum \gamma_{ik}}μk=∑γik∑γikxi
Σ k = ∑ γ i k ( x i − μ k ) ( x i − μ k ) T ∑ γ i k \Sigma_k = \frac{\sum \gamma_{ik}(x_i-\mu_k)(x_i-\mu_k)^T}{\sum \gamma_{ik}}Σk=∑γik∑γik(xi−μk)(xi−μk)T
π k = ∑ γ i k N \pi_k = \frac{\sum \gamma_{ik}}{N}πk=N∑γik
七、代码实战:GMM 图像分割(超炫酷)
直接复制可运行,包含:
- 图片加载
- GMM 聚类分割
- 软概率图输出
- 自定义色彩图
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.mixtureimportGaussianMixturefromskimageimportiofrommatplotlib.colorsimportListedColormap# ===================== 1. 加载图片 =====================image_url="https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Example.jpg/800px-Example.jpg"image=io.imread(image_url)plt.figure(figsize=(8,8))plt.imshow(image)plt.title("原始图片")plt.axis("off")plt.show()# ===================== 2. 展平像素 =====================h,w,_=image.shape pixels=image.reshape(-,3)# ===================== 3. GMM 聚类 =====================n_components=4gmm=GaussianMixture(n_components=n_components,random_state=42)labels=gmm.fit_predict(pixels)# ===================== 4. 分割结果 =====================seg_img=labels.reshape(h,w)custom_cmap=ListedColormap(["#FF5733","#33FF57","#3357FF","#FFD700"])plt.figure(figsize=(8,8))plt.imshow(seg_img,cmap=custom_cmap)plt.title("GMM 图像分割结果")plt.axis("off")plt.show()# ===================== 5. 软概率图 =====================proba=gmm.predict_proba(pixels)[:,0].reshape(h,w)plt.figure(figsize=(8,8))plt.imshow(proba,cmap="plasma")plt.title("第1类概率热力图")plt.axis("off")plt.show()八、GMM 优点(面试必背)
- 软聚类:输出概率,边界更自然
- 能拟合任意形状簇(椭圆、长条、斜向)
- 生成式模型:可做密度估计、异常检测
- 能捕捉特征相关性(协方差矩阵)
- 高维数据友好
九、GMM 缺点
- 必须指定 K(簇数量)
- 对初始化敏感
- 比 K-Means 慢
- 假设数据服从高斯分布
- 容易局部最优
十、GMM vs K-Means(速记表)
| 特点 | K-Means | GMM |
|---|---|---|
| 聚类方式 | 硬分类 | 软分类(概率) |
| 簇形状 | 球形 | 任意椭圆/方向 |
| 输出 | 标签 | 概率 |
| 速度 | 快 | 较慢 |
| 初始化 | 敏感 | 更敏感 |
| 高维 | 一般 | 较好 |
十一、什么时候用 GMM?
✅适合
- 簇是椭圆形、斜向、非球形
- 需要概率输出
- 数据近似高斯分布
- 图像分割、异常检测、密度估计
❌不适合
- 追求超快速度
- 数据完全不符合高斯分布
- 完全不知道 K 是多少
十二、一句话总结
GMM 是基于高斯混合的概率软聚类算法,用 EM 算法迭代拟合多个钟形分布,能处理任意形状簇,是机器学习最经典的聚类模型之一。
