高斯混合模型聚类算法的实现

目录

  • 1. 作者介绍
  • 2. 聚类简介
    • 2.1 K-Means聚类简介
    • 2.2 高斯混合聚类简介
  • 3. 实验过程
    • 3.1 数据集介绍
    • 3.2 代码思路
    • 3.3 算法评价
    • 3.4 代码实现
    • 3.5 实验结果
  • 4. 参考链接

1. 作者介绍

赵子仪,女,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:2095684305@qq.com

徐达,男,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:1374455905@qq.com

2. 聚类简介

2.1 K-Means聚类简介

K-means聚类是一种基于距离的聚类算法,这意味着它将试图将最近的点分组以形成一个簇。
首先,我们先确定目标分组数量,这是K的数值,根据需要划分的族或分组的数量,随机初始化k个质心。
然后将数据点指定给最近的质心,形成一个簇,接着更新质心,重新分配数据点。这个过程不断重复,直到质心的位置不再改变。

缺点:K值难确定、复杂度与样本呈线性关系、很难发现任意形状的簇。所有创建的簇都是圆形的,这是因为分类的质心都是使用平均值迭代更新的。
在这里插入图片描述
因此,我们需要一种不同的方法来将类分配给数据点。不再使用基于距离的模型,而是使用基于分布的模型,这就是高斯混合模型出现的意义。

2.2 高斯混合聚类简介

高斯混合聚类(Gaussian Mixture Model,GMM)是一种基于概率模型的聚类算法。它假设每个簇都由多个高斯分布组成,即每个簇的数据点都是从不同的高斯分布中采样得到的。在高斯混合模型中,每个簇由以下三个参数定义:均值向量(mean vector)、协方差矩阵(covariance matrix)和权重(weight)。
GMM的核心在于它能够捕捉数据中的复杂结构,允许数据点以不同的概率属于多个聚类。
在这里插入图片描述
高斯混合聚类算法的目标是最大化对数似然函数,即将所有数据点分配到簇中的概率的对数和。对数似然函数的表达式为:
在这里插入图片描述
其中,P(xi |zi=k)和P(zi=k)分别表示属于簇的概率和簇的权重。对数似然函数的最大化可以通过EM算法来实现。
高斯混合聚类算法基于EM算法,可以分为两个步骤:E步和M步。
E步骤——对于每个数据点xi,计算它属于每个簇的后验概率P(zi=k|xi),即计算数据点x_i来自每个簇的概率,公式如下图所示:

在这里插入图片描述
其中,P(xi |zi=k)表示当xi属于簇k时,它服从高斯分布的概率密度函数;P(zi=k)表示簇的权重。
M步骤——重新估计每个簇的均值向量、协方差矩阵和权重。具体而言,对于簇k,计算它的均值向量μk、协方差矩阵∑k和权重ωk,公式如右图所示:
在这里插入图片描述
其中,N 表示数据点的总数。
重复执行E步和M步,直到收敛为止。算法的收敛条件可以是对数似然函数的增量小于某个阈值,或者每个簇的均值向量、协方差矩阵和权重的变化小于某个阈值。
在这里插入图片描述
在这里插入图片描述

3. 实验过程

3.1 数据集介绍

Digits dataset手写数字数据集包含1797个0-9的手写数字数据,每个数据由8 * 8 大小的矩阵构成,矩阵中值的范围是0-16,代表颜色的深度。
该手写数据为Sklearn内置数据集,导入数据集:

from sklearn.datasets import load_digits

在这里插入图片描述

3.2 代码思路

数据准备:使用load_digits()函数加载手写数字数据集,其中X包含了图像数据,y包含了对应的真实标签。
降维:使用PCA将手写数字数据集的像素特征降维到2维。这可以帮助我们在二维空间中可视化数据,以便更好地理解数据的结构和聚类结果。
PCA的工作原理如下:
1、计算协方差矩阵:首先计算数据集的协方差矩阵,该矩阵反映了不同特征之间的线性相关性。协方差矩阵的对角线元素表示各特征的方差,非对角线元素表示不同特征之间的协方差。
2、特征值分解:对协方差矩阵进行特征值分解,得到特征值和特征向量。特征向量表示数据在不同方向上的主要方差分布,而特征值表示对应特征向量的重要程度。
3、选择主成分:根据特征值的大小,选择最重要的特征向量作为主成分,即数据在哪些方向上的信息最为集中。
4、降维变换:将数据投影到选定的主成分上,从而将数据从原始高维空间映射到低维空间,实现降维。
GMM聚类:使用GaussianMixture模型拟合降维后的数据,设定聚类数为10(数字0-9)。然后根据拟合结果对数据进行聚类,得到每个数据点所属的类别。
可视化聚类结果:使用Matplotlib绘制了GMM聚类结果的散点图。每个聚类使用不同的颜色表示,以便观察聚类效果。
KMeans聚类:使用KMeans模型对降维后的数据进行聚类,同样设定聚类数为10。然后根据 KMeans 聚类结果绘制散点图。
可视化聚类结果:使用Matplotlib绘制了K-Means聚类结果的散点图。每个聚类使用不同的颜色表示,以便观察聚类效果。
随后与K-Means算法进行对比,使用轮廓系数(Silhouette Score,是一种用于评估聚类质量的指标。它能够衡量每个样本与其所属簇的紧密程度以及与其他簇的分离程度。轮廓系数的取值范围在[-1,1]之间,越接近1表示聚类效果越好,越接近-1表示聚类效果越差)来评估GMM和KMeans聚类的效果。这一步可以帮助我们比较两种算法的聚类效果,并选择最优的算法。
在这里插入图片描述

