当前位置: 首页 > news >正文

【机器学习】在Python中进行K-Means聚类和层次聚类

Python中聚类算法API的使用指南

聚类分析是数据分析中一种常见的无监督学习方法,通过将相似的对象分组在一起,我们能够识别出数据集中的自然分群。本文将介绍如何使用Python中的聚类算法接口,KMeans层次聚类方法。

K-Means 聚类

K-Means是一种广泛使用的聚类算法,它的目标是将数据点分成K个组,使得组内的点彼此相似,而组间的点不相似。下面是如何使用K-Means聚类分析的步骤:

步骤一:导入必要的库

首先,需要导入KMeans类,它在sklearn.cluster模块中。

from sklearn.cluster import KMeans

步骤二:加载数据

我们使用pandas库来加载数据。确保数据文件的路径是正确的。

import pandas as pddf = pd.read_excel(CLUS_FILE_PATH, index_col=0)

步骤三:应用K-Means聚类

创建一个KMeans实例,并通过.fit()方法应用于数据。

kmeans = KMeans(n_clusters=3, random_state=0).fit(df)

步骤四:保存聚类结果

将聚类标签添加到原始数据框中,并保存到Excel文件。

df['Cluster'] = kmeans.labels_
df.to_excel('kmeans聚类分析结果.xlsx')

层次聚类

层次聚类是另一种常见的聚类方法,它通过构建一个多层次的嵌套分群树来组织数据,这个树被称为树状图(Dendrogram)。相对于K-Means,层次聚类不需要指定k值就可以完成聚类,但是要分类出标签的话,我们需要指定一个距离,如果两个样本超出这个距离则不属于同一类。

步骤一:导入库

导入进行层次聚类和绘制树状图所需的库。

from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
from scipy.spatial.distance import pdist

步骤二:加载数据并计算距离矩阵

同样地,我们先加载数据,然后计算距离矩阵,使用欧式距离。

df = pd.read_excel(CLUS_FILE_PATH, index_col=0)
distance_matrix = pdist(df, metric='euclidean')

步骤三:执行层次聚类

使用linkage函数进行层次聚类,这里采用了’ward’方法。

Z = linkage(distance_matrix, method='ward')

步骤四:确定聚类数并保存结果

通过选择一个最大距离阈值来确定聚类数,并把聚类结果保存到Excel。

clusters = fcluster(Z, max_d=50, criterion='distance')
df['Cluster'] = clusters
df.to_excel('层次聚类分析结果.xlsx')

步骤五:绘制树状图并保存

最后,利用dendrogram函数绘制树状图,并保存为图片。

plt.figure(figsize=(10, 50))
dendrogram(Z, orientation='left', labels=df.index, leaf_rotation=0, leaf_font_size=10)
plt.title('层次聚类的树状图')
plt.ylabel('中药名称')
plt.xlabel('距离')
plt.tight_layout()
plt.savefig('层次聚类树状图.png')
plt.show()
层次聚类的树状图

我们可以看到,各个中药被层次聚类组织成了一颗一颗嵌套的树,这些树描述了不同中药之间的距离关系。
在这里插入图片描述

上面的步骤展示了如何使用Python进行K-Means聚类和层次聚类分析。聚类是一个强大的工具,可以帮助我们发现数据中的模式和结构。通过实践这些步骤,你会对聚类分析有更深的了解。

利用PCA降维以可视化聚类结果

绘图函数(可直接复制,然后按下文调用)

