高斯混合模型(GMM)超详细讲解(附聚类实战+Python完整代码)
高斯混合模型(GMM,Gaussian Mixture Model)是概率统计领域的经典聚类与密度估计算法,作为K-means硬聚类的进阶版本,GMM通过多个高斯分布的加权组合建模数据分布,实现软聚类(每个样本属于不同簇的概率),同时支持概率密度估计,是本科生、研究生学习聚类算法的核心内容,也是金融风控、图像分割、客户分群等场景的常用建模工具。
本文将从通俗原理、核心理论与数学推导、EM算法求解流程、聚类实战、优缺点与算法对比五个维度展开,内容通俗易懂,公式附带物理意义解释,附带可直接运行的Python代码和可视化分析,适配本科课程学习、研究生实践和工业级建模参考。
一、什么是高斯混合模型(GMM)?(通俗理解)
1.1 先搞懂两个核心概念
(1)高斯分布(正态分布)
高斯分布是自然界最常见的概率分布,呈钟形曲线,核心特征是大部分数据集中在均值附近,越偏离均值数据越少。比如人群的身高、体重,学生的考试成绩,都近似服从高斯分布。
(2)混合模型
混合模型指数据由多个子群体的分布组合而成,每个子群体对应一个基础分布(这里是高斯分布)。比如把男性和女性的身高数据混在一起,整体数据不再是单一高斯分布,而是男性身高高斯分布和女性身高高斯分布的混合分布。
1.2 GMM的通俗定义
GMM假设数据集是由K个高斯分布按不同比例加权混合生成的,它的核心目标是:通过算法找到这K个高斯分布的均值、协方差,以及每个高斯分布的权重,从而实现对数据的聚类或概率密度估计。
用身高数据聚类的例子轻松理解GMM:
现有一批无性别标签的身高数据,GMM会做这样的工作:
1.3 GMM与K-means的核心区别
K-means是硬聚类,GMM是软聚类,这是二者最本质的区别,直接决定了适用场景:
- K-means:每个样本唯一属于某一个簇,聚类结果是“非此即彼”,比如某个身高数据只能归为男性或女性;
- GMM:每个样本以不同概率属于所有簇,聚类结果是“概率分布”,比如某个身高165cm的样本,有70%概率是女性、30%概率是男性,最终可根据最大概率确定归属。
简单来说:K-means是“一刀切”的聚类,GMM是“概率化”的聚类,GMM能捕捉更复杂的数据分布,聚类结果更贴合实际。
二、GMM的核心理论基础
GMM的核心是概率密度函数的定义,以及通过最大化对数似然函数估计模型参数,而求解这一优化问题的经典算法是EM算法(期望最大化算法),这是GMM的数学基石。
2.1 GMM的概率密度函数
假设数据集X={x1,x2,…,xN}X=\\{x_1, x_2, …, x_N\\}X={x1,x2,…,xN},其中每个样本xix_ixi是ddd维特征向量,GMM假设该数据集由KKK个高斯分布加权混合生成,其概率密度函数为:
p(x)=∑k=1KπkN(x∣μk,Σk)p(x)=\\sum_{k=1}^{K} \\pi_{k} \\mathcal{N}\\left(x | \\mu_{k}, \\Sigma_{k}\\right)p(x)=k=1∑KπkN(x∣μk,Σk)
公式各部分物理意义
- KKK:高斯分布的数量,即聚类的簇数;
- πk\\pi_kπk:第kkk个高斯分布的权重,表示该分布在整体数据中的占比,满足∑k=1Kπk=1\\sum_{k=1}^K \\pi_k=1∑k=1Kπk=1且πk≥0\\pi_k \\geq 0πk≥0;
- N(x∣μk,Σk)\\mathcal{N}(x | \\mu_k, \\Sigma_k)N(x∣μk,Σk):第kkk个高斯分布的概率密度函数,μk\\mu_kμk为均值向量,Σk\\Sigma_kΣk为协方差矩阵;
- p(x)p(x)p(x):样本xxx在GMM模型中的概率密度值,反映样本符合该混合分布的程度。
单高斯分布的概率密度函数
GMM的基础是单高斯分布,ddd维单高斯分布的概率密度函数为:
N(x∣μk,Σk)=1(2π)d/2∣Σk∣1/2exp(−12(x−μk)TΣk−1(x−μk))\\mathcal{N}\\left(x | \\mu_{k}, \\Sigma_{k}\\right)=\\frac{1}{(2 \\pi)^{d / 2}\\left|\\Sigma_{k}\\right|^{1 / 2}} \\exp \\left(-\\frac{1}{2}\\left(x-\\mu_{k}\\right)^{T} \\Sigma_{k}^{-1}\\left(x-\\mu_{k}\\right)\\right)N(x∣μk,Σk)=(2π)d/2∣Σk∣1/21exp(−21(x−μk)TΣk−1(x−μk))
- ∣Σk∣|\\Sigma_k|∣Σk∣:协方差矩阵的行列式;
- Σk−1\\Sigma_k^{-1}Σk−1:协方差矩阵的逆矩阵;
- 核心部分(x−μk)TΣk−1(x−μk)\\left(x-\\mu_k\\right)^T \\Sigma_k^{-1} \\left(x-\\mu_k\\right)(x−μk)TΣk−1(x−μk):样本xxx到均值μk\\mu_kμk的马氏距离,考虑了特征之间的相关性,比欧氏距离更贴合实际。
2.2 GMM的模型参数与优化目标
(1)GMM的待估参数
GMM的模型参数集合Θ={πk,μk,Σk}k=1K\\Theta = \\{\\pi_k, \\mu_k, \\Sigma_k\\}_{k=1}^KΘ={πk,μk,Σk}k=1K,即需要为每个高斯分布估计3个参数:
- 权重πk\\pi_kπk:第kkk个簇的占比;
- 均值μk\\mu_kμk:第kkk个簇的中心;
- 协方差Σk\\Sigma_kΣk:第kkk个簇的数据离散程度和特征相关性。
(2)优化目标:最大化对数似然函数
GMM的训练目标是找到一组参数Θ\\ThetaΘ,让数据集XXX在该模型下的似然函数最大,即让模型尽可能贴合实际数据分布。
由于直接最大化似然函数计算复杂,通常对其取对数(不改变单调性,且将乘积转为求和,简化计算),得到对数似然函数:
lnp(X∣Θ)=∑i=1Nln(∑k=1KπkN(xi∣μk,Σk))\\ln p(X | \\Theta)=\\sum_{i=1}^{N} \\ln \\left(\\sum_{k=1}^{K} \\pi_{k} \\mathcal{N}\\left(x_{i} | \\mu_{k}, \\Sigma_{k}\\right)\\right)lnp(X∣Θ)=i=1∑Nln(k=1∑KπkN(xi∣μk,Σk))
- 该函数表示整个数据集在参数Θ\\ThetaΘ下的整体概率,值越大,模型拟合效果越好。
2.3 为什么用EM算法求解GMM?
直接对对数似然函数求导求解最优参数Θ\\ThetaΘ会遇到不可解的积分问题,因为公式中存在“求和内的对数”,无法通过求导得到闭式解。
而EM算法是解决含隐变量优化问题的经典迭代算法,GMM中存在隐变量ziz_izi(表示样本xix_ixi属于第kkk个高斯分布的标签),EM算法通过交替执行期望步(E步)和最大化步(M步),逐步逼近最优参数,完美解决了GMM的参数估计问题。
三、EM算法求解GMM的核心推导
EM算法的核心思想是:通过迭代估计隐变量的后验概率(E步),再利用后验概率更新模型参数(M步),直到参数收敛(变化小于预设阈值),最终得到最优的GMM模型。
3.1 隐变量与后验概率(责任γik\\gamma_{ik}γik)
定义隐变量zi∈{1,2,…,K}z_i \\in \\{1,2,…,K\\}zi∈{1,2,…,K},表示样本xix_ixi所属的高斯分布编号,zi=kz_i=kzi=k即表示xix_ixi属于第kkk个高斯分布。
在E步中,我们需要计算给定样本xix_ixi和当前参数Θ\\ThetaΘ时,隐变量zi=kz_i=kzi=k的后验概率,记为γik\\gamma_{ik}γik,也称为第kkk个高斯分布对样本xix_ixi的责任:
γik=p(zi=k∣xi,Θ)=πkN(xi∣μk,Σk)∑j=1KπjN(xi∣μj,Σj)\\gamma_{i k}=p\\left(z_{i}=k | x_{i}, \\Theta\\right)=\\frac{\\pi_{k} \\mathcal{N}\\left(x_{i} | \\mu_{k}, \\Sigma_{k}\\right)}{\\sum_{j=1}^{K} \\pi_{j} \\mathcal{N}\\left(x_{i} | \\mu_{j}, \\Sigma_{j}\\right)}γik=p(zi=k∣xi,Θ)=∑j=1KπjN(xi∣μj,Σj)πkN(xi∣μk,Σk)
公式意义
- 分子:第kkk个高斯分布的权重πk\\pi_kπk乘以样本xix_ixi在该分布下的概率密度,即先验概率×似然;
- 分母:所有高斯分布的“先验概率×似然”之和,即全概率;
- γik\\gamma_{ik}γik的物理意义:在当前模型下,样本xix_ixi属于第kkk个簇的概率,满足∑k=1Kγik=1\\sum_{k=1}^K \\gamma_{ik}=1∑k=1Kγik=1。
3.2 EM算法的两步迭代推导
EM算法的迭代过程分为E步和M步,先初始化参数,再交替执行两步,直到收敛,以下是完整的参数更新公式推导(本科/研究生入门阶段重点掌握公式含义和使用,无需深究复杂的求导过程)。
步骤1:期望步(E步)
根据当前模型参数Θ(t)\\Theta^{(t)}Θ(t)(上一轮迭代的参数),计算每个样本xix_ixi属于每个高斯分布kkk的后验概率γik\\gamma_{ik}γik,即:
γik(t)=πk(t)N(xi∣μk(t),Σk(t))∑j=1Kπj(t)N(xi∣μj(t),Σj(t))\\gamma_{ik}^{(t)} = \\frac{\\pi_k^{(t)} \\mathcal{N}\\left(x_i | \\mu_k^{(t)}, \\Sigma_k^{(t)}\\right)}{\\sum_{j=1}^K \\pi_j^{(t)} \\mathcal{N}\\left(x_i | \\mu_j^{(t)}, \\Sigma_j^{(t)}\\right)}γik(t)=∑j=1Kπj(t)N(xi∣μj(t),Σj(t))πk(t)N(xi∣μk(t),Σk(t))
- 核心结果:得到所有样本的归属概率γik\\gamma_{ik}γik,为后续参数更新提供依据。
步骤2:最大化步(M步)
利用E步得到的后验概率γik\\gamma_{ik}γik,重新估计模型参数Θ(t+1)\\Theta^{(t+1)}Θ(t+1),让对数似然函数最大化,三个参数的更新公式如下:
(1)更新权重πk\\pi_kπk
πk(t+1)=NkN\\pi_k^{(t+1)} = \\frac{N_k}{N}πk(t+1)=NNk
其中Nk=∑i=1NγikN_k = \\sum_{i=1}^N \\gamma_{ik}Nk=∑i=1Nγik,表示第kkk个高斯分布的有效样本数(由归属概率加权求和得到,而非整数),NNN为总样本数。
- 意义:第kkk个簇的权重等于其有效样本数占总样本数的比例。
(2)更新均值μk\\mu_kμk
μk(t+1)=1Nk∑i=1Nγikxi\\mu_k^{(t+1)} = \\frac{1}{N_k} \\sum_{i=1}^N \\gamma_{ik} x_iμk(t+1)=Nk1i=1∑Nγikxi
- 意义:第kkk个簇的均值是所有样本的加权平均,权重为样本对该簇的归属概率γik\\gamma_{ik}γik,相比K-means的简单平均,更贴合软聚类的特点。
(3)更新协方差矩阵Σk\\Sigma_kΣk
Σk(t+1)=1Nk∑i=1Nγik(xi−μk(t+1))(xi−μk(t+1))T\\Sigma_k^{(t+1)} = \\frac{1}{N_k} \\sum_{i=1}^N \\gamma_{ik} \\left(x_i – \\mu_k^{(t+1)}\\right) \\left(x_i – \\mu_k^{(t+1)}\\right)^TΣk(t+1)=Nk1i=1∑Nγik(xi−μk(t+1))(xi−μk(t+1))T
- 意义:第kkk个簇的协方差矩阵是样本与均值的偏差的加权协方差,权重仍为γik\\gamma_{ik}γik,能反映该簇数据的离散程度和特征之间的相关性。
3.3 EM算法的收敛判断
每次迭代(E步+M步)后,计算当前参数下的对数似然函数值L(Θ(t+1))L(\\Theta^{(t+1)})L(Θ(t+1)),并与上一轮的L(Θ(t))L(\\Theta^{(t)})L(Θ(t))比较:
L(Θ)=∑i=1Nln(∑k=1KπkN(xi∣μk,Σk))L(\\Theta) = \\sum_{i=1}^N \\ln \\left(\\sum_{k=1}^K \\pi_k \\mathcal{N}\\left(x_i | \\mu_k, \\Sigma_k\\right)\\right)L(Θ)=i=1∑Nln(k=1∑KπkN(xi∣μk,Σk))
- 若两次对数似然函数的差值小于预设阈值(如10−610^{-6}10−6),则认为模型参数收敛,停止迭代;
- 若未收敛,则用新参数Θ(t+1)\\Theta^{(t+1)}Θ(t+1)继续执行下一轮E步和M步。
核心性质:EM算法的对数似然函数值单调不减,即L(Θ(t+1))≥L(Θ(t))L(\\Theta^{(t+1)}) \\geq L(\\Theta^{(t)})L(Θ(t+1))≥L(Θ(t)),保证算法最终会收敛(可能收敛到局部最优,因此需要合理初始化参数)。
四、GMM的完整算法流程
GMM的训练过程是参数初始化+EM算法迭代+收敛判断的组合,流程清晰,每一步都有明确的数学依据,同时合理的参数初始化能避免算法收敛到局部最优。
步骤1:模型参数初始化
首先确定高斯分布的数量KKK(即聚类簇数),然后初始化模型参数Θ(0)=[πk(0),μk(0),Σk(0)]\\Theta^{(0)} = [\\pi_k^{(0)}, \\mu_k^{(0)}, \\Sigma_k^{(0)}]Θ(0)=[πk(0),μk(0),Σk(0)],不建议随机初始化(易收敛到局部最优),推荐两种初始化方式:
步骤2:执行EM算法迭代
交替执行E步和M步,逐步更新模型参数:
步骤3:收敛判断
计算迭代前后的对数似然函数值L(Θ(t))L(\\Theta^{(t)})L(Θ(t))和L(Θ(t+1))L(\\Theta^{(t+1)})L(Θ(t+1)),判断是否满足收敛条件:
- 若∣L(Θ(t+1))−L(Θ(t))∣<ϵ|L(\\Theta^{(t+1)}) – L(\\Theta^{(t)})| < \\epsilon∣L(Θ(t+1))−L(Θ(t))∣<ϵ(ϵ\\epsilonϵ为预设阈值,如10−610^{-6}10−6),则收敛,停止迭代;
- 若未收敛,令Θ(t)=Θ(t+1)\\Theta^{(t)} = \\Theta^{(t+1)}Θ(t)=Θ(t+1),返回步骤2继续迭代。
步骤4:模型输出与应用
迭代收敛后,得到最优模型参数Θ∗\\Theta^*Θ∗,此时可实现两大核心功能:
五、GMM实战:数据聚类与模型优化(Python完整代码)
本次实战基于人工生成的混合高斯数据集,实现GMM聚类、聚类结果可视化、最优簇数选择(AIC/BIC准则),使用sklearn的GaussianMixture(封装好的GMM实现,入门友好),代码可直接复制运行,适配Python3.8+、scikit-learn1.0+、matplotlib3.5+。
5.1 实战目标
5.2 完整代码与详细注释
# 导入所需库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 设置可视化风格
sns.set(style="white", palette="muted", color_codes=True)
# ===================== 1. 生成混合高斯数据集 =====================
# 数据集参数
n_samples = 5000 # 总样本数
n_features = 4 # 特征维度
n_clusters = 4 # 真实簇数(高斯分布数量)
random_state = 42 # 随机种子,保证结果可复现
# 生成混合高斯数据:make_blobs生成多簇数据,符合GMM假设
X, y_true = make_blobs(
n_samples=n_samples,
n_features=n_features,
centers=n_clusters,
cluster_std=0.60, # 簇内标准差
random_state=random_state
)
print(f"数据集形状:{X.shape},真实簇数:{n_clusters}")
# ===================== 2. 数据预处理 =====================
# GMM对特征尺度敏感,需标准化(均值0,方差1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 转换为DataFrame,方便后续处理
df = pd.DataFrame(
X_scaled,
columns=[f'特征{i+1}' for i in range(n_features)]
)
df['真实簇标签'] = y_true # 添加真实簇标签
# ===================== 3. 基础GMM模型训练与聚类 =====================
# 初始化GMM模型
gmm_base = GaussianMixture(
n_components=n_clusters, # 高斯分布数量(簇数),与真实值一致
covariance_type='full', # 协方差类型:full表示每个簇有独立的协方差矩阵
random_state=random_state,
max_iter=100, # 最大迭代次数
tol=1e-6 # 收敛阈值
)
# 训练模型并预测聚类结果
gmm_base.fit(X_scaled)
y_pred_base = gmm_base.predict(X_scaled) # 硬聚类结果(最大概率簇)
y_pred_proba = gmm_base.predict_proba(X_scaled) # 软聚类结果(归属概率)
# 将结果添加到DataFrame
df['GMM聚类标签'] = y_pred_base
# 添加样本对第一簇的归属概率(示例)
df['第一簇归属概率'] = y_pred_proba[:, 0]
print(f"GMM模型迭代次数:{gmm_base.n_iter_}")
print(f"模型最终对数似然值:{gmm_base.score(X_scaled):.4f}")
# ===================== 4. 聚类结果可视化(PCA降维到2D) =====================
# PCA降维:将4维特征降到2维,方便可视化
pca = PCA(n_components=2, random_state=random_state)
X_pca = pca.fit_transform(X_scaled)
df['PCA1'] = X_pca[:, 0]
df['PCA2'] = X_pca[:, 1]
# 绘制可视化图:真实标签 vs GMM聚类标签
plt.figure(figsize=(16, 7))
# 子图1:真实簇标签分布
plt.subplot(1, 2, 1)
sns.scatterplot(
x='PCA1', y='PCA2', hue='真实簇标签',
data=df, palette='viridis', s=20, edgecolor='k', alpha=0.8
)
plt.title('真实簇标签分布', fontsize=16)
plt.xlabel('主成分1(PCA1)', fontsize=14)
plt.ylabel('主成分2(PCA2)', fontsize=14)
plt.legend(title='真实簇', fontsize=12)
plt.grid(alpha=0.3)
# 子图2:GMM聚类标签分布
plt.subplot(1, 2, 2)
sns.scatterplot(
x='PCA1', y='PCA2', hue='GMM聚类标签',
data=df, palette='viridis', s=20, edgecolor='k', alpha=0.8
)
plt.title('GMM聚类结果分布', fontsize=16)
plt.xlabel('主成分1(PCA1)', fontsize=14)
plt.ylabel('主成分2(PCA2)', fontsize=14)
plt.legend(title='GMM簇', fontsize=12)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
# ===================== 5. 最优簇数K的选择(AIC/BIC准则) =====================
# 测试簇数范围:1~9
n_components_range = range(1, 10)
# 存储不同簇数的AIC和BIC值
aic_list = []
bic_list = []
for n in n_components_range:
gmm = GaussianMixture(
n_components=n,
covariance_type='full',
random_state=random_state
)
gmm.fit(X_scaled)
aic_list.append(gmm.aic(X_scaled)) # AIC准则
bic_list.append(gmm.bic(X_scaled)) # BIC准则
# 绘制AIC/BIC曲线
plt.figure(figsize=(12, 6))
plt.plot(n_components_range, aic_list, marker='o', linewidth=2, label='AIC')
plt.plot(n_components_range, bic_list, marker='s', linewidth=2, label='BIC')
plt.xlabel('高斯分布数量(簇数K)', fontsize=14)
plt.ylabel('AIC/BIC值', fontsize=14)
plt.title('GMM最优簇数选择(AIC/BIC准则)', fontsize=16)
plt.legend(fontsize=12)
plt.xticks(n_components_range)
plt.grid(alpha=0.3)
plt.show()
# 选择最优簇数:BIC值最小的簇数(BIC对复杂模型惩罚更重,更适合小样本)
best_n = n_components_range[np.argmin(bic_list)]
print(f"根据BIC准则,最优簇数为:{best_n}")
# ===================== 6. 最优簇数GMM模型训练与可视化 =====================
# 初始化最优GMM模型
gmm_best = GaussianMixture(
n_components=best_n,
covariance_type='full',
random_state=random_state
)
gmm_best.fit(X_scaled)
y_pred_best = gmm_best.predict(X_scaled)
df['GMM最优聚类标签'] = y_pred_best
# 可视化最优聚类结果
plt.figure(figsize=(10, 8))
sns.scatterplot(
x='PCA1', y='PCA2', hue='GMM最优聚类标签',
data=df, palette='viridis', s=20, edgecolor='k', alpha=0.8
)
plt.title(f'GMM最优聚类结果(K={best_n})', fontsize=16)
plt.xlabel('主成分1(PCA1)', fontsize=14)
plt.ylabel('主成分2(PCA2)', fontsize=14)
plt.legend(title='GMM最优簇', fontsize=12)
plt.grid(alpha=0.3)
plt.show()
# ===================== 7. GMM概率密度估计与异常检测(拓展) =====================
# 计算每个样本的概率密度值(对数形式)
log_density = gmm_best.score_samples(X_scaled)
df['对数密度值'] = log_density
# 异常检测:密度值低于第5百分位数的样本为异常值
threshold = np.percentile(log_density, 5)
df['是否异常'] = (log_density < threshold).astype(int)
# 可视化异常检测结果
plt.figure(figsize=(10, 8))
# 正常样本
sns.scatterplot(
x='PCA1', y='PCA2', data=df[df['是否异常']==0],
color='lightblue', s=20, edgecolor='k', alpha=0.6, label='正常样本'
)
# 异常样本
sns.scatterplot(
x='PCA1', y='PCA2', data=df[df['是否异常']==1],
color='red', s=50, edgecolor='k', alpha=0.8, label='异常样本'
)
plt.title('GMM密度估计-异常检测结果', fontsize=16)
plt.xlabel('主成分1(PCA1)', fontsize=14)
plt.ylabel('主成分2(PCA2)', fontsize=14)
plt.legend(fontsize=12)
plt.grid(alpha=0.3)
plt.show()
print(f"检测到异常样本数:{df['是否异常'].sum()},占比:{df['是否异常'].mean()*100:.2f}%")
5.3 运行结果说明
5.4 GMM核心超参数调优指南
sklearn的GaussianMixture封装了GMM的核心实现,实战中只需调优核心超参数即可达到较好的效果,按调优优先级排序如下:
| n_components | 高斯分布数量(聚类簇数K) | 1~10(根据数据调整) | 用AIC/BIC准则选择,取最小值对应的K |
| covariance_type | 协方差矩阵类型 | full/tied/diag/spherical | 优先选full(每个簇独立协方差,拟合能力最强);数据量小时选diag(对角协方差,减少参数) |
| tol | 收敛阈值 | 1e-6/1e-4 | 越小收敛越精准,迭代次数越多;默认1e-6即可 |
| max_iter | 最大迭代次数 | 100/200/500 | 若未收敛(n_iter_ == max_iter),则增大该值 |
| init_params | 参数初始化方式 | kmeans/random | 优先选kmeans(基于K-means初始化,避免局部最优) |
核心调优原则:先通过AIC/BIC确定最优簇数K,再选择协方差类型,最后微调收敛阈值和迭代次数。
5.5 AIC与BIC准则的选择
AIC(赤池信息准则)和BIC(贝叶斯信息准则)都是模型选择的经典准则,核心是在模型拟合度和复杂度之间做权衡,值越小表示模型越优,二者的区别:
- AIC:AIC=2k−2lnLAIC = 2k – 2\\ln LAIC=2k−2lnL,kkk为模型参数数,对复杂模型惩罚较轻,适合大数据集;
- BIC:BIC=klnN−2lnLBIC = k\\ln N – 2\\ln LBIC=klnN−2lnL,NNN为样本数,对复杂模型惩罚更重,适合小数据集;
- 实战中:若样本数N>1000N>1000N>1000,可参考AIC;若N<1000N<1000N<1000,优先参考BIC。
六、GMM的优缺点
GMM作为经典的概率聚类算法,兼具聚类和密度估计的双重功能,是软聚类的代表,但其也存在一定的局限性,优缺点总结如下,适配本科/研究生课程考点和工业级选型参考。
6.1 核心优点
6.2 核心缺点
七、GMM与主流聚类算法的对比
为了让大家在实战中精准选择聚类算法,以下从聚类类型、模型假设、拟合能力、计算复杂度等核心维度,对比GMM与K-means、DBSCAN、层次聚类三种主流聚类算法的差异,表格简洁明了,适配本科课程考核和工业级建模选型。
| 聚类类型 | 软聚类(概率归属) | 硬聚类(唯一归属) | 硬聚类(密度归属) | 硬聚类(层次归属) |
| 模型假设 | 数据由K个高斯分布混合而成 | 簇为球形、大小相似、密度均匀 | 簇为密度连通的区域,存在噪声 | 数据存在层次化的簇结构 |
| 簇数K | 需预设,通过AIC/BIC选择 | 需预设,通过肘部法则选择 | 无需预设,自动发现簇数 | 无需预设,生成层次簇树 |
| 簇形状拟合 | 任意形状(椭圆、球形) | 仅球形簇 | 任意形状(密度连通) | 任意形状 |
| 核心功能 | 聚类+概率密度估计 | 仅聚类 | 聚类+噪声检测 | 仅聚类(层次化) |
| 对噪声/异常值 | 敏感,需提前清洗 | 敏感,易被异常值影响簇中心 | 鲁棒,能自动检测并排除噪声 | 敏感,噪声会影响层次结构 |
| 计算复杂度 | 中等(O(NKdT)O(NKdT)O(NKdT)) | 低(O(NKdT)O(NKdT)O(NKdT)) | 中等(O(N2)O(N^2)O(N2),索引优化后O(NlogN)O(NlogN)O(NlogN)) | 高(O(N2)O(N^2)O(N2)) |
| 适用于 | 中高维、混合高斯分布、需要软聚类/密度估计 | 低维、球形簇、大数据集、追求速度 | 任意形状簇、含噪声的数据、无需预设簇数 | 小数据集、需要层次化聚类结果 |
| 代表场景 | 客户分群、图像分割、异常检测、密度估计 | 简单数据聚类、快速分群、基线模型 | 空间数据聚类、含噪声的工业数据聚类 | 生物分类、文本层次分群、小数据集探索 |
核心选型建议
八、GMM的适用场景与实战建议
GMM的核心优势是软聚类+概率密度估计,且能拟合复杂的簇形状,但其依赖高斯分布假设、对初始参数敏感的局限性也决定了它的适用边界,以下是实战中的选型建议和使用技巧,帮助大家避坑。
8.1 优先选择GMM的场景
8.2 考虑其他算法的场景
8.3 GMM的实战使用技巧
数据预处理:标准化+异常值清洗是必做项
- 标准化:GMM对特征尺度敏感,不同特征的量纲差异会导致协方差矩阵估计偏差,必须用StandardScaler做标准化;
- 异常值清洗:通过箱线图、Z-score等方法清洗异常值,避免异常值影响均值和协方差的估计;
- 缺失值处理:GMM不支持缺失值,需用均值、中位数或插值法填充。
参数初始化:优先使用K-means初始化
- 避免随机初始化,否则EM算法易收敛到局部最优,设置init_params='kmeans',利用K-means的簇中心和协方差初始化GMM参数,大幅提升收敛效果;
- 若数据量较小,可多次运行GMM(不同随机种子),选择对数似然值最大的模型。
簇数选择:结合AIC/BIC与业务意义
- 先用AIC/BIC准则得到最优簇数K,再结合业务意义调整,比如客户分群中,AIC建议K=5,但业务上仅需3类客户,可手动调整为K=3;
- 若AIC/BIC曲线无明显最小值(平缓下降),选择“拐点”对应的K值。
协方差类型选择:根据数据量和维度调整
- 数据量充足、维度适中:选covariance_type='full',拟合能力最强,能捕捉簇的复杂形状;
- 数据量小、维度高:选covariance_type='diag'(对角协方差),减少参数数量,避免协方差矩阵奇异;
- 簇形状接近球形:选covariance_type='spherical'(球形协方差),进一步简化计算。
模型评估:结合定量指标与定性可视化
- 定量指标:使用轮廓系数(Silhouette Coefficient)、Calinski-Harabasz指数评估聚类效果,值越大表示簇内越紧密、簇间越分离;
- 定性可视化:通过PCA、t-SNE将高维数据降到2D/3D,可视化聚类结果,直观判断簇的分离效果;
- 业务验证:聚类结果需符合业务逻辑,比如客户分群的结果需与实际的消费行为、人口特征一致。
高维数据优化:降维后再聚类
- 对超高维数据(如特征数>100),先通过PCA、LDA做特征降维,再用GMM聚类,避免维度灾难和协方差矩阵不稳定的问题。
九、总结
拓展学习:掌握GMM后,可依次学习隐马尔可夫模型(HMM)(序列数据的概率建模)、变分推断高斯混合模型(VB-GMM)(解决GMM的过拟合问题)、混合分布模型(如泊松混合模型、贝塔混合模型,适用于非高斯分布数据),进一步完善概率统计建模的知识体系。
网硕互联帮助中心






评论前必须登录!
注册