聚类算法之高斯混合模型聚类 (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在多个领域中都有卓越的应用,但其计算复杂性和需要预先指定高斯分布数量的要求有时可能会限制其实用性。为此,研究者已经提出了多种变体和优化方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据基础:Linux基础详解

课程介绍 本课程主要通过对linux基础课程的详细讲解,让大家熟练虚拟机的安装使用,Linux系统的安装配置,学习掌握linux系统常用命令的使用,常用的软件安装方法,制作快照,克隆,完成免密登录&…

linux系统--------------mysql数据库管理

目录 一、SQL语句 1.1SQL语言分类 1.2查看数据库信息 1.3登录到你想登录的库 1.4查看数据库中的表信息 1.5显示数据表的结构(字段) 1.5.1数据表的结构 1.5.2常用的数据类型: 二、关系型数据库的四种语言 2.1DDL:数据定义语言&am…

跨域与Spring Boot中CORS的应用

摘要:前后端独立开发期间,交互主要通过接口文档,前端Mock数据,后端使用Postman都不会发现跨域问题。当联调时前端尝试调用后端接口,这往往就需要需要处理的跨域问题…… 下面总结下跨域问题产生的前因后果以及如何通过…

day03_mysql_课后练习 - 参考答案

文章目录 day03_mysql_课后练习mysql练习题第1题第2题第3题第4题第5题 day03_mysql_课后练习 mysql练习题 第1题 案例: 1、创建一个数据库:day03_test01_school 2、创建如下表格 表1 Department表的定义 字段名字段描述数据类型主键外键非空唯一D…

Java学习笔记 | JavaSE基础语法 | 04 | 数组

文章目录 0.前言1.数组2.数组声明2.1 数组定义2.2 数组初始化1.静态初始化2.动态初始化3.区别4.数组的默认初始化值: 2.3 数组名 3.访问数组3.1 索引3.2 访问数组3.3 length属性 4.数组常见问题5.数组内存分析5.1 内存分配5.2 数组内存分配 6.数组的练习练习1&#…

用Springboot(java程序)访问Salesforce RestAPI

本文讲一下,如何从0构建一个Springboot的应用程序,并且和Salesforce系统集成,取得Salesforce里面的数据。 一、先在Salesforce上构建一个ConnectApp。 有了这个,SF才允许你和它集成。手顺如下: 保存后,…

华为ensp中vrrp虚拟路由器冗余协议 原理及配置命令

CSDN 成就一亿技术人! 作者主页:点击! ENSP专栏:点击! CSDN 成就一亿技术人! ————前言————— VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议&#xff0…

使用 CSS 预处理器的优缺点

使用CSS预处理器在前端开发中已经成为一种流行的趋势,它们提供了一种更灵活、更高效的方式来编写和管理样式表。然而,就像任何工具一样,CSS预处理器也有其优点和缺点。本文将深入探讨使用CSS预处理器的优缺点,并讨论如何在项目中明…

Luminar Neo:让每一张照片都散发独特魅力 mac/win版

Luminar Neo是一款引领摄影艺术新纪元的智能影像处理软件。它融合了先进的算法和人工智能技术,为摄影师提供了前所未有的创作自由度和影像处理能力。 Luminar Neo软件获取 作为一款强大的后期处理工具,Luminar Neo不仅具备丰富的调整选项和滤镜效果&…

MES管理系统生产调度模块的工作原理是什么

在现代制造业中,MES管理系统发挥着举足轻重的作用,其中的生产调度模块更是整个生产流程的核心。它集成了自动排产和手动排产的功能,能够精确安排每个工单在各个工序的具体生产线体、计划开始时间和计划结束时间,从而确保生产的高效…

一分钟学习Markdown语法

title: 一分钟学习Markdown语法 date: 2024/3/24 19:33:29 updated: 2024/3/24 19:33:29 tags: MD语法文本样式列表结构链接插入图片展示练习实践链接问题 欢迎来到Markdown语法的世界!Markdown是一种简单而直观的标记语言,让文本排版变得轻松有趣。接下…

javaSwing超级玛丽游戏

一、摘要 摘要 近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用。J2SE称为Java标准版或Java标准平台。J2SE提供了标准的SDK开发平台。利用该平台可以开发Java桌面应用程序和低端的服务器应用程序…

Redis分布式锁—SETNX+Lua脚本实现

使用redis实现分布式锁,就是利用redis中的setnx,如果key不存在则进行set操作返回1,key已经存在则直接返回0。 优点: 设置expiretime过期时间,可以避免程序宕机长期持有锁不释放。redis作为一个中间服务,所…

下载的音频转换成mp3怎么转?4个好用简单的方法

不同音乐平台下载的音频格式文件不同,比如网易云的ncm格式、酷狗的kgm格式、B站的m4s格式、微信语音的silk格式、手机录音的amr、m4a格式,这些音频一旦脱离了原本的平台便无法播放,那么如何把下载的音频转换成兼容性高的MP3格式以便于我们在更…

linux系统------------Mysql数据库介绍、编译安装

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统(DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…

Java生成p12证书

本文章使用的环境 jdk1.8&#xff0c;spring-boot2.6.13 一、pom依赖 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.49</version></dependency><dependency>&…

说一说Java中的四种引用类型?

引言 在JDK1.2之前Java并没有提供软引用、弱引用和虚引用这些高级的引用类型。而是提供了一种基本的引用类型&#xff0c;称为Reference。并且当时Java中的对象只有两种状态&#xff1a;被引用和未被引用。当一个对象被引用时&#xff0c;它将一直存在于内存中&#xff0c;直到…

NSCaching: Simple and Efficient NegativeSampling for Knowledge Graph Embedding

摘要 知识图嵌入是数据挖掘研究中的一个基本问题&#xff0c;在现实世界中有着广泛的应用。它的目的是将图中的实体和关系编码到低维向量空间中&#xff0c;以便后续算法使用。负抽样&#xff0c;即从训练数据中未观察到的负三元组中抽取负三元组&#xff0c;是KG嵌入的重要步…

优思学院|质量工程师的该有哪些技能与素养?

质量工程师作为制造业中的核心角色&#xff0c;致力于确保产品的整体质量。这不仅涉及到测试和监控过程&#xff0c;还包括创建文档、设计质量测试&#xff0c;并且定义测试结果应达到的标准&#xff0c;所以他既懂得生产技术&#xff0c;又精通管理知识。在本篇文章中&#xf…

springboot3使用​自定义注解+Jackson优雅实现接口数据脱敏

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 内容简介 实现思路 实现步骤 1.自定义脱敏注解 2.编写脱敏策略枚举类 3.编写JSON序列化实现 4.编写测…