聚类算法之高斯混合模型聚类 (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,一经查实,立即删除!

相关文章

9. Linux 信号详解

Hi, 大家好! 本篇开始讲解Linux中信号的基本知识。 一、信号基本概念 信号是事件发生时对进程的通知机制,也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程, 其实是在软件层次上对中断机制的一种模拟。 信号编号: 每个信号都有一个唯一…

美易官方:“巴菲特指标”创两年新高,拉响股市泡沫警报

近年来,随着全球经济的不断发展和资本市场的日益成熟,股市成为了越来越多人关注和投资的领域。然而,股市波动的不确定性也让许多投资者倍感焦虑。最近,“巴菲特指标”创两年新高,引发了市场对于股市泡沫的担忧。 “巴菲…

高性能计算——指令表

指令表 文章目录 指令表吞吐量计算示例一般情况在数字电子学中,执行阶段的交错是一个通用概念,不仅应用于主CPU流水线,还应用于独立指令和内存的层面。大多数执行单元都有自己的小流水线,可以在前一个指令之后一到两个周期内接收另一个指令。 在这种情况下,使用两种不同的…

并查集|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开发框架,它由多个模…

Flink中流式的各种聚合

11.1 MiniBatch 聚合 针对无界聚合算子,说简单点就是把一组输入的数据放到缓存里,减少吞吐的开销 默认情况下,对于无界聚合算子来说,mini-batch 优化是被禁用的。开启这项优化,需要设置选项 TableConfig configurat…

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…

数据结构(C语言)代码实现(十一)——离散事件模拟

目录 参考资料 代码实现 有序链表头文件LinkList.h 链队列LinkQueue.h 银行业务模拟程序头文件 Bank_Simulation.h 具体函数实现以及主函数 实验中遇到的问题 参考资料 1、数据结构严蔚敏版 2、大佬已有的成套的作业。基本思路照搬大佬和课本,不过自己这些代…

Spring MVC面试简答题

简答题 简述Spring MVC的设计原理和主要组成部分。解答: Spring MVC的设计原理基于MVC(Model-View-Controller)设计模式,它将应用程序划分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。 Model:代表应用程序的数据和业务逻辑。View:负责渲染用户界…

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

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

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…

Rust 的 Vec 排序方法汇总

在 Rust 中,Vec 类型的排序可以通过使用 sort 方法来实现。sort 方法是 Vec 的一个成员方法,它会对向量中的元素进行就地排序(即不返回新的排序后的向量,而是直接修改原始向量)。此外,sort_by 和 sort_by_k…

机器人|逆运动学问题解决方法总结

如是我闻: 解决逆运动学(Inverse Kinematics, IK)问题的方法多样,各有特点。以下是一个综合概述: 1. 解析法(Analytical Solutions) 特点:直接使用数学公式计算关节角度&#xff0…

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

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

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

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

探索AI大模型学习:理论基础、技术突破与未来挑战

在当今技术飞速发展的时代,人工智能(AI)大模型学习无疑是推动科技进步和创新的关键力量。AI大模型学习的核心在于通过训练大规模的数据集来提升模型的性能,使之能够更准确、更高效地完成各种任务,从而在多个领域中实现…

开启Safari手势支持

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