【AI深究】高斯混合模型(GMM)全网最详细全流程详解与案例(附Python代码演示) | 混合模型概率密度函数、多元高斯分布概率密度函数、期望最大化(EM)算法 | 实际案例与流程 | 优、缺点分析

【AI深究】高斯混合模型(GMM)全网最详细全流程详解与案例(附Python代码演示) | 混合模型概率密度函数、多元高斯分布概率密度函数、期望最大化(EM)算法 | 实际案例与流程 | 优、缺点分析

大家好,我是爱酱。继前几篇介绍了层次聚类、K均值聚类和密度聚类之后,本篇我们聚焦于另一种强大的聚类算法——高斯混合模型(GMM)。GMM是一种基于概率的软聚类方法,能够为每个样本点计算属于各个簇的概率,适合复杂数据的建模。本文将系统介绍GMM的原理、数学表达、实际案例流程及Python代码实现,加上大量公式给出,方便你直接用于技术文档和学习。

注:本文章含大量数学算式、详细例子说明及代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!


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

 我发现很多人都会弄混乱混合模型概率密度函数、多元高斯分布概率密度函数和期望最大化(EM)算法这三个概念。实际上,高斯混合模型(GMM)其实是指GMM包含三大核心组成部分,不是说有三种完全不同的聚类算法,而是说GMM的数学实现分为三大模块/步骤

  1. 混合模型概率密度函数:这是GMM对整体数据分布的建模方式,用来表达“所有数据点的分布是多个高斯分布的加权和”。
  2. 多元高斯分布概率密度函数:这是GMM中每个簇(高斯分量)本身的概率密度表达式,用来计算每个点在每个簇下的概率。
  3. 期望最大化(EM)算法:这是GMM参数估计的优化算法,分为E步和M步,反复迭代求解参数(均值、协方差、权重)。

它们不是三种互相独立的聚类方法,而是GMM的三个核心“环节”或“步骤”。

GMM聚类的简化实际流程

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

所以,实际案例流程只能是“GMM聚类的整体流程”,而不是分别独立跑三种聚类方法。


一、混合模型概率密度函数(Mixture Model Probability Density Function)

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$

的概率密度就是两个高斯分布的加权和。


二、多元高斯分布概率密度函数(Multivariate Gaussian Probability Density Function/ Multivariate Gaussian PDF)

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

\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)$

$\mu=(\mu_1, \mu_2)$

$\Sigma$

$2\times 2$

协方差矩阵,上式可直接代入计算。


三、期望最大化(EM)算法(Expectation-Maximization Algorithm)

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步,直到参数收敛


四、完整案例流程

数据

$x$$y$
A12
B21
C14
D102
E123
F114

步骤

  1. 重复E步和M步
    迭代直到参数收敛。

最终结果
每个点属于每个簇的概率

$\gamma_{ik}$

,可以用最大概率分配标签,也可以用概率做软聚类。

M步

$\gamma_{ik}$

加权更新每个簇的均值、协方差和权重。

E步
对每个点,分别计算其在两个高斯分布下的概率密度

$\mathcal{N}(x|\mu_k,\Sigma_k)$

,再按上式求

$\gamma_{ik}$

初始化

$K=2$

,初始均值

$\mu_1=(1,2)$

(A),

$\mu_2=(10,2)$

(D),协方差为单位阵,

$\pi_1=\pi_2=0.5$


五、Python代码实现

注:记得要先 pip install scikit-learn Library喔~

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] # Eigen decomposition for ellipse axes v, w = np.linalg.eigh(covar) order = v.argsort()[::-1] v = v[order] w = w[:, order] # Angle of ellipse angle = np.degrees(np.arctan2(w[1, 0], w[0, 0])) # Width and height: std_multiplier standard deviations 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) # 调用绘图函数,std_multiplier=4确保几乎所有点都被椭圆覆盖 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)确定簇数,并关注初始化和参数调优。希望本篇内容能帮助你深入理解GMM的数学原理与实操流程。


谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力

如需进一步案例、代码实现或与其他聚类算法对比,欢迎留言交流!我是爱酱,我们下次再见,谢谢收看!

Read more

OpenClaw接入模型并基于WebUI完成智能操作

OpenClaw接入自定义模型并基于WebUI完成智能操作 背景介绍 OpenClaw(原 Clawdbot)是一个开源的 AI 代理框架,支持通过配置文件或 GUI 界面进行灵活配置。安装 OpenClaw 后,用户可以通过修改工作目录下的配置文件 openclaw.json 来接入不同的 LLM 模型提供商。 OpenClaw 支持众多主流模型提供商,包括 OpenAI、Anthropic、Moonshot AI(Kimi)、OpenRouter、Vercel AI Gateway、Amazon Bedrock 等。完整的提供商目录可参考官方文档 模型提供商快速入门。 要使用自定义的提供商,需要通过 models.providers 配置进行设置。这种方式允许用户接入官方支持列表之外的其他兼容 OpenAI API 或 Anthropic 格式的模型服务。 接入配置说明 核心配置参数解析

By Ne0inhk
openclaw新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问

openclaw新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问

目录 * 1. 基础设施层:OpenClaw 运行环境的初始化 * 2. 算力与模型层:蓝耘 MaaS 平台的接入配置 * 2.1 协议适配与 JSON 配置 * 3. 编排层:OpenClaw 初始化与 Onboarding 流程 * 3.1 模式选择与基础设置 * 3.2 模型提供商与应用集成策略 * 3.3 技能库(Skills)装载与服务启动 * 4. 网络架构与网关(Gateway)配置 * 4.1 网关暴露与安全策略 * 4.2 Web UI 远程访问与设备配对(Device Pairing) * 5. 高级模型编排与 JSON 配置深度解析

By Ne0inhk
一文彻底搞清楚数据结构之栈与队列:从定义到实战解析

一文彻底搞清楚数据结构之栈与队列:从定义到实战解析

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法初阶》 ✨逆境不吐心中苦,顺境不忘来时路!🎬 博主简介: 前言:前面我通过介绍了一些链表的算法题的解题思路和双向链表的相关知识,相信你一定有所感悟和体会!至此关于链表的内容小编就告一段落了,接下来我要介绍一种特殊的线性表—>栈和队列.它们又有什么作用和用途呢?废话不多说,下面跟着小编的节奏🎵一起学习吧! 目录 * 1.栈的定义 * 2.栈的结构 * 3.多栈共享空间 * 4.栈的实现 * 5.队列的定义 * 6.队列的结构 * 7.队列的实现 * 8.栈和队列的算法题 * 9.循环队列的定义 * 10.循环队列的算法题 1.栈的定义 栈是一种只允许在表的一端进行插入和删除的线性表.通常将表中允许进行插入、删除操作的一端称为栈顶,另一端称为栈底.栈的插入操作称为进栈或入栈,删除操作为出栈或退栈.当栈中没有元素时称为空栈.由于插入和删除操作都是在栈顶中进行,

By Ne0inhk
LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串

LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串

目录 1. 长度最小的子数组 1.1 题目解析 1.2 解法 1.3 代码实现 2. 无重复字符的最长子串 2.1 题目解析 2.2 解法 2.3 代码实现 1. 长度最小的子数组 209. 长度最小的子数组 - 力扣(LeetCode) 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入:

By Ne0inhk