跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

高斯混合模型(GMM)原理、流程与 Python 实现详解

高斯混合模型(GMM)是一种基于概率的软聚类方法,通过混合模型概率密度函数建模数据分布,利用多元高斯分布计算簇内概率,并借助期望最大化(EM)算法迭代优化参数。文章涵盖 GMM 三大核心组成部分、数学推导、完整案例流程及 Python 代码实现,同时分析了模型优缺点及使用 BIC/AIC 指标选择簇数的方法。

并发大师发布于 2026/3/23更新于 2026/9/363 浏览
高斯混合模型(GMM)原理、流程与 Python 实现详解

高斯混合模型(GMM)三大核心内容

高斯混合模型(GMM)包含三大核心组成部分,并非三种独立的聚类算法,而是 GMM 数学实现的三个模块:

  1. 混合模型概率密度函数:描述整体数据分布,表达为多个高斯分布的加权和。
  2. 多元高斯分布概率密度函数:计算每个点在每个簇下的概率。
  3. 期望最大化(EM)算法:用于参数估计的优化算法,分为 E 步和 M 步。

GMM 聚类的简化实际流程:

  • 用混合模型概率密度函数描述整体分布
  • 用多元高斯分布概率密度函数计算每个点的概率
  • 用 EM 算法迭代优化参数
  • 最终得到聚类结果

一、混合模型概率密度函数

GMM 假设数据分布为多个高斯分布的加权和:

$$p(x) = \sum_{k=1}^{K} \pi_k \mathcal{N}(x | \mu_k, \Sigma_k)$$

其中 $\mathcal{N}(x | \mu_k, \Sigma_k)$ 是第 $k$ 个高斯分布的概率密度,$\pi_k$ 是第 $k$ 个分量的权重(满足 $\sum_{k=1}^K \pi_k = 1$),$K$ 为簇数。

案例解释 假设有 2 个簇($K=2$),每个簇的均值、协方差和权重分别为 $\mu_2 = (10,2)$, $\Sigma_2 = [1,1]$, $\pi_2=0.5$ 以及 $\mu_1 = (1,2)$, $\Sigma_1 = [1,1]$, $\pi_1=0.5$,则任意点 $x$ 的概率密度就是两个高斯分布的加权和。

二、多元高斯分布概率密度函数

单个高斯分布的概率密度为:

$$\mathcal{N}(x | \mu, \Sigma) = \frac{1}{(2\pi)^{D/2} |\Sigma|^{1/2}} \exp\left(-\frac{1}{2}(x - \mu)^\top \Sigma^{-1} (x - \mu)\right)$$

其中 $|\Sigma|$ 为协方差矩阵的行列式,$D$ 为数据维度。

案例解释 对于二维点 $x=(x_1, x_2)$,可直接代入公式计算。

三、期望最大化(EM)算法

GMM 的参数用 EM 算法迭代估计:

1. 初始化

随机设定 $\mu_k$、$\Sigma_k$、$\pi_k$。

2. E 步(Expectation)

计算每个点属于每个簇的后验概率(责任度):

$$\gamma_{ik} = \frac{\pi_k \mathcal{N}(x_i | \mu_k, \Sigma_k)}{\sum_{j=1}^K \pi_j \mathcal{N}(x_i | \mu_j, \Sigma_j)}$$

其中 $\gamma_{ik}$ 表示第 $i$ 个样本属于第 $k$ 个簇的概率。

3. M 步(Maximization)

根据 $\gamma_{ik}$ 更新参数:

$$N_k = \sum_{i=1}^N \gamma_{ik}$$ $$\mu_k = \frac{1}{N_k} \sum_{i=1}^N \gamma_{ik} x_i$$ $$\Sigma_k = \frac{1}{N_k} \sum_{i=1}^N \gamma_{ik} (x_i - \mu_k)(x_i - \mu_k)^\top$$ $$\pi_k = \frac{N_k}{N}$$

4. 重复 E 步和 M 步,直到参数收敛

四、完整案例流程

数据
点xy
A12
B21
C14
D102
E123
F114
步骤
  1. 初始化:设 $K=2$,初始均值 $\mu_1=(1,2)$(A),$\mu_2=(10,2)$(D),协方差为单位阵,$\pi_1=\pi_2=0.5$。
  2. E 步:对每个点,分别计算其在两个高斯分布下的概率密度,再按公式求 $\gamma_{ik}$。
  3. M 步:用 $\gamma_{ik}$ 加权更新每个簇的均值、协方差和权重。
  4. 迭代:重复 E 步和 M 步,直到参数收敛。

最终结果:每个点属于每个簇的概率 $\gamma_{ik}$,可用最大概率分配标签,也可用概率做软聚类。

五、Python 代码实现

需先安装依赖库:pip install scikit-learn

import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from matplotlib.patches import Ellipse

