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

news2024/12/27 11:01:38

注意:本文引用自专业人工智能社区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.coloradmin.cn/o/1543370.html

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

相关文章

2024年云服务器ECS价格表出炉——腾讯云

腾讯云服务器多少钱一年?61元一年起。2024年最新腾讯云服务器优惠价格表,腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

C语言之strchr用法实例(八十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

产品经理面试自我介绍,这3大错误千万别犯!

金三银四求职季,你是不是也有面试的冲动!但面试并不是头脑一热就能取得好结果,在此之前,必须得有周全的准备,才能应对好面试官的“连环问”! 所以,今天这篇产品经理面试干货分享给大家~ 今天文…

选择靠谱的su模型库免费下载,让你事半功倍!

在建筑设计、室内设计等领域,SU模型库的使用已经成为了一种趋势。选择一个靠谱的SU模型库进行免费下载,确实可以大大提高设计工作的效率。那么,如何选择一个靠谱的su模型库免费下载呢? 一、了解su模型库的基本功能 在选择su模型库时&#xf…

第十三届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 裁纸刀试题 B: 寻找整数试题 C : \mathrm{C}: C: 求和试题 D: GCD试题 E: 蜂巢试题 F : \mathrm{F}: F: 全排列的价值试题 G: 青蛙过河试题 H \mathrm{H} H : 因数平方和试题 I: 最优清零方案试题 J : \mathrm{J}: J: 推导部分和 发现…

「MySQL」数据库约束

🎇个人主页:Ice_Sugar_7 🎇所属专栏:数据库 🎇欢迎点赞收藏加关注哦! 数据库约束 🍉约束类型🍌NOT NULL🍌UNIQUE🍌DEFAULT🍌主键🍌外键…

HSP_03章_Pytho n 数据类型

文章目录 024 Python数据类型概述025 Python_整型int25-1各进制的整型表示方法25-2 Python_整型int 字节 026 Python_浮点型float26-1 浮点型的表现形式26-2 浮点型的大小限制边界26-3 浮点类型计算后,存在精度的损失,可以使用Decimal类进行精确计算 027 Python_布尔类型27-1 P…

Navicat Premium 16中文---数据库管理与开发的强大引擎

Navicat Premium 16是一款功能强大的数据库管理工具,旨在为用户提供高效、便捷的数据库连接、管理和保护体验。该软件支持多种数据库系统,如MySQL、Oracle、SQL Server等,满足用户多样化的需求。通过直观的图形界面,用户可以轻松进…

微信小程序实战:无痛集成腾讯地图服务

在移动互联网时代,地图服务无疑是应用程序中最常见也最实用的功能之一。无论是导航定位、附近搜索还是路线规划,地图服务都能为用户提供极大的便利。在微信小程序开发中,我们可以轻松集成腾讯地图服务,为小程序赋能增值体验。本文将详细介绍如何在微信小程序中集成使用腾讯地图…

Fomepay哪个卡段可以充值ChatGPT4

这两天Fomepay的5347与556150两个卡段真对AI订阅进行维护,所以想要充值ChatGPT4的小伙伴就要开4866卡段,这个卡段不可以开openai api key 点击获取486695卡段进行充值 开卡步骤非常简单 1、注册 2、点击申请卡 3、填写姓名,支付即可 4、开…

产品经理面试如何自我介绍?

金三银四求职季,你是不是也有面试的冲动!但面试并不是头脑一热就能取得好结果,在此之前,必须得有周全的准备,才能应对好面试官的“连环问”! 所以,今天这篇产品经理面试干货文章,别…

【linux】进程的地址空间

1.代码看现象引入 #include<stdio.h>#include<unistd.h>#include<string.h> #include<stdlib.h>int val100;int main (){ printf("i am father,pid:%d,ppid:%d,val:%d&#xff0c;&val:%p\n",getpid(),getppid(),val,&val);size_t…

Spring中@Service 、@Component、@Repository等注解区别是什么?

一、问题解析 在Spring框架中&#xff0c;有很多用来声明Spring管理的bean的常用注解。它们都是Component的特化形式&#xff0c;用于指定不同类型的组件&#xff0c;主要有以下几个&#xff1a; 1Component&#xff1a;是一个通用的组件声明注解&#xff0c;表示该类是一个Sp…

利用PSR,三步实现业务快速加载

01 什么是PSR PSR是通信业界在BSS/OSS域面向产品设计和业务开通过程中提出的一个标准化信息分层解耦和映射的框架&#xff0c;按照国际电信论坛TMF推荐的SID信息框架的标准&#xff0c;主要分为产品域、服务域和资源域等三层&#xff0c;支撑通信业务的快速加载和敏捷开通。 TM…

【LeetCode: 4. 寻找两个正序数组的中位数 + 二分查找】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

海外客户获取难?海外云手机助力电商引流!

海外电商面临的市场竞争激烈&#xff0c;如何在海外市场获客成为了摆在许多卖家面前的难题。而在这个问题的解决方案中&#xff0c;海外云手机崭露头角&#xff0c;成为助力电商引流的新利器。 在当前市场中&#xff0c;云手机主要用于游戏挂机&#xff0c;但其潜力在海外电商领…

什么是虚拟线程?

1、典型回答 Java 中的虚拟线程&#xff0c;也叫做协程或“轻量级线程”&#xff0c;它诞生于JDK 19(预览 API)&#xff0c;正式发布于 JDK 21&#xff0c;它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程&#xff0c;不直接和操作系统的物理线程一一对应&#xff0c;因此它可…

Anaconda配置系统环境

首先&#xff0c;右键此电脑&#xff0c;点击属性 点击高级系统设计 点击环境变量 点击环境变量中系统环境下的Path&#xff0c;双击 如下图&#xff0c;添加这四项即可&#xff0c;注意&#xff0c;这都是Anaconda的安装目录下的内容 在windowsR的cmd情况下&#xff0c;输入co…

leetcode LCR121.寻找目标值-二维数组

目录 问题描述示例具体思路思路一思路二 代码实现 问题描述 m*n 的二维数组 plants 记录了园林景观的植物排布情况&#xff0c;具有以下特性&#xff1a; 每行中&#xff0c;每棵植物的右侧相邻植物不矮于该植物&#xff1b; 每列中&#xff0c;每棵植物的下侧相邻植物不矮于该…

刷题DAY27 | LeetCode 39-组合总和 40-组合总和II 131-分割回文串

39 组合总和&#xff08;medium&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates…