通俗易懂讲透 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/2exp(−12(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=1Kπ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 步)
γik=πkP(xi∣μk,Σk)∑jπjP(xi∣μ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=∑γikxi∑γik
\mu_k = \frac{\sum \gamma_{ik}x_i}{\sum \gamma_{ik}}
μk=∑γik∑γikxi
Σk=∑γik(xi−μk)(xi−μk)T∑γik
\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=∑γikN
\pi_k = \frac{\sum \gamma_{ik}}{N}
πk=N∑γik
七、代码实战:GMM 图像分割(超炫酷)
直接复制可运行,包含:
图片加载GMM 聚类分割软概率图输出自定义色彩图
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from skimage import io
from matplotlib.colors import ListedColormap
# ===================== 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 = 4
gmm = 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-MeansGMM聚类方式硬分类软分类(概率)簇形状球形任意椭圆/方向输出标签概率速度快较慢初始化敏感更敏感高维一般较好
十一、什么时候用 GMM?
✅ 适合
簇是椭圆形、斜向、非球形需要概率输出数据近似高斯分布图像分割、异常检测、密度估计
❌ 不适合
追求超快速度数据完全不符合高斯分布完全不知道 K 是多少
十二、一句话总结
GMM 是基于高斯混合的概率软聚类算法,用 EM 算法迭代拟合多个钟形分布,能处理任意形状簇,是机器学习最经典的聚类模型之一。