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

目录

  • 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…

网络原理———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语言 本系列文章为个人学习笔记,在这里撰写成文一…

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

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

sqoop操作

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

Pytest框架中的Setup和Teardown功能

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

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

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

STC8增强型单片机进阶开发--独立按键

知不足而奋进 望远山而前行 文章目录 目录 文章目录 前言 目标 内容 原理图 按键消抖 软件设计 要求 分析 实现单个按钮 实现多个按钮 使用位操作存储状态 总结 前言 本次学习旨在探索按键操作及按键消抖的原理和实现方法。通过学习原理图、按键消抖的三种方法以及软件设计的要…

如何选择D类音频放大器(数字功率放大器)

1 简介 多年来,音频内容一直在不断发展。从当地唱片店购买 12 英寸 LP 黑胶唱片的时代已经成为过去,现在我们通过流式传输几乎可即时播放云端的任何内容。虽然一些音频爱好者会为了获得新奇体验而重拾黑胶唱片,但今天绝大多数的音频都是以数…

JVM学习笔记(持续更新)

JDK、JRE、JVM区别? 类加载过程 装载 验证 准备 解析 初始化 类加载器分类 双亲委派模型 如何打破双亲委派模型? 自定义类加载器,集成ClassLoader类重写loadClass,如Tomcat JVM内存模型 JVM 需要使用计算机的内存,Java 程序…

【LeetCode 101】对称二叉树

1. 题目 2. 分析 这道题比较经典。我又一次做错了,这次是花了20min都没有做出来。 最开始我的思想就是,递归比较左根节点的左子树和右根节点的右子树是否对称即可,然后觉得能解决问题了,便动手coding。哪知道,又碰到了…

电源滤波器怎么选用

电源滤波器怎么选用 滤波器应用场景及作用第一步:第二步:第三步:第四步: 滤波器应用场景及作用 可以有效解决EMC测试无法通过、端口防护、滤除干扰、设备保护等问题 主要功能有: 1、降低主电源谐波; 2、保护驱动装置电力电子元件…

算法人生(18):从神经网络的“剪枝策略”看“怎么找回时间”

IT人的工作和生活难平衡这事,到底要怎么解决呢,让我们从神经网络的“剪枝策略”中找点灵感吧! 剪枝策略是指训练和优化深度神经网络时采取的一种技术,从名字就知道,它就像修剪树木一样,去除不必要的枝叶&a…

Vuex 是什么?VueX简介

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介Vuex 是什么核心概念1.State(状态)2. Getter(获取器)3. Mutation(突变)4. Action(动作)5. Module(模块) 原理解…

使用STS临时访问凭证通过客户端直连OSS对象存储服务器

目录 1、导论 2、客户端直传 3、创建RAM用户以及RAM角色 4、如何实现客户端直传 4.1、跨域访问 4.2、安全授权 5、代码示例 5.1、后端代码实例 5.2、客户端代码实例 1、导论 最近在做项目的过程中使用到了阿里云OSS来存储客户端上传的文件,方法是直接将客…

Keras深度学习框架实战(3):EfficientNet实现stanford dog分类

1、通过EfficientNet进行微调以实现图像分类概述 通过EfficientNet进行微调以实现图像分类,是一个使用EfficientNet作为预训练模型,并通过微调(fine-tuning)来适应特定图像分类任务的过程。一下是对相关重要术语的解释。 Effici…

Flutter-自定义可展开文本控件

Flutter 在移动开发中,常常需要处理一些长文本显示的场景,如何优雅地展示这些文本并允许用户展开和收起是一个常见的需求。在本文中,我将分享如何使用Flutter实现一个可展开和收起的文本控件。 效果 我们将实现一个可展开和收起的文本控件…

yolov10模块

yolov10模块 1 C2f2 C2fCIB2.1 CIB2.2 RepVGGDW 3 PSA4 SCDown5 v10Detect 论文代码:https://github.com/THU-MIG/yolov10 论文链接:https://arxiv.org/abs/2405.14458 Conv是Conv2dBNSiLU PW是Pointwise Convolution(逐点卷积) DW是Depthwise Convolut…

【SQL学习进阶】从入门到高级应用【企业真题】

文章目录 第一题第二题第三题第四题第五题第六题第七题第八题第九题MySQL行转列使用case whengroup by完成 第十题 🌈你好呀!我是 山顶风景独好 💕欢迎来到我的博客,很高兴能够在这里和您见面! 💕希望您在这…