聚类算法之高斯混合模型聚类 (Gaussian Mixture Model, GMM)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

高斯混合模型(GMM)是统计模型中的一颗璀璨之星,它为数据提供了一种复杂而又强大的表示方法。在机器学习的许多领域,从模式识别到图像处理,GMM都被广泛地采用和研究。它背后的核心思想是使用多个高斯分布的组合来拟合数据,这种方法的优越性在于其对数据的弹性拟合能力和生成性质。

Fig2 (1)

1. 算法解读

GMM 是一种使用高斯分布混合体来表示数据集的方法。简单来说,每一个聚类都可以用一个高斯分布来描述,而数据集则可以被认为是这些高斯分布的混合。GMM的目标是:找出最能代表数据的高斯分布的参数(均值、协方差和混合系数)。

EM(期望最大化)算法通常用于优化GMM的参数。EM算法迭代地执行以下两个步骤:

期望步骤 (E-step):给定当前的模型参数,计算数据点属于每个聚类的概率。

最大化步骤 (M-step):更新模型参数以最大化观测数据的似然。

具体的数学基础知识请详见数学专栏。

2. 步骤和细节

初始化阶段:

选择高斯混合模型(GMM)中的高斯分布数量。

初始化每个高斯分布的参数,包括均值、协方差和混合系数。

E-step (期望步骤):

对每个数据点,根据当前参数估计,计算其属于各个高斯分布的后验概率。

M-step (最大化步骤):

更新均值: 根据后验概率,重新计算每个高斯分布的均值。

更新协方差: 根据后验概率,重新计算每个高斯分布的协方差。

更新混合系数: 重新估计每个高斯分布的混合系数。

收敛性检查:

判断算法是否已经收敛,这通常基于数据的对数似然或者模型参数的变化。

迭代:

如果模型尚未收敛,则回到E-step,继续迭代过程。

3. 举例

想象你在一个果园,这个果园里有苹果、梨和桃子三种水果。每种水果的大小和重量都有一定的特点。GMM就像是我们用来描述这些水果特点的工具。在这个模型中,我们用三个“高斯分布”(简单来说,就是一种特殊的图形或曲线)来分别描述苹果、梨和桃子的大小和重量。

每个高斯分布都可以被看作是一条“曲线”,这条曲线的形状由三个参数决定:均值(中心位置)、协方差(宽度或形状)和混合系数(高度)。GMM的目标就是调整这些曲线,让它们尽可能准确地描述每种水果的特点。

EM(期望最大化)算法

EM算法就像是我们调整这些曲线的方法。它分为两个步骤:E-step(期望步骤)和M-step(最大化步骤)。

E-step(期望步骤):

在这一步,我们看每个水果(数据点),根据当前的曲线,估计这个水果是苹果、梨还是桃子的概率。

M-step(最大化步骤):

接着,我们根据上一步得到的概率,调整我们的曲线,让它们更好地符合实际的水果分布。

我们不断重复这两个步骤,直到曲线基本不再改变,也就是找到了最适合描述水果特点的曲线。

步骤和细节:

初始化阶段: 我们首先要确定有几种水果(几个高斯分布)。然后,随便画几个曲线作为开始(初始化参数)。

E-step: 对每个水果,估计它属于苹果、梨和桃子的概率。在E-step中,我们计算了每个数据点属于每个高斯分布的概率,这个概率可以看作是该数据点对该高斯分布均值更新的权重。权重越高,说明这个数据点更有可能由这个高斯分布生成,因此应该对这个高斯分布的均值有更大的影响。这里的“权重”就像是我们对每个水果是来自苹果树、梨树还是桃树的“信心”或“猜测”。例如,我们看到一个红色的圆形水果,我们可能会猜测这有70%的可能是苹果,10%的可能是桃子,20%的可能是梨。

M-step: 根据刚刚估计的概率,调整我们的曲线。具体来说,我们会这样调整:

更新均值:根据每个数据点属于该高斯分布的概率权重,计算所有数据点的加权平均值,作为新的均值。

更新协方差:同样根据每个数据点属于该高斯分布的概率权重,计算数据点与新均值之间差异的加权平均值,作为新的协方差。

更新混合系数:计算所有数据点属于该高斯分布的概率的平均值,作为新的混合系数。

继续刚才的例子,如果我们看一个水果,觉得它有70%的可能性是苹果,20%的可能性是梨,10%的可能性是桃子。那么,当我们计算苹果的平均大小和重量时(属于苹果的高斯分布),当前这个水果就会以70%的“力量”(权重)参与其中;计算梨的高斯分布时,它会以20%的“力量”参与;计算桃子的高斯分布时,它会以10%的“力量”参与。

在M-step中,我们根据这些权重来更新高斯分布的参数。具体来说,每个数据点对高斯分布参数的贡献是按照它的权重来的,这就是为什么我们计算所有数据点的加权平均值作为新的参数。这样做的目的是最大化整个数据集的似然,也就是使得我们的模型更有可能生成观测到的数据。

