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

目录

  • 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

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

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

相关文章

STM32(十):SPI (标准库函数)

前言 上一篇文章已经介绍了如何用STM32单片机中USART通信协议来串口通信,并向XCOM串口助手发送信息。这篇文章我们来介绍一下如何用STM32单片机中SPI接口来实现LED的闪亮并玩转WS2812B灯带。 一、实验原理 串行通信之前的博客里有所介绍,可以查看以下…

回退背包专题

P4141 消失之物 题目意思,就是说有n个物品,然后每个物品都有自己的体积w[i],然后问你,如果第i个物品丢了之后,还能够装满这个背包的方法,然后遍历一遍i同时也要遍历一遍背包,因为背包的值是在1到…

python数据分析——datetime数据类型2

参考资料:活用pandas库 # 导入pandas库 import pandas as pd # 加载数据集 teslapd.read_csv(r"...\data\tesla_stock_yahoo.csv") # 查看数据 print(tesla.head()) 1、基于日期取数据子集 # 将Date数据列转换为datetime类型 tesla[Date]pd.to_datetime…

【Linux 网络编程】OSI 七层模型初识、网络传输的流程、IP地址和MAC地址!

文章目录 1. OSI七层模型2. TCP/IP五层(或四层)模型3. 网络传输基本流程 🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧&#…

Golang | Leetcode Golang题解之第127题单词接龙

题目: 题解: func ladderLength(beginWord string, endWord string, wordList []string) int {wordId : map[string]int{}graph : [][]int{}addWord : func(word string) int {id, has : wordId[word]if !has {id len(wordId)wordId[word] idgraph a…

Flink系列三:Flink架构、独立集群搭建及Flink on YARN模式详解

一、Flink架构 Flink 是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器,例如Hadoop yarn,但也可以设置作为独立集群甚至库运行。 Flink 集群剖析 Flink 运行时由两种类型的进程组成&…

数据分析常用模型合集(一)AARRR模型和漏斗模型

准备把常用的数据分析模型,像什么AARRR,RFM之类的,逐个全部写一下; 最好能带点案例和代码,搞一个小合集。 最终达到完全不懂的人,看完就能知道得差不多; 数据分析常用模型合集(二…

TiDB-从0到1-分布式存储

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCC 一、TiDB-DML语句执行流程(增删改) DML流程概要 1、协议验证 用户连接到TiDB Server后首先工作的是Protocol Layer模块,该模块会对用…

FuTalk设计周刊-Vol.046

# AI漫谈 热点捕手 1、Stable Diffusion 可以生成透明的 PNG 图片了 用 SD 直接生成透明的 PNG 图片,也可以直接生成带有透明度分层的图片,LayerDiffusion 使得大型已经过预训练的潜在扩散模型(latent diffusion model)能够创造…

docker学习--最详细的docker run 各子命令解释与应用

文章目录 docker run应用docker run -it那怎样才能退出容器而不用容器关闭呢 docker run -d-p-P--name docker run 容器运行命令 docker run 常见的子命令及其含义 -i 交互式,和-t一起使用 -t 打开一个终端 -d 后台运行 -p/-P 暴露容器中的服务端口 –name 指定容…

计算机组成原理----浮点数的表示和运算

目录 一.浮点数的表示 1.浮点数的作用和基本原理 2.浮点数的规格化 3.浮点数的表示范围 二.IEEE 754标准 三.浮点数的加减运算 1.加减运算 2.强制类型转换 一.浮点数的表示 1.浮点数的作用和基本原理 定点数在字节数固定的情况下,能表示的数字是很有限的&…

C++ | Leetcode C++题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longestStreak 0;for (const int& num : num_set) {…

SAP PP学习笔记15 - MTS(Make-to-Stock) 按库存生产(策略11,策略30)

上一章学习了MTS&#xff08;Make-to-Stock&#xff09;按库存生产&#xff08;策略10&#xff09;。 SAP PP学习笔记14 - MTS&#xff08;Make-to-Stock) 按库存生产&#xff08;策略10&#xff09;&#xff0c;以及生产计划的概要-CSDN博客 本章继续讲MTS&#xff08;Make-t…

Prism 入门01,基础

Prism 框架是支持多平台的一种MVVM框架(Model-View-ViewModel) 除了具备一些基础的属性通知绑定,命令操作,消息聚合器等功能外。还具备一些强大的功能:例如,区域,导航,会话服务,模块注入等特性。 一.如何在WPF 项目中使用Prism 框架 1.打开Visual Studio 2022,选择创…

Java | Leetcode Java题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution {public int longestConsecutive(int[] nums) {Set<Integer> num_set new HashSet<Integer>();for (int num : nums) {num_set.add(num);}int longestStreak 0;for (int num : num_set) {if (!num_set.contai…

边缘计算的AI小板——OrangePi AI Pro

简介 OrangePi AI Pro是一款基于Allwinner H6处理器的嵌入式AI计算设备&#xff0c;适用于物联网和边缘计算。它具有强大的性能、低功耗、多接口和小尺寸。 本文分为三个部分&#xff1a; 一、对该板进行简单的开箱介绍。 二、 将SD卡中的系统迁移到由于该板支持SD卡、SSD…

Python代码关系图生成,帮助快速熟悉一个项目

一、静态代码关系图 工具1、pyreverse pyreverse 是一个由 Logilab 开发的 Python 工具&#xff0c;它能够自动生成 UML (统一建模语言) 类图&#xff0c;这些类图基于 Python 源代码。pyreverse 可以分析 Python 代码&#xff0c;并从中提取出类、模块、函数、方法和它们之间…

Java项目:94 springboot大学城水电管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本管理系统有管理员和用户。 本大学城水电管理系统管理员功能有个人中心&#xff0c;用户管理&#xff0c;领用设备管理&#xff0c;消耗设备…

docker和docker-compose的安装

docker的安装 1.安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun2.设置开机自启动 systemctl start docker #启动docker systemctl enable docker3.配置阿里云镜像 不配置镜像的话&#xff0c;进行 docker pull 等操作会比较慢。进入阿里云&…

【MySQL】聊聊order by 是如何排序的

CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB;构建一个表结构&#xff0c;以及数据。 本篇主要来分析下order by是如何进…