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

news2025/6/18 16:28:12

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

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

K-Means 聚类

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

步骤一:导入必要的库

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

from sklearn.cluster import KMeans

步骤二:加载数据

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

import pandas as pd

df = 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 mcolors
        colors = 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 mcolors
        colors = 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聚类结果

在这里插入图片描述

层次聚类结果

在这里插入图片描述

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

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

相关文章

保姆级讲解字符串函数(上篇)

目录 字符分类函数 导图 函数介绍 1.getchar 2. isupper 和 islower 字符转换函数:(toupper , tolower) 与 putchar 字符串函数 导图 string函数的使用和模拟实现 string的使用 求字符串长度 字符串的比较 string函数的模拟实现…

苍穹外卖-day01

苍穹外卖-day01 目录 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库环境…

【考研数学】129高分学姐二战经验+资料分享

21年数学三87分 22年数学三129分 可以说这两年该踩的雷我都踩了、该做的题我都做了。 进来看看是什么使我突然醒悟让我数学提分40多分的叭。 李林的880题我也做过,先来说说这本书的优缺点以及适用人群吧。 习题优点 李林老师的880题难度适中,很贴近…

013 Linux_互斥

前言 本文将会向你介绍互斥的概念,如何加锁与解锁,互斥锁的底层原理是什么 线程ID及其地址空间布局 每个线程拥有独立的线程上下文:一个唯一的整数线程ID, 独立的栈和栈指针,程序计数器,通用的寄存器和条件码。 和其…

基于springboot实现大学外卖管理系统项目【项目源码+论文说明】

基于springboot实现大学外卖管理系统演示 摘要 如今,信息化不断的高速发展,社会也跟着不断进步,现今的社会,各种工作都离不开信息化技术,更离不开电脑的管理。信息化技术也越来越渗透到各小型的企业和公司中&#xff…

pytorch(九)卷积神经网络

文章目录 卷积神经网络全连接神经网络与卷积神经网络的区别概念性知识mnist数据集(卷积神经网络) GoogLeNetInception 残差网络ResNet残差块结构 卷积神经网络 全连接神经网络与卷积神经网络的区别 全连接神经网络是一种最为基础的前馈神经网络,他的每一个神经元都…

AndroidStudio跑马灯实现

在activity_main.xml中编写如下代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_h…

【考研数学】打基础,张宇《30讲》还是武忠祥《基础篇》?

张宇的30讲还是不太适合零基础的考研党去听...因为宇哥整体节奏较快&#xff0c;如果目标分较高&#xff0c;有一定的基础还是建议的 身边真的很多130-140的大佬都是跟着张宇从头到尾&#xff0c;张宇老师的习题册非常适合基础扎实&#xff0c;想冲刺高分的考研党 我是属于基…

R语言的数据类型与数据结构:向量、列表、矩阵、数据框及操作方法

R语言的数据类型与数据结构&#xff1a;向量、列表、矩阵、数据框及操作方法 介绍向量列表矩阵数据框 介绍 R语言拥有丰富的数据类型和数据结构&#xff0c;以满足各类数据处理和分析的需求。本文将分享R语言中的数据类型&#xff0c;包括向量、列表、矩阵、数据框等&#xff…

Skywalking官方的实战模拟项目Live-Demo

Skywalking 官方的实战模拟项目Live-Demo Live-Demo 是 Skywalking 官方的实战模拟项目&#xff0c;其中包含4个子模块项目 projectA访问projectB、projectC两个SpringBoot项目 projectB访问本地的H2数据库 projectC访问www.baidu.com并同时向一台Kafka消息队列写入数据 proje…

VSCODE解决git合并过程中的冲突问题;error: failed to push some refs to

1&#xff1a;异常现象 推送有冲突的git修改到远端的时候&#xff0c;会有如下提示 git.exe push --progress “origin” master:master To http://gitlab.xxx.com/dujunqiu/test.git ! [rejected] master -> master (fetch first) error: failed to push some refs to ‘…

解决“ModuleNotFoundError: No module named ‘RPi._GPIO‘”

背景描述 树莓派4B Ubuntu20.04 Python3.9安装RPi.GPIO后无法使用 解决办法 使用sudo pip3 install RPi.GPIO --upgrade尝试更新&#xff0c;发生红字报错&#xff0c;提示在编译过程中缺少Python开发头文件&#xff08;Python.h&#xff09;&#xff0c;因此应该先安装他&…

短视频矩阵系统--抖去推---年后技术还能迭代更新开发运营吗?

短视频矩阵系统#短视频矩阵系统已经开发3年&#xff0c;年后这个市场还能继续搞吗&#xff1f;目前市面上开发短视频账号矩阵系统的源头公司已经不多了吧&#xff0c;或者说都已经被市场被官方平台的政策影响的不做了吧&#xff0c;做了3年多的矩阵系统开发到现在真的是心里没有…

excel 动态列导出

excel动态列&#xff0c;只好用poi来写了&#xff0c;也并不复杂&#xff0c;一样就这个件事情抽像为几步&#xff0c;就是套路了&#xff0c;开发效率就上去了。 1 准备空模板 导出操作与excel模板的导出一样&#xff0c;可以参考excel导出标准化 2 自定义SheetWriteHandler …

TI IWR6843ISK ROS驱动程序搭建

1、设备准备 1.1 硬件设备 1&#xff09;TI IWR 6843 ISK 1块 2&#xff09;Micro USB 数据线 1条 1.2 系统环境 1&#xff09;VMware Workstation 15 Player 虚拟机 2&#xff09;Ubuntu18.04 并安装有 ROS1 系统 如若没有安装 ROS 系统&#xff0c;可通过如下指令进行…

HTML 02

1.列表 布局内容排列整齐的区域 (1)无序列表 写法&#xff1a; <ul><li>列表条目1</li><li>列表条目2</li><li>列表条目3</li></ul> 浏览器中显示&#xff1a; 注意&#xff1a; ul标签里只能包裹li标签 li标签里可以包…

算法学习系列(四十):贡献法

目录 引言概念一、孤独的照片二、牛的基因学三、字串分值 引言 关于这个贡献法考的不是很多&#xff0c;主要题型是出现在需要枚举每一个组合这类题&#xff0c;出现的次数较多。没有固定的模板&#xff0c;就是一种思想&#xff0c;跟贪心一样&#xff0c;每个题都是不一样的…

探讨系统测试的最佳实践与思维模式!

这是测试活动过程详解系列的最后一篇文章。之前的想法&#xff0c;是对测试过程各重要环节进行拆解&#xff0c;然后介绍这个环节重点要做的事情&#xff0c;为什么要做这些事&#xff0c;以及注意事项。 前面几篇文章分别介绍了单元测试、集成测试、回归测试阶段要解决的问题…

yolo模型中神经节点Mul与Sigmoid 和 Conv、Concat、Add、Resize、Reshape、Transpose、Split

yolo模型中神经节点Mul与Sigmoid 和 Conv、Concat、Add、Resize、Reshape、Transpose、Split 在YOLO&#xff08;You Only Look Once&#xff09;模型中&#xff0c;具体作用和用途的解释&#xff1a;

qt 日志 格式化打印 QMessagePattern

进入 qt源码 调试:qt creator debug 无法进入 qt源码 调试-CSDN博客 qt为 格式化打印 日志 提供了一个简易的 pattern(模式/格式) 词法解析类QMessagePattern,该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qlogging.cpp 中 该类直接在构造函数中…