这个加权平均值实际上是在求解一个优化问题:找到均值参数,使得模型对观测数据的似然最大。这个过程可以通过数学推导得到,但直观上理解,就是让每个数据点根据其属于该高斯分布的概率来共同决定这个高斯分布的均值。

收敛性检查: 查看曲线是否还在改变。如果基本不再改变,我们就找到了最好的曲线;如果还在变,就继续调整。

迭代:如果曲线还在变,我们就重复E-step和M-step,直到找到最适合的曲线。

代码实现:

为了模拟这个例子,我们可以生成一些来自不同高斯分布的数据点,这些分布代表了不同种类的水果的大小和重量。然后,我们将使用高斯混合模型(GMM)来拟合这些数据点,估计原始的高斯分布参数。

我们可以使用Python的sklearn库中的GaussianMixture类来实现GMM。下面是相关代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture# 设置随机种子以保证结果的可重复性
np.random.seed(0)# 创建三种水果的数据点(大小和重量)
# 每种水果由一个高斯分布代表
apples = np.random.multivariate_normal(mean=[5, 5], cov=[[1, 0], [0, 1]], size=100)
pears = np.random.multivariate_normal(mean=[10, 10], cov=[[2, 0], [0, 2]], size=100)
peaches = np.random.multivariate_normal(mean=[15, 5], cov=[[1.5, 0], [0, 1.5]], size=100)# 将所有水果数据合并成一个数据集
fruits = np.vstack([apples, pears, peaches])# 可视化原始数据点
plt.scatter(apples[:, 0], apples[:, 1], label='Apples')
plt.scatter(pears[:, 0], pears[:, 1], label='Pears')
plt.scatter(peaches[:, 0], peaches[:, 1], label='Peaches')
plt.xlabel('Size')
plt.ylabel('Weight')
plt.title('Original Fruits Data')
plt.legend()
plt.show()
# 使用GMM拟合数据
gmm = GaussianMixture(n_components=3, random_state=0)
gmm.fit(fruits)# 提取GMM模型参数
means = gmm.means_
covariances = gmm.covariances_# 输出GMM模型参数
print("Means:", means)
print("Covariances:", covariances)

代码的结果如下:

pp

4. 算法评价

优点:

软聚类: GMM属于软聚类方法,它为每个数据点分配属于每个类的概率,而不是硬分配到某一类。这使得GMM能够表达不确定性,适用于模糊边界的情况。

聚类形状的灵活性: 由于使用了协方差矩阵,GMM可以形成各种形状的聚类,包括椭圆形、圆形和拉伸形状,而不仅仅是球形聚类。

参数估计: GMM不仅可以进行聚类,还可以估计数据的生成模型参数(均值、协方差和混合系数),这在某些应用中是有价值的。

缺点:

计算复杂性: GMM的训练过程涉及到期望最大化(EM)算法,这通常需要更多的计算资源和时间,特别是当数据集很大时。

初始化敏感性: GMM的结果可能受到初始化的影响,不同的初始化可能导致不同的聚类结果。

选择组件数量: 在应用GMM之前,需要预先确定混合组件的数量(高斯分布的数量),这通常需要领域知识或通过交叉验证等方法来确定。

可能的奇异性问题: GMM可能遇到协方差矩阵接近奇异矩阵的问题,这会导致算法的不稳定。

对异常值敏感: 由于GMM基于概率密度,它对异常值或噪声点可能较为敏感。

5. 算法的变体

带有协方差约束的GMM:为了避免过度拟合或简化模型,可以对GMM中的协方差矩阵施加约束。常见的约束包括:

球形协方差:所有的聚类都有相同的方差,并且协方差矩阵是对角的。

对角协方差:协方差矩阵是对角的,但各个聚类的方差可能不同。

完全协方差:没有对协方差矩阵施加任何约束,允许聚类呈现任意椭圆形状。

GMM是一种极其强大的聚类方法,尤其适用于数据中存在多个潜在子群体的情况。通过为每个数据点提供属于每个聚类的概率信息,它提供了对数据的更丰富的解释。由于其参数化和生成性质,它还被广泛用于异常检测、图像分割和声学模型等领域。 尽管GMM在多个领域中都有卓越的应用,但其计算复杂性和需要预先指定高斯分布数量的要求有时可能会限制其实用性。为此,研究者已经提出了多种变体和优化方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并查集|1971. 寻找图中是否存在路径、684.冗余连接、685.冗余连接II

目录 并查集基础 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II 并查集基础 并查集主要有三个功能。 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数&#xf…

【深度学习】一文搞懂 如何计算图像数据集的RGB均值和方差(超详细的哦~)

计算图像数据集的RGB均值和方差 1、引言2、RGB均值和方差2.1 计算RGB均值和方差原因2.2 计算RGB均值和方差步骤2.3 代码实现2.3.1 TensorFlow计算RGB均值和方差2.3.2 PyTorch计算RGB均值和方差 3、总结 1、引言 小屌丝:鱼哥,帮个忙呀 小鱼:在…

了解Spring:Java开发的利器