def plot_clus_2D(clustered_data, class_col, method):n_clusters = clustered_data[class_col].nunique()# 执行PCA降维,降至2维pca = PCA(n_components=2)data_reduced = pca.fit_transform(clustered_data.drop(columns=[class_col]))# 创建一个新的DataFrame来保存降维后的数据和聚类标签data_2D = pd.DataFrame(data_reduced, columns=['PC1', 'PC2'])data_2D[class_col] = clustered_data[class_col].values# 设置绘图参数fig, ax = plt.subplots(figsize=(10, 8))# 为每个聚类设置不同的颜色colors = ['red', 'green', 'blue']  # 你可以根据需要的聚类数修改颜色if n_clusters > 3:  # 如果聚类数超过3,扩展颜色列表import matplotlib.colors as mcolorscolors = list(mcolors.TABLEAU_COLORS.values())[:n_clusters]# 绘制每个聚类的散点图for i in range(n_clusters):# 从聚类数据中提取当前聚类的数据cluster_data = data_2D[data_2D[class_col] == i]# 绘制散点图ax.scatter(cluster_data['PC1'], cluster_data['PC2'],color=colors[i], label=f'Cluster {i}', alpha=0.5)# 添加图例和标题ax.legend()ax.set_title(f'{method} 聚类结果 - PCA降维可视化(2D)')ax.set_xlabel('Principal Component 1')ax.set_ylabel('Principal Component 2')# 显示图表save_path = os.path.join(IMAGE_FOLDER, f'{method} 聚类结果 - PCA降维可视化(2D).png')plt.savefig(save_path)plt.show()def plot_clus_3D(clustered_data, class_col, method):""":param clustered_data: 带有聚类结果标签的数据集:param class_col: 代表聚类结果的列名:param n_clusters: 有多少个:param method::return:"""n_clusters = clustered_data[class_col].nunique()# 执行PCA降维,降至3维pca = PCA(n_components=3)data_reduced = pca.fit_transform(clustered_data.drop(columns=[class_col]))# 创建一个新的DataFrame来保存降维后的数据和聚类标签data_3D = pd.DataFrame(data_reduced, columns=['PC1', 'PC2', 'PC3'])data_3D[class_col] = clustered_data[class_col].values# 设置绘图参数fig = plt.figure(figsize=(10, 8))ax = fig.add_subplot(111, projection='3d')# 为每个聚类设置不同的颜色colors = ['red', 'green', 'blue']  # 根据需要的聚类数修改颜色if n_clusters > 3:  # 如果聚类数超过3,扩展颜色列表import matplotlib.colors as mcolorscolors = list(mcolors.TABLEAU_COLORS.values())[:n_clusters]# 绘制每个聚类的散点图for i in range(n_clusters):# 从聚类数据中提取当前聚类的数据cluster_data = data_3D[data_3D[class_col] == i]# 绘制散点图ax.scatter(cluster_data['PC1'], cluster_data['PC2'], cluster_data['PC3'],color=colors[i], label=f'Cluster {i}', alpha=0.5)# 添加图例和标题ax.legend()ax.set_title(f'{method} 聚类结果 - PCA降维可视化(3D)')ax.set_xlabel('Principal Component 1')ax.set_ylabel('Principal Component 2')ax.set_zlabel('Principal Component 3')# 显示图表save_path = os.path.join(IMAGE_FOLDER, f'{method}_聚类结果_PCA降维可视化(3D).png')plt.savefig(save_path)plt.show()

示例调用

clus_data = pd.read_excel('kmeans聚类分析结果.xlsx', index_col=0)
plot_clus_2D(clustered_data=clus_data, class_col='Cluster', method='K-means')
plot_clus_3D(clustered_data=clus_data, class_col='Cluster', method='K-means')clus_data = pd.read_excel('层次聚类分析结果.xlsx', index_col=0)
plot_clus_2D(clustered_data=clus_data, class_col='Cluster', method='层次聚类')
plot_clus_3D(clustered_data=clus_data, class_col='Cluster', method='层次聚类')

2D可视化

K-Means聚类结果

在这里插入图片描述

层次聚类结果

在这里插入图片描述

3D可视化

K-Means聚类结果

在这里插入图片描述

层次聚类结果

在这里插入图片描述

相关文章:

【机器学习】在Python中进行K-Means聚类和层次聚类

Python中聚类算法API的使用指南 聚类分析是数据分析中一种常见的无监督学习方法,通过将相似的对象分组在一起,我们能够识别出数据集中的自然分群。本文将介绍如何使用Python中的聚类算法接口,KMeans和层次聚类方法。 K-Means 聚类 K-Means…...

springboot254小区团购管理

小区团购管理设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装小区团购管理软件来发挥其高效地信…...

Word中的文档网格线与行距问题

在使用Word编辑文档时,经常会发生以下动图展示的这种情况: 上面的动图里,将文字大小放大到某个字号时,单倍行距的间距突然增加很多。造成这种情况的原因是文档中定义了网格线,并且设置了对齐到网格线。如果取消文档中…...

【简写Mybatis】03-Mapper xml的注册和使用

前言 在学习MyBatis源码文章中,斗胆想将其讲明白;故有此文章,如有问题,不吝指教! 注意: 学习源码一定一定不要太关注代码的编写,而是注意代码实现思想; 通过设问方式来体现代码中的…...

Vue源码系列讲解——指令篇【一】(自定义指令)

目录 1. 前言 2. 何时生效 3. 指令钩子函数 4. 如何生效 5. 总结 1. 前言 在Vue中,除了Vue本身为我们提供的一些内置指令之外,Vue还支持用户自定义指令。并且用户有两种定义指令的方式:一种是使用全局API——Vue.directive来定义全局指令…...

