云计算百科
云计算领域专业知识百科平台

【分类算法】高斯混合模型(GMM)超详细讲解

高斯混合模型(GMM)超详细讲解(附聚类实战+Python完整代码)

高斯混合模型(GMM,Gaussian Mixture Model)是概率统计领域的经典聚类与密度估计算法,作为K-means硬聚类的进阶版本,GMM通过多个高斯分布的加权组合建模数据分布,实现软聚类(每个样本属于不同簇的概率),同时支持概率密度估计,是本科生、研究生学习聚类算法的核心内容,也是金融风控、图像分割、客户分群等场景的常用建模工具。

本文将从通俗原理、核心理论与数学推导、EM算法求解流程、聚类实战、优缺点与算法对比五个维度展开,内容通俗易懂,公式附带物理意义解释,附带可直接运行的Python代码和可视化分析,适配本科课程学习、研究生实践和工业级建模参考。

一、什么是高斯混合模型(GMM)?(通俗理解)

1.1 先搞懂两个核心概念

(1)高斯分布(正态分布)

高斯分布是自然界最常见的概率分布,呈钟形曲线,核心特征是大部分数据集中在均值附近,越偏离均值数据越少。比如人群的身高、体重,学生的考试成绩,都近似服从高斯分布。

(2)混合模型

混合模型指数据由多个子群体的分布组合而成,每个子群体对应一个基础分布(这里是高斯分布)。比如把男性和女性的身高数据混在一起,整体数据不再是单一高斯分布,而是男性身高高斯分布和女性身高高斯分布的混合分布。

1.2 GMM的通俗定义

GMM假设数据集是由K个高斯分布按不同比例加权混合生成的,它的核心目标是:通过算法找到这K个高斯分布的均值、协方差,以及每个高斯分布的权重,从而实现对数据的聚类或概率密度估计。

用身高数据聚类的例子轻松理解GMM:

现有一批无性别标签的身高数据,GMM会做这样的工作:

  • 假设数据由2个高斯分布(对应男、女)混合而成;
  • 通过算法计算每个身高数据属于“男性高斯分布”的概率和“女性高斯分布”的概率;
  • 找到这两个高斯分布的最佳均值(如男性175cm、女性160cm)、协方差(数据离散程度),以及权重(如男性占60%、女性占40%);
  • 最终根据样本的归属概率,将数据分为男性、女性两类(聚类),同时能描述整体身高数据的分布情况(密度估计)。
  • 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_ixiddd维特征向量,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=1KπkN(xμk,Σk)

    公式各部分物理意义
    • KKK:高斯分布的数量,即聚类的簇数;
    • πk\\pi_kπk:第kkk个高斯分布的权重,表示该分布在整体数据中的占比,满足∑k=1Kπk=1\\sum_{k=1}^K \\pi_k=1k=1Kπk=1πk≥0\\pi_k \\geq 0πk0
    • 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Σk1/21exp(21(xμk)TΣk1(xμk))

    • ∣Σk∣|\\Sigma_k|Σk:协方差矩阵的行列式;
    • Σk−1\\Sigma_k^{-1}Σk1:协方差矩阵的逆矩阵;
    • 核心部分(x−μk)TΣk−1(x−μk)\\left(x-\\mu_k\\right)^T \\Sigma_k^{-1} \\left(x-\\mu_k\\right)(xμk)TΣk1(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在该模型下的似然函数最大,即让模型尽可能贴合实际数据分布。

    由于直接最大化似然函数计算复杂,通常对其取对数(不改变单调性,且将乘积转为求和,简化计算),得到对数似然函数:
    ln⁡p(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=1Nln(k=1Kπ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=kxi,Θ)=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}=1k=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=1Nγ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=1Nγ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=1Nln(k=1KπkN(xiμk,Σk))

    • 若两次对数似然函数的差值小于预设阈值(如10−610^{-6}106),则认为模型参数收敛,停止迭代;
    • 若未收敛,则用新参数Θ(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)],不建议随机初始化(易收敛到局部最优),推荐两种初始化方式:

  • K-means初始化(最常用):先对数据做K-means聚类,将K-means的簇中心作为GMM的初始均值μk(0)\\mu_k^{(0)}μk(0),簇的样本比例作为初始权重πk(0)\\pi_k^{(0)}πk(0),簇内样本的协方差作为初始协方差Σk(0)\\Sigma_k^{(0)}Σk(0)
  • 随机采样初始化:从数据中随机采样K个样本作为初始均值μk(0)\\mu_k^{(0)}μk(0),权重πk(0)\\pi_k^{(0)}πk(0)初始化为1/K1/K1/K,协方差Σk(0)\\Sigma_k^{(0)}Σk(0)初始化为单位矩阵。
  • 步骤2:执行EM算法迭代

    交替执行E步和M步,逐步更新模型参数:

  • E步:根据当前参数Θ(t)\\Theta^{(t)}Θ(t),计算所有样本xix_ixi对所有簇kkk的后验概率(责任)γik(t)\\gamma_{ik}^{(t)}γik(t)
  • M步:根据γik(t)\\gamma_{ik}^{(t)}γik(t),分别更新权重πk(t+1)\\pi_k^{(t+1)}πk(t+1)、均值μk(t+1)\\mu_k^{(t+1)}μk(t+1)、协方差Σk(t+1)\\Sigma_k^{(t+1)}Σk(t+1)
  • 步骤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)})| < \\epsilonL(Θ(t+1))L(Θ(t))<ϵϵ\\epsilonϵ为预设阈值,如10−610^{-6}106),则收敛,停止迭代;
    • 若未收敛,令Θ(t)=Θ(t+1)\\Theta^{(t)} = \\Theta^{(t+1)}Θ(t)=Θ(t+1),返回步骤2继续迭代。

    步骤4:模型输出与应用

    迭代收敛后,得到最优模型参数Θ∗\\Theta^*Θ,此时可实现两大核心功能:

  • 聚类:对每个样本xix_ixi,计算其对所有簇的后验概率γik\\gamma_{ik}γik,将样本归为概率最大的簇,即k∗=arg⁡max⁡kγikk^* = \\arg\\max_{k} \\gamma_{ik}k=argmaxkγik
  • 概率密度估计:利用GMM的概率密度函数p(x)p(x)p(x),计算任意样本xxx的密度值,用于异常检测(密度值过低的样本为异常值)、样本生成等。
  • 五、GMM实战:数据聚类与模型优化(Python完整代码)

    本次实战基于人工生成的混合高斯数据集,实现GMM聚类、聚类结果可视化、最优簇数选择(AIC/BIC准则),使用sklearn的GaussianMixture(封装好的GMM实现,入门友好),代码可直接复制运行,适配Python3.8+、scikit-learn1.0+、matplotlib3.5+。

    5.1 实战目标

  • 掌握GMM的基本使用流程:数据生成、标准化、模型训练、聚类预测;
  • 学习GMM聚类结果的可视化方法(PCA降维);
  • 掌握最优簇数KKK的选择方法:AIC准则、BIC准则;
  • 对比GMM聚类结果与真实标签,验证模型效果;
  • 掌握GMM的核心超参数调优方法。
  • 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 运行结果说明

  • 数据集基本信息:生成的数据集为4维特征、5000个样本、4个真实簇,符合GMM的混合高斯分布假设,是典型的GMM适用场景;
  • 基础GMM模型:迭代次数约10次左右即可收敛,对数似然值为正且较大,说明模型拟合效果好,聚类结果与真实标签高度吻合,可视化图中簇的分布几乎一致;
  • AIC/BIC曲线:当簇数K=4K=4K=4时,AIC和BIC值均达到最小值,与真实簇数一致,验证了AIC/BIC准则选择最优簇数的有效性;
  • 异常检测:通过GMM的概率密度估计,能有效检测出数据集中的离群点(异常样本),占比约5%,符合预设的分位数阈值;
  • 软聚类结果:predict_proba方法返回每个样本对所有簇的归属概率,可根据业务需求设置概率阈值,实现更灵活的聚类。
  • 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−2ln⁡LAIC = 2k – 2\\ln LAIC=2k2lnLkkk为模型参数数,对复杂模型惩罚较轻,适合大数据集;
    • BIC:BIC=kln⁡N−2ln⁡LBIC = k\\ln N – 2\\ln LBIC=klnN2lnLNNN为样本数,对复杂模型惩罚更重,适合小数据集;
    • 实战中:若样本数N>1000N>1000N>1000,可参考AIC;若N<1000N<1000N<1000,优先参考BIC。

    六、GMM的优缺点

    GMM作为经典的概率聚类算法,兼具聚类和密度估计的双重功能,是软聚类的代表,但其也存在一定的局限性,优缺点总结如下,适配本科/研究生课程考点和工业级选型参考。

    6.1 核心优点

  • 软聚类能力:每个样本以不同概率属于所有簇,聚类结果是概率分布,比K-means的硬聚类更贴合实际数据分布,能捕捉样本的模糊归属关系;
  • 强大的拟合能力:支持每个簇有独立的均值、协方差和权重,能拟合任意形状、大小、密度的簇,远优于K-means仅能拟合球形簇的局限;
  • 双重功能:同时支持聚类和概率密度估计,可一站式解决聚类、异常检测、样本生成等问题,适用场景更广;
  • 概率可解释性:基于严格的概率统计理论,模型结果有明确的概率意义,能解释“样本属于某簇的可能性有多大”,比无监督聚类算法更具解释性;
  • 适用于高维数据:通过协方差矩阵考虑特征之间的相关性,对高维结构化数据的聚类效果优于K-means(K-means仅考虑欧氏距离,未考虑特征相关性);
  • 迭代收敛稳定:EM算法的对数似然函数单调不减,保证模型最终会收敛,且K-means初始化能有效避免局部最优。
  • 6.2 核心缺点

  • 对初始参数敏感:若随机初始化参数,EM算法易收敛到局部最优,需通过K-means初始化或多次运行算法来缓解;
  • 簇数K需预设:与K-means一样,需要提前指定簇数K,无法自动发现簇数,需通过AIC/BIC等准则手动选择,增加了调参成本;
  • 计算复杂度较高:相比K-means,GMM需要计算协方差矩阵、矩阵的逆和行列式,计算量更大,训练速度更慢,不适合超大规模数据集(如千万级样本);
  • 对噪声和异常值敏感:GMM的参数估计是加权平均,异常值会影响均值和协方差的估计,导致聚类结果偏移,需提前做异常值清洗;
  • 依赖高斯分布假设:GMM的核心假设是数据由高斯分布混合而成,若数据不满足该假设(如数据呈均匀分布、指数分布),聚类效果会大幅下降;
  • 高维数据的协方差问题:在超高维数据中,协方差矩阵的参数数量会呈平方级增长,容易出现维度灾难,且矩阵求逆可能不稳定(奇异矩阵)。
  • 七、GMM与主流聚类算法的对比

    为了让大家在实战中精准选择聚类算法,以下从聚类类型、模型假设、拟合能力、计算复杂度等核心维度,对比GMM与K-means、DBSCAN、层次聚类三种主流聚类算法的差异,表格简洁明了,适配本科课程考核和工业级建模选型。

    对比项高斯混合模型(GMM)K-meansDBSCAN层次聚类
    聚类类型 软聚类(概率归属) 硬聚类(唯一归属) 硬聚类(密度归属) 硬聚类(层次归属)
    模型假设 数据由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:中高维结构化数据、数据符合混合高斯分布、需要软聚类结果、同时需要密度估计/异常检测的场景(如金融客户分群、信用评分、图像像素聚类);
  • 优先选K-means:低维数据、簇为球形且大小相似、数据量极大(千万级以上)、追求训练速度的场景(如简单数据分群、聚类基线模型);
  • 优先选DBSCAN:数据簇形状不规则、数据中包含大量噪声/异常值、无需预设簇数的场景(如GPS轨迹聚类、工业故障数据聚类);
  • 优先选层次聚类:小数据集、需要探索数据的层次化结构、无需预设簇数的场景(如生物物种分类、文献主题分群)。
  • 八、GMM的适用场景与实战建议

    GMM的核心优势是软聚类+概率密度估计,且能拟合复杂的簇形状,但其依赖高斯分布假设、对初始参数敏感的局限性也决定了它的适用边界,以下是实战中的选型建议和使用技巧,帮助大家避坑。

    8.1 优先选择GMM的场景

  • 需要软聚类结果的场景:如客户分群(客户可能同时属于多个细分群体,如“高价值年轻客户”和“潜在消费客户”)、精准营销(根据归属概率制定个性化策略);
  • 概率密度估计与异常检测:如金融风控(检测异常交易,密度值过低的交易为风险交易)、工业质检(检测异常产品特征);
  • 混合高斯分布的数据聚类:如人群的身高/体重数据、学生的多科目成绩数据、图像的像素强度数据,这类数据天然符合混合高斯分布;
  • 高维结构化数据聚类:如电商用户行为特征(浏览、收藏、购买等多维度)、金融用户征信特征,GMM能考虑特征之间的相关性,聚类效果优于K-means;
  • 样本生成与数据增强:利用GMM的概率分布,可生成符合原始数据分布的新样本,用于小数据集的模型训练和数据增强。
  • 8.2 考虑其他算法的场景

  • 数据不满足高斯分布:如均匀分布、指数分布、幂律分布的数据,选择DBSCAN或层次聚类,GMM的拟合效果会大幅下降;
  • 超大规模数据集:如千万级以上样本,选择K-means(速度快)或Mini-Batch K-means(批量训练),GMM的计算复杂度过高;
  • 数据含大量噪声/异常值:选择DBSCAN,其能自动检测噪声,无需提前清洗,而GMM对噪声敏感,需额外的预处理步骤;
  • 无需预设簇数:选择DBSCAN或层次聚类,避免通过AIC/BIC手动选择簇数的调参成本;
  • 低维球形簇数据:选择K-means,训练速度更快,实现更简单,能达到与GMM相近的聚类效果。
  • 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)是基于概率统计的软聚类算法,核心假设是数据由K个高斯分布按不同权重混合生成,能同时实现聚类和概率密度估计,是K-means硬聚类的进阶版本;
  • GMM的模型参数包括权重πk\\pi_kπk、均值μk\\mu_kμk、协方差Σk\\Sigma_kΣk,优化目标是最大化数据集的对数似然函数,由于含隐变量,采用EM算法迭代求解,EM算法由**E步(计算后验概率)和M步(更新模型参数)**组成,且对数似然函数单调不减;
  • GMM的核心优势是软聚类能力、拟合任意形状簇、概率可解释性,适用于中高维混合高斯分布数据,同时支持异常检测、样本生成等拓展功能;
  • GMM的核心局限性是对初始参数敏感、需预设簇数K、计算复杂度较高、依赖高斯分布假设,实战中需通过K-means初始化、AIC/BIC选簇数、数据预处理来缓解;
  • GMM与K-means、DBSCAN、层次聚类的核心区别在于聚类类型和模型假设,实战中需根据数据分布、簇形状、数据量和业务需求选择合适的聚类算法;
  • GMM的实战关键是数据标准化+K-means初始化+AIC/BIC选簇数,同时结合定量指标和定性可视化评估模型效果,保证聚类结果的合理性和业务价值。
  • 拓展学习:掌握GMM后,可依次学习隐马尔可夫模型(HMM)(序列数据的概率建模)、变分推断高斯混合模型(VB-GMM)(解决GMM的过拟合问题)、混合分布模型(如泊松混合模型、贝塔混合模型,适用于非高斯分布数据),进一步完善概率统计建模的知识体系。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【分类算法】高斯混合模型(GMM)超详细讲解
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!