3.3 算法评价

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

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

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

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

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

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

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

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

3.4 代码实现

import os
os.environ["OMP_NUM_THREADS"] = '8'
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.metrics import accuracy_score
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
from matplotlib.colors import LinearSegmentedColormap
from sklearn.metrics import silhouette_score# 加载手写数字数据集
digits = load_digits()
X = digits.data
y = digits.target# 可视化手写数字数据集中的前10个数字的图像并了解它们对应的真实标签
plt.figure(figsize=(12, 6))
for i in range(10):plt.subplot(2, 5, i + 1)  # 创建子图形,2行5列,第i+1个子图形plt.imshow(X[i].reshape(8, 8), cmap='gray')  # 显示第i个图像plt.title(f"Digit: {y[i]}")  # 添加标题,显示对应的数字类别plt.axis('off')  # 关闭坐标轴
plt.suptitle('Example Digits from Digits Dataset', fontsize=16)
plt.savefig('Digits_example_digits.png')  # 保存图像
plt.show()# 使用PCA将手写数字数据集的像素特征降维到2维,以便在二维空间中对数据进行可视化,有助于我们更直观地了解数据的结构和聚类结果
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)# 使用GMM模型拟合数据
gmm = GaussianMixture(n_components=10, random_state=0)
clusters_gmm = gmm.fit_predict(X_pca)
# 可视化GMM聚类结果
plt.figure(figsize=(8, 6))
for i in range(10):plt.scatter(X_pca[clusters_gmm == i, 0], X_pca[clusters_gmm == i, 1], label=f'Cluster {i}', alpha=0.5)
plt.title('GMM Clustering of Digits Data')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend()
plt.savefig('gmm_clusters.png')
plt.show()# 使用K-Means模型拟合数据
kmeans = KMeans(n_clusters=10, random_state=0,n_init='auto')
clusters = kmeans.fit_predict(X_pca)# 绘制KMeans聚类结果的散点图
plt.figure(figsize=(8, 6))
for i in range(10):plt.scatter(X_pca[clusters == i, 0], X_pca[clusters == i, 1], label=f'Cluster {i}', alpha=0.5)
plt.title('KMeans Clustering of Digits Data')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend()
plt.savefig('kmeans_clusters.png')
plt.show()#聚类评估指标验证
gmm_silhouette = silhouette_score(X, clusters_gmm)
print(f"Silhouette Score for GMM: {gmm_silhouette}")kmeans_silhouette = silhouette_score(X, clusters)
print(f"Silhouette Score for KMeans: {kmeans_silhouette}")

3.5 实验结果

手写数字数据集部分数据展示如下:
在这里插入图片描述
GMM聚类结果如下:
在这里插入图片描述
K-Means聚类结果如下:
在这里插入图片描述
轮廓系数计算结果如下:
在这里插入图片描述

4. 参考链接