STM32(14)USART

USART:一种片上外设,用来实现串口通信,就是stm32内部的串口 USART简介 串并转换电路 串行通信和并行通信 串行:一根数据线,逐个比特位发送 为什么要串并转换 移位寄存器 USART的基本模型 通过查询SR(状态寄存器&…...

作业 字符数组-统计和加密

字串中数字个数 描述 输入一行字符&#xff0c;统计出其中数字字符的个数。 输入 一行字符串&#xff0c;总长度不超过255。 输出 输出为1行&#xff0c;输出字符串里面数字字符的个数。 样例 #include <iostream> #include<string.h> using namespace std; int m…...

Codeforces Round 719 (Div. 3)除F2题外补题报告

Codeforces Round 719 Div. 3 除F2题外补题报告 得分情况补题情况错题分析C题题目大意初次思路正解思路正解代码错误原因 D题题目大意初次思路正解思路正解代码错误原因 E题题目大意初次思路正解思路正解代码 F1题题目大意正解思路正解代码 G题题目大意正解思路正解代码 得分情…...

docker本地搭建spark yarn hive环境

docker本地搭建spark yarn hive环境 前言软件版本准备工作使用说明构建基础镜像spark on yarn模式构建on-yarn镜像启动on-yarn集群手动方式自动方式 spark on yarn with hive(derby server)模式构建on-yarn-hive镜像启动on-yarn-hive集群手动方式自动方式 常用示例spark执行sh脚…...

每日学习笔记:C++ 11的Tuple

#include <tuple> Tuple介绍(不定数的值组--可理解为pair的升级版) 定义 创建 取值 初始化 获取tuple元素个数、获取tuple某元素类型、将2个tuple类型串接为1个新tuple类型...

MongoDB聚合运算符;$dateToParts

$dateToParts聚合运算符将日期表达式拆分成多个字段放在一个文档返回&#xff0c;属性有year、month、day、hour、minute、second和millisecond。如果iso8601属性设置为true&#xff0c;返回的各部分用ISO周日期返回&#xff0c;属性分别是&#xff1a;isoWeekYear、isoWeek、i…...

Spring MVC RequestMappingHandlerAdapter原理解析

在Spring MVC框架中&#xff0c;RequestMappingHandlerAdapter是一个核心的组件&#xff0c;负责将请求映射到具体的处理器方法上&#xff0c;并调用这些方法来处理请求。其中&#xff0c;invokeHandlerMethod方法是这个适配器中的一个关键方法&#xff0c;它负责实际调用处理器…...

反射整理学习

目录 1、反射介绍 2、反射API 2.1 获取类对应的字节码的对象&#xff08;三种&#xff09; 2.2 常用方法 3、反射的应用 3.1 创建 : 测试物料类 3.2 获取类对象 3.3 获取成员变量 3.4 通过字节码对象获取类的成员方法 3.5 通过字节码对象获取类的构造方法 4、创建对象…...

JavaScript 运算规则详解

在 JavaScript 中&#xff0c;运算规则是非常重要的基础知识&#xff0c;了解这些规则可以帮助我们正确地编写代码并避免一些常见的错误。本教程将详细介绍 JavaScript 中的各种运算规则&#xff0c;包括基本运算符、类型转换、运算优先级等内容。 1. 基本运算符 JavaScript …...

C++篇 语 句

到目前为止&#xff0c;我们只见过两种语句&#xff1a; return 语句和表达式语句。根据语句对执行顺 序的影响&#xff0c;C 语言其余语句大多属于以下 3 大类。 选择语句&#xff1a; if 语句和 switch 语句。循环语句&#xff1a; while 语句&#xff0c; do...while 语句和…...

简洁的在线观影开源项目

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识。 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0c;今天介绍的开源项目简介如下&#xff1a; 仓库名&#xff1…...

VB超级模块函数VB读写记事本-防止乱码支持UTF-8和GB2312编码

Private Sub Command1_Click() Writein “C:\Users\Administrator\Desktop\1.txt”, “文本文内容” End Sub Private Sub Form_Load() Text1 ReadANSI(“C:\Users\Administrator\Desktop\1.txt”) Text2 ReadUTF8(“C:\Users\Administrator\Desktop\1.txt”) End Sub 写入…...

XSS靶场-DOM型初级关卡

一、环境 XSS靶场 二、闯关 1、第一关 先看源码 使用DOM型&#xff0c;获取h2标签&#xff0c;使用innerHTML将内容插入到h2中 我们直接插入<script>标签试一下 明显插入到h2标签中了&#xff0c;为什么不显示呢&#xff1f;看一下官方文档 尽管插入进去了&#xff0…...

【嵌入式高级C语言】10:C语言文件

文章目录 1 文件的概述1.1 文件分类&#xff08;存储介质&#xff09;1.2 磁盘文件分类&#xff08;存储方式&#xff09;1.3 二进制文件和文本文件的区别 2 文件缓冲区3 文件指针4 文件的API4.1 打开文件4.2 关闭文件4.3 重新定位流4.3.1 fseek4.3.2 ftell4.3.3 rewind 4.4 字…...

创建数据表

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 如果要进行数据表的创建 create table 表名称 (列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,...列名称 类型 [DEFAULT 默认值 ] )…...

CS32L010芯片烧录实战:用Keil+Jlink一键搞定hex文件(附常见错误排查)

CS32L010芯片烧录实战&#xff1a;用KeilJlink一键搞定hex文件&#xff08;附常见错误排查&#xff09; 在嵌入式开发领域&#xff0c;芯片烧录是每个工程师必须掌握的基础技能。CS32L010作为一款性价比极高的32位微控制器&#xff0c;广泛应用于物联网终端设备、智能家居和工业…...

软件冲刺回顾管理化的过程改进反思

软件冲刺回顾管理化的过程改进反思 在敏捷开发中&#xff0c;冲刺回顾&#xff08;Sprint Retrospective&#xff09;是团队持续改进的核心实践之一。随着项目规模扩大或团队协作复杂度提升&#xff0c;传统的回顾会议可能流于形式&#xff0c;难以真正推动过程改进。如何将回…...

K8s控制平面升级

K8s 的升级只要按标准流程来&#xff0c;完全可以做到零中断升级&#xff0c;用户完全感知不到。基础逻辑什么是控制平面&#xff1f;K8s 的集群分成两部分&#xff1a;控制平面&#xff08;Master 节点&#xff09;&#xff1a;可以理解成集群的 “大脑”&#xff0c;负责管整…...

深度学习模型解释:SHAP与LIME

深度学习模型解释&#xff1a;SHAP与LIME 引言 深度学习模型在各个领域取得了显著的成功&#xff0c;但它们往往被视为"黑盒"&#xff0c;难以理解其决策过程。模型解释性已成为深度学习应用中的关键挑战&#xff0c;尤其是在医疗、金融等对决策可解释性要求较高的领…...

Android Studio中文界面终极配置指南:3分钟搞定你的开发环境汉化

Android Studio中文界面终极配置指南&#xff1a;3分钟搞定你的开发环境汉化 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在…...

【限时解禁】微软VS Code IntelliCode内核逆向文档(含未公开的Symbol Graph Embedding协议v3.2)

第一章&#xff1a;智能代码生成原理与架构解析 2026奇点智能技术大会(https://ml-summit.org) 智能代码生成并非简单地拼接模板或检索已有片段&#xff0c;而是基于大规模代码语料训练的深度语言模型&#xff0c;对编程意图进行语义建模、上下文感知推理与结构化输出控制的系…...

当 ROS Noetic 遇上 Conda:在 Ubuntu 20.04 上管理 Python 环境的避坑指南

当 ROS Noetic 遇上 Conda&#xff1a;在 Ubuntu 20.04 上管理 Python 环境的避坑指南 在机器人开发领域&#xff0c;ROS&#xff08;Robot Operating System&#xff09;和Conda环境管理工具各自扮演着重要角色。ROS Noetic作为首个官方支持Python 3的LTS版本&#xff0c;与C…...

RexUniNLU零样本NLP系统参数详解:temperature/top_k对输出影响分析

RexUniNLU零样本NLP系统参数详解&#xff1a;temperature/top_k对输出影响分析 1. 理解RexUniNLU系统的核心价值 RexUniNLU是一个基于ModelScope DeBERTa架构的中文自然语言处理系统&#xff0c;它最大的特点是用一个统一的模型框架处理十多种不同的NLP任务。想象一下&#x…...

OBS StreamFX插件完全指南:如何用免费插件打造专业直播画面

OBS StreamFX插件完全指南&#xff1a;如何用免费插件打造专业直播画面 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even …...

Element UI el-upload 多文件上传 on-success 回调触发机制深度解析与实战优化

1. 多文件上传的常见痛点与 el-upload 行为解析 在实际开发中&#xff0c;文件上传功能几乎是每个Web应用都绕不开的需求。Element UI的el-upload组件因其开箱即用的特性&#xff0c;成为很多Vue开发者的首选。但当你需要处理多文件上传时&#xff0c;可能会遇到一个让人困惑的…...