Spring是一款开源的轻量级Java开发框架,旨在提高开发人员的效率和系统的可维护性。本文将介绍Spring的基本概念、使用优势、设计模式以及与Spring MVC和Spring Boot的关联。 什么是Spring? Spring是一款开源的轻量级Java开发框架,它由多个模…

STM32之HAL开发——HAL库框架介绍

HAL库外设设计思想 HAL库借鉴面向对象的设计思想,将外设驱动封装为对象。 HAL库使用主线 HAL使用的主要用在俩个地方,无外乎外设初始化以及外设的使用。想用好这两个功能,我们首先得对外设的封装有一定的了解。 句柄结构体 xx_HandleTypeDef…

【吾爱破解】Android初级题(二)的解题思路 _

拿到apk,我们模拟器打开看一下 好好,抽卡模拟器是吧😀 jadx反编译看一下源码 找到生成flag的地方,大概逻辑就是 java signatureArr getPackageManager().getPackageInfo(getPackageName(), 64).signaturesfor (int i 0; i &l…

批量高效剪辑视频,轻松调整视频时长,轻松打造完美节奏

在数字化时代,视频内容已成为我们生活中不可或缺的一部分。无论是社交媒体上的短视频,还是专业影视制作中的长片,视频剪辑都扮演着至关重要的角色。然而,面对大量视频素材,如何高效地进行剪辑调整,让每一帧…

Express:快速搭建Node.js应用的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

华为OD机试 - 打印任务排序 - 队列(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题&a…

0基础 三个月掌握C语言(14)-上

自定义类型 其实C语言有内置类型 也有自定义的类型 内置类型(C语言本身支持的现成的类型) 如:char short int long float double.... 但仅仅有这些类型是不够的 比如说 我们想表示一个人(复杂对象) 对于人的描述那…

我们是如何测试人工智能的(八)包含大模型的企业级智能客服系统拆解与测试方法 -- 大模型 RAG

大模型的缺陷 -- 幻觉 接触过 GPT 这样的大模型产品的同学应该都知道大模型的强大之处, 很多人都应该调戏过 GPT,跟 GPT 聊很多的天。 作为一个面向大众的对话机器人,GPT 明显是鹤立鸡群,在世界范围内还没有看到有能跟 GPT 扳手腕…

开启Safari手势支持

在使用Safari 的时候,大家有没有觉得不支持手势使用起来不是很方便, 触摸板只支持少量简单的手势,如缩放,滚动等。如果使用鼠标的用户,则完全无法使用手势。经过折腾研究,使用CirMenu应用可以完美解决这个要…

C++第十一弹---类与对象(八)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、友元 1.1、友元函数 1.2、友元类 2、内部类 3、匿名对象 4、拷贝对象时的一些编译器优化 总结 1、友元 友元提供了一种突破封装的方式&a…

深度解析:Elasticsearch写入请求处理流程

版本 Elasticsearch 8.x 原文链接:https://mp.weixin.qq.com/s/hZ_ZOLFUoRuWyqp47hqCgQ 今天来看下 Elasticsearch 中的写入流程。 不想看过程可以直接跳转文章末尾查看总结部分。最后附上个人理解的一个图。 从我们发出写入请求,到 Elasticsearch 接收请…

单目深度估计基础理论和论文学习总结

单目深度估计基础理论和论文学习总结 一、背景知识: 三维刚体运动的数学表示:旋转平移矩阵、旋转向量、欧拉角、四元数、轴角模型、齐次坐标、各种变换等 照相机模型:单目/双目模型,单目中的世界坐标系/相机坐标系/图像坐标系的…

从零开始的 dbt 入门教程 (dbt cloud 自动化篇)

一、引 在前面的几篇文章中,我们从 dbt core 聊到了 dbt 项目工程化,我相信前几篇文章足够各位数据开发师从零快速入门 dbt 开发,那么到现在我们更迫切需要解决的是如何让数据更新做到定时化,毕竟作为开发我们肯定没有经历每天定…

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题,ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

GA遗传算法和ALNS算法的区别(我的APS项目七)

博主用最简单的方式告诉你遗传算法是什么,估计这是网上最简单的遗传算法入门教程了。首先我们先带入一个问题,我们要去9大城市旅游,想知道每个城市走一遍,总路程最短的出行顺序是什么? OK,题目我们已经明确…

Chrome 插件打包发布

插件打包发布 一、打包成 zip 包 最简单方便的一种其实就是打包成 zip 包,通过下载链接进行下载,在包里面通过设置版本号和数据库的版本号对比来提醒用户进行新包的下载。 二、发布到 Chrome 应用商店 1. 注册成为开发者 在发布到 chrome 应用商店之…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一,在第七节中讲解了如何简洁的进行web程序部署和运行,这只是它的功能之一。在本节中,我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

吴恩达深度学习笔记:神经网络的编程基础2.15-2.17

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第二周:神经网络的编程基础 (Basics of Neural Network programming)2.15 Python 中的广播(Broadcasting in Python)2.16 关于 python _ numpy 向量的说明&…