【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

Whisper.cpp高效部署实战指南:从环境搭建到语音识别全流程

Whisper.cpp高效部署实战指南:从环境搭建到语音识别全流程 【免费下载链接】whisper.cppOpenAI 的 Whisper 模型在 C/C++ 中的移植版本。 项目地址: https://gitcode.com/GitHub_Trending/wh/whisper.cpp Whisper.cpp是OpenAI Whisper模型的C/C++移植版本,专注于提供高性能自动语音识别(ASR)能力,支持跨平台部署与硬件加速,实现轻量级语音转文本功能。本文将通过零基础环境搭建、极速部署流程、实战案例演示及工具集解析,帮助开发者零门槛掌握这一高效语音识别工具。 核心功能解析 Whisper.cpp作为开源语音识别解决方案,核心优势体现在以下方面: * 跨平台兼容性:支持Linux、macOS、Windows等多操作系统,兼容x86、ARM等架构 * 硬件加速优化:针对Apple Silicon、AVX指令集、Vulkan等提供专门优化

llama.cpp是什么?

lama.cpp 是一个基于 C/C++ 的高性能推理框架,专门用于在本地设备上高效运行 Meta(原 Facebook)开源的 LLaMA 系列大语言模型(如 LLaMA-1/2、Alpaca 等)。它通过优化计算和内存管理,使得即使在没有高端 GPU 的普通电脑(甚至树莓派、手机等嵌入式设备)上也能运行大模型。 核心特点 1. 轻量与高效: * 纯 C/C++ 实现,无第三方依赖,对 CPU 架构(如 x86、ARM)优化。 * 支持 4-bit 量化(如 GGUF 格式),显著降低模型体积和内存占用(例如 7B 模型可压缩到

知网AIGC检测原理是什么?如何针对性降低AI疑似度

知网AIGC检测原理是什么?如何针对性降低AI疑似度

知网AIGC检测系统是怎么工作的? 很多同学对知网的AIGC检测系统感到神秘,不知道它到底是怎么判断文本是不是AI生成的。其实理解了检测原理,降低AI疑似度就有了明确的方向。 知网AIGC检测系统主要分析文本的统计学特征,而不是去识别你用了什么工具。它会从多个维度评估文本:词汇分布的规律性、句式结构的重复程度、段落组织的模式化程度、以及整体文本的「困惑度」。 所谓困惑度,是指文本的可预测性。AI生成的文本往往可预测性很高,因为AI会选择最可能的下一个词。而人类写作的可预测性相对较低,因为我们会有跳跃性思维和个人偏好。 知网检测和其他平台有什么不同? 不同检测平台的算法和标准是不一样的,同一篇文章在不同平台的检测结果可能差异很大。 知网的检测相对严格,算法更新也比较快。它针对中文学术论文做了专门的优化,对学术写作的模式识别更精准。很多在其他平台显示30%的文章,在知网可能显示50%甚至更高。 如果你的学校用知网检测,一定要以知网的结果为准。不要在其他平台测了觉得没问题就放心了,最后提交时用知网一查可能会有惊喜。 知网重点检测哪些内容? 根据实际测试经验,知网AIGC

Youtu-VL-4B-Instruct基础教程:llama.cpp backend日志分析定位推理瓶颈

Youtu-VL-4B-Instruct基础教程:llama.cpp backend日志分析定位推理瓶颈 1. 引言 当你兴致勃勃地部署好Youtu-VL-4B-Instruct,准备体验这个轻量级多模态模型的强大能力时,有没有遇到过这样的情况:上传一张图片,问个简单问题,结果等了半天才出结果,甚至直接超时了? 这可能是很多开发者第一次使用这个模型时会遇到的困惑。明明硬件配置不低,模型也只有4B参数,为什么推理速度这么慢?问题到底出在哪里? 今天,我就带你深入Youtu-VL-4B-Instruct的推理引擎内部,通过分析llama.cpp backend的日志,一步步定位推理瓶颈。这不是一篇枯燥的技术文档,而是一个实战指南,我会用最直白的方式告诉你: * 怎么看懂那些复杂的日志信息 * 怎么判断是CPU、GPU还是内存的问题 * 怎么找到拖慢速度的“罪魁祸首” * 怎么根据日志信息调整配置,让推理速度飞起来 无论你是刚接触这个模型的新手,还是已经部署但遇到性能问题的开发者,这篇文章都能给你实实在在的帮助。我们直接进入正题。 2. 理解Youtu-VL-4B-