1.独家 | 使用高斯混合模型,让聚类更好更精确(附数据&代码&学习资源: link
2.聚类算法之高斯混合模型聚类 (Gaussian Mixture Model, GMM)_高斯混合聚类: link
3.机器学习(西瓜书)聚类_西瓜书 常用聚类指标: link
4.Python实现高斯混合聚类(GMM): link

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

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

相关文章

深度网络学习笔记(一)——self-attention机制介绍和计算步骤

self-attention机制介绍及其计算步骤 前言一、介绍和意义二、 计算细节2.1 计算Attention Score2.2 计算value2.3 计算关联结果b2.4 统一计算 三、总结 前言 Transformer是一种非常常见且强大的深度学习网络架构,尤其擅长处理输出为可变长度向量序列的任务&#xf…

低空经济重要意义

1. 推动经济高质量发展:低空经济作为新质生产力的代表,产业链条长、成长性好、市场空间大、绿色环保,有助于培育竞争新优势、打造增长新引擎、增强发展新动能。 2. 促进产业结构优化升级:低空经济的发展有助于推动相关产业的快速…

网络原理———TCP/IP—网络层IP协议

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 目录 网络层IP协议4位版本号4位首部长度8位服务类型16位总长度16位标识 3位标志 13位片偏移8位生存时间8位协议16位首部校验和32位源IP地址 和 32位目的IP地址方案1:动态分配IP地址方案2:NAT机…

小白跟做江科大32单片机之旋转编码器计次

原理部分按照下面这个链接理解即可y小白跟做江科大32单片机之对射式红外传感器计次-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139350487https://blog.csdn.net/weixin_58051657/article/details/139350487 实验过程 1.按照江科大老师给的电路图进行连接…

C语言(内存函数)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…

第十四章 创建Web客户端 - XML 命名空间的 SOAP 向导选项

文章目录 第十四章 创建Web客户端 - XML 命名空间的 SOAP 向导选项XML 命名空间的 SOAP 向导选项添加 NAMESPACE 类参数对文档样式 Web 方法使用未包装的消息格式不创建数组属性为可为 null 的元素生成 XMLNIL 属性参数为可为 nillable 元素生成 XMLNILNOOBJECT 属性参数将 XML…

基于Open3D的点云处理20- 基于Visualizer类自定义可视化

1. 自定义可视化 官网测试用例 Open3D/examples/python/visualization/customized_visualization.py 自定义可视化工具窗口-Visualizer 类 Visualizer 可视化基础操作def custom_draw_geometry(pcd):# The following code achieves the same effect as:# o3d.visualization.d…

springboot+vue+mybatis博物馆售票系统+PPT+论文+讲解+售后

如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统博物馆售票系统信息管理难度大,容错率低,…

Minio的图片下载

一 为什么要写下载? 正常使用Minio的时候,其实是不用单独再写下载功能的,因为使用Minio上传的时候,可以再返回结果里带上地址,可直接点击地址进行下载,可如果现在既要预览又要下载,就需要单独写一个下载功能. 1 代码如下 Minio使用的初始化 private void init() {minioClien…

【思考】服务的吞吐量与请求耗时的关系

吞吐量即服务1s内可以处理的最大请求数,即最大可以支撑的QPS;请求耗时就更好理解了,即处理一次请求所需要耗费的时间。 明显这两个指标都是用来衡量服务的性能的,但两者之间的关系是什么呢?他们之间是否存在一些相互的…

spdlog日志库源码:输出通道sink

概述 在 spdlog 日志库中,sinks 并不是一个单独的类,而是一系列类的集合,这些类以基类-派生类的形式组织,每一个 sink 派生类代表了一种输出日志消息的方式。输出目标可以是普通文件、标准输出 (stdout)、标准错误输出 (stderr)、…

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…

Pytest框架中的Setup和Teardown功能

在 pytest 测试框架中,setup 和 teardown是用于在每个测试函数之前和之后执行设置和清理的动作,而pytest 实际上并没有内置的 setup 和 teardown 函数,而是使用了一些装饰器或钩子函数来实现类似的功能。 学习目录 钩子函数(Hook…

详解 Scala 的模式匹配

一、基本语法 Scala 中的模式匹配类似于 Java 中的 switch 语法,但是功能更强大 /**[var a / def func() ] var_name match {case value1 > statement1case value2 > statement2case value3 > statement3case _ > defaultOP} */ object TestMatchCase…

Python——cv2 判断图像读取内容是否为空

import cv2 pic_path"xxx.jpg" imagecv2.imread(pic_path) if None image:print("图片为空") else:print("图片不为空")

ubuntu上zsh与bash切换

在Ubuntu上切换zsh和bash,你可以使用命令行。 切换到zsh: chsh -s $(which zsh)切换回bash: chsh -s $(which bash)注意:chsh命令可能需要你输入你的用户密码。 如果你想立即启动新shell,而不用重启,可以运行: ex…

java中的线程安全的容器

ReentrantLock 和 Condition 都是基于 AbstractQueuedSynchronizer (AQS) 实现的。 以下是 ReentrantLock 与 AQS 的关系: ReentrantLock 状态管理:ReentrantLock 通过 AQS 的 state 变量来表示锁的状态。状态为 0 表示锁未被持有,状态为 1…

【python】YOLO目标检测txt标签转xml,支持与原xml标签融合

需求: 利用现有yolo模型权重实现自动标注功能,即使用yolov5源码中的detect.py对待标注图像执行推理任务,并使用--save-txt保存标签文件,然后使用本文python代码直接将detect.py生成的txt标签转为xml标签,最后再使用la…

SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要

上面讲了SAP里面的基础知识,BOM,作业手顺(工艺路线),作业区(工作中心),MRP,MPS等概念,现在该到用的时候了。 SAP PP学习笔记07 - 简单BOM,派生BO…

5门编程语言哪个好一点:深入剖析与选择指南

5门编程语言哪个好一点:深入剖析与选择指南 在编程的广阔领域中,各种语言如繁星般璀璨,各有其独特之处。对于初学者或寻求转型的开发者来说,如何选择一门合适的编程语言往往令人头疼。本文将针对五门热门编程语言进行详细剖析&am…