def plot_gmm_clusters(X, gmm, std_multiplier=4):
    labels = gmm.predict(X)
    plt.figure(figsize=(8,6))
    plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=100, label='Data points')
    plt.scatter(gmm.means_[:, 0], gmm.means_[:, 1], c='red', marker='x', s=200, label='Cluster centers')
    ax = plt.gca()
    for i in range(gmm.n_components):
        mean = gmm.means_[i]
        covar = gmm.covariances_[i]
        v, w = np.linalg.eigh(covar)
        order = v.argsort()[::-1]
        v = v[order]
        w = w[:, order]
        angle = np.degrees(np.arctan2(w[1, 0], w[0, 0]))
        width, height = std_multiplier * np.sqrt(v)
        ell = Ellipse(mean, width, height, angle=angle, edgecolor='red', facecolor='none', linestyle='--', linewidth=2)
        ax.add_patch(ell)
    plt.title(f'Gaussian Mixture Model Clustering with {std_multiplier} Std Ellipses')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.legend()
    plt.grid(True)
    plt.show()

# 示例数据
X = np.array([[1,2],[2,1],[1,4],[10,2],[12,3],[11,4]])

# 建立 GMM 模型,设定簇数为 2
gmm = GaussianMixture(n_components=2, covariance_type='full', random_state=0)
gmm.fit(X)

# 调用绘图函数
plot_gmm_clusters(X, gmm, std_multiplier=4)

# 输出每个点属于各簇的概率
probs = gmm.predict_proba(X)
for i, p in enumerate(probs):
    print(f"Point {i} probabilities: {p}")

六、模型选择指标(BIC、AIC)确定簇数

在实际应用中,GMM 需要用户指定簇数(n_components),但真实数据的最佳簇数往往未知。为此,统计学上常用 AIC(Akaike Information Criterion)和 BIC(Bayesian Information Criterion)来辅助选择最优模型。

1. AIC(Akaike 信息准则)

$$\mathrm{AIC} = 2k - 2\log(L)$$

其中 $k$ 是模型参数数量,$L$ 是最大似然估计下的似然值。AIC 越小,模型越优。

2. BIC(贝叶斯信息准则)

$$\mathrm{BIC} = k \log(n) - 2\log(L)$$

其中 $n$ 是样本数。BIC 同样越小越好,但对模型复杂度惩罚更强。

3. 实际用法
  • 训练不同簇数的 GMM 模型,分别计算 AIC 和 BIC。
  • 选择 AIC/BIC 最小的模型作为最优簇数。

七、GMM 的优缺点

优点
  • 软聚类,给出每个点属于各簇的概率
  • 能拟合复杂的椭球形簇,适合多样分布
  • 适合高维数据,参数灵活
缺点
  • 对初始参数敏感,可能陷入局部最优
  • 计算复杂度较高,尤其是协方差矩阵估计
  • 需预先指定簇数

八、总结

高斯混合模型是一种强大的概率聚类方法,适合复杂数据的软分配和多样簇形建模。通过 EM 算法迭代估计参数,GMM 能为每个样本点提供属于各簇的概率,提升聚类的灵活性和解释力。实际应用中,需结合模型选择指标(如 BIC、AIC)确定簇数,并关注初始化和参数调优。

目录

  1. 高斯混合模型(GMM)三大核心内容
  2. 一、混合模型概率密度函数
  3. 二、多元高斯分布概率密度函数
  4. 三、期望最大化(EM)算法
  5. 1. 初始化
  6. 2. E 步(Expectation)
  7. 3. M 步(Maximization)
  8. 4. 重复 E 步和 M 步,直到参数收敛
  9. 四、完整案例流程
  10. 数据
  11. 步骤
  12. 五、Python 代码实现
  13. 示例数据
  14. 建立 GMM 模型,设定簇数为 2
  15. 调用绘图函数
  16. 输出每个点属于各簇的概率
  17. 六、模型选择指标(BIC、AIC)确定簇数
  18. 1. AIC(Akaike 信息准则)
  19. 2. BIC(贝叶斯信息准则)
  20. 3. 实际用法
  21. 七、GMM 的优缺点
  22. 优点
  23. 缺点
  24. 八、总结

更多推荐文章

查看全部
  • Linux 线程池设计与实现
  • AI 绘画人脸一致性 IP-Adapter-FaceID 快速上手教程
  • DCU BW1000 环境下 llama.cpp 推理 Qwen3-Coder 模型问题排查
  • 苍穹外卖里的定时任务与实时消息推送实践
  • VSCode 插件 Git Graph 可视化 Git 提交记录教程
  • Seedance 2.0 与飞书机器人集成:OAuth2.1 鉴权与消息卡片调试指南
  • Linux GCC/G++编译器:从源码到可执行文件全流程解析
  • Linux 系统学习:深入剖析 Git 原理与进阶使用
  • Copilot Pro 使用指南及模型额度解析
  • AI 中转 API 的原理与风险
  • AgentScope Java 多智能体框架
  • Python 常用编程代码示例与详解
  • 支持二次开发管理端的标准化 Skill Agent 框架选型
  • MultiResUNet 论文笔记:重新思考 U-Net 架构用于多模态生物医学图像分割
  • 青龙面板 Docker 部署与内网穿透远程管理方案
  • 深入理解 Linux 环境变量
  • 使用 C++ 结合 JSON 与 HTTP 协议实现 Web 计算器服务器
  • 利用 DeepSeek API 构建贪吃蛇游戏的技术实践
  • C++ 手搓 JSON+HTTP Web 服务器实战指南
  • 滑动窗口四题的共通解法

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online