首页 > 其他分享 >一次相对完整的K-means聚类流程

一次相对完整的K-means聚类流程

时间:2024-07-17 16:30:04浏览次数:8  
标签:pre ax1 set means df 流程 plt 聚类

数据结构(第一题数据)如下:

nox1x2x3
11252044
21211843
31201742
41242045
51221843
61201944
71211741
81221943
91221742
101211945

首先是导入的一些准备工作:

# 科学计算,启动!
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as Axes3D
# 解决显示中文的问题
plt.rcParams['axes.unicode_minus'] = False 
plt.rcParams["font.sans-serif"] = ["SimHei"]

# 可视化主题
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)
# 导入数据
df = pd.read_csv("第一题数据.csv")
df = df.sort_values(["x1","x2","x3"])
df.head()

运行结果:

# 首先可视化数据
fig = plt.figure(figure = (15,10))
ax = plt.subplot(111,projection="3d")
x1 = df.loc[:,"x1"]
x2 = df.loc[:,"x2"]
x3 = df.loc[:,"x3"]
ax.set_xlabel("肩宽/髋宽*100",size =12)
ax.set_ylabel("胸厚/胸围*100",size =12)
ax.set_zlabel("腿长/身长*100",size =12)
ax.view_init(elev = 20,azim = 25)
ax.scatter3D(x1,x2,x3,s = 20)
plt.savefig("游泳运动员体测数据散点图")

from sklearn.cluster import * 
# 使用肘方法搜索合适的聚类数目
kmax = 10
K = np.arange(1,kmax)
iner = [] # 类内误差平方和
df1 = df.iloc[:,1:]
print(df1.head())
for ii in K:
    kmean = KMeans(n_clusters=ii,random_state = 1)
    kmean.fit(df1)
    # 计算iner
    iner.append(kmean.inertia_)
# 可视化类内误差平方和的变化情况
plt.figure(figsize = (10,6))
plt.plot(K,iner,"r-o")
plt.xlabel("聚类数目")
plt.ylabel("类内误差平方和")
plt.title("K-means聚类")
plt.annotate("转折点",xy=(3,iner[2]),xytext=(4,iner[2]+10),arrowprops=dict(facecolor='blue',shrink=0.1))
plt.savefig("游泳运动员体测数据聚类肘图")

肘点为3,聚成3类

# 使用K-means聚类将数据聚为3类
kmean = KMeans(n_clusters = 3,random_state = 1)
k_pre = kmean.fit_predict(df1)
print("每簇包含的样本数量:",np.unique(k_pre,return_counts = True))
print("每个簇的聚类中心为:\n",kmean.cluster_centers_)

第一聚类:聚类中心(124.5,20,44.5),两个点

第二聚类:聚类中心(121,17,41.7),三个点

第三聚类:聚类中心(121.2,18.6,43.6),五个点

# 聚类点
lis1=[]
lis2=[]
lis3=[]
for i in range(len(k_pre)):
    if k_pre[i] == 0:
        lis1.append(df.loc[i,"no"])
    if k_pre[i] == 1:
        lis2.append(df.loc[i,"no"])
    if k_pre[i] == 2:
        lis3.append(df.loc[i,"no"])
print("第一聚类的运动员编号: ",lis1)
print("第二聚类的运动员编号: ",lis2)
print("第三聚类的运动员编号: ",lis3)

colors = ["red", "blue", "green"]  
shapes = ["o", "s", "*"]  
fig = plt.figure(figsize=(15, 6))  
ax1 = fig.add_subplot(121, projection="3d")  
  
# 绘制数据点  
for ii, y in enumerate(k_pre):  
    ax1.scatter(df1.iloc[ii, 0], df1.iloc[ii, 1], df1.iloc[ii, 2],  
                s=40, c=colors[y], marker=shapes[y], alpha=0.5)  
  
# 绘制聚类中心,并连接各点到其簇中心  
unique_labels = np.unique(k_pre)  
for label in unique_labels:  
    center = kmean.cluster_centers_[label]  
    x, y, z = center  
    ax1.scatter(x, y, z, c="gray", marker="o", s=20)  # 绘制聚类中心点  
    ax1.text(x, y, z, f"簇{label+1}")  # 标注簇编号  
      
    # 找出属于当前簇的所有点,并绘制到簇中心的连线  
    cluster_points = df1[k_pre == label]  
    for index, point in cluster_points.iterrows():  
        ax1.plot([point[0], x], [point[1], y], [point[2], z], color=colors[label], linestyle='--')  
  
ax1.set_xlabel("特征1", rotation=20, size=13)  
ax1.set_ylabel("特征2", rotation=-20, size=13)  
ax1.set_zlabel("特征3", rotation=90, size=13)  
ax1.azim = 225  
ax1.set_title("K-means聚为3簇")  
plt.show()  # 显示图像  
plt.savefig("K-means聚类_带连线.png")  # 保存图像

标签:pre,ax1,set,means,df,流程,plt,聚类
From: https://blog.csdn.net/microlite/article/details/140498373

相关文章

  • Nacos(二)源码分析Nacos服务端注册示例流程
    上回我们讲解了客户端配置好nacos后,是如何进行注册到服务器的,那我们今天来讲解一下服务器端接收到注册实例请求后会做怎么样的处理。首先还是把博主画的源码分析图例发一下,让大家对整个流程有一个大概的理解:图示流程地址:https://www.processon.com/view/link/5f7e895......
  • 直播概念和流程框架(转载)
    1.直播初识热门直播产品:映客,斗鱼,熊猫,虎牙,花椒等等1.1一个完整直播app功能1.聊天私聊、聊天室、点亮、推送、黑名单等;2.礼物普通礼物、豪华礼物、红包、排行榜、第三方充值、内购、礼物动态更新、提现等;3.直播列表关注、热门、最新、分类直播用户列表等;4.自己直播录制、推......
  • 全基因组DNA甲基化测序数据工作流程分析和性能评估 分析软件比较 | 生信专区
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。DNA甲基化与转录调控、基因组印记、干细胞分化、胚胎发育和炎症等过程有关。DNA甲基化异常可能揭示疾病状态,包括癌症和神经系统疾病。因此,人类基因组中5-甲基胞嘧啶(5mC)分布和位点是一个重要的研究方向。全基因组重亚......
  • R包:DiagrammeR流程图
    介绍DiagrammeR依赖于图形描述语言Graphviz,可以通过R包igraph和visNetwork访问。DiagrammeR通过将有效的图规范以DOT语言的形式传递给grViz()函数来输出图。加载R包采用DiagrammeRR包,它提供了以下函数:使用create_graph()和render_graph()在节点和边的列表......
  • ruoyi-flow 是一个轻量、灵活的工作流引擎, 真正的国产工作流引擎 (非BPM)。 其特点简洁
    ruoyi-flow项目概述项目介绍ruoyi-flow是一个轻量、灵活的工作流引擎,真正的国产工作流引擎(非BPM)。其特点简洁轻量、独立组件、易扩展、易集成,且还拥有一个简洁美观的流程设计器。项目背景开源的流程引擎也好状态机引擎也好不可谓不多,他们的优点是功能很完备,缺点也是功能......
  • 【敏捷开发方法论】敏捷开发流程和工具实践
    敏捷开发方法论敏捷开发流程和工具实践目录敏捷开发简介敏捷开发的核心价值观和原则敏捷开发流程常见的敏捷开发框架敏捷开发工具敏捷开发的最佳实践实施敏捷开发的挑战及解决方案成功案例分析1.敏捷开发简介什么是敏捷开发敏捷开发是一种强调灵活性和响应性的现代......
  • 需求流程
    产品愿景目标用户:学校内专业、学院的羽毛球运动员、教练以及教师,用于管理羽毛球比赛积分和晋级信息。他们的需要或机会:提供一个方便的平台来记录和管理学校内羽毛球比赛数据,包括积分、排名以及教师的比赛晋级信息,以激励学生参与体育活动,促进羽毛球比赛的发展和提升。产品名称:......
  • openStack核心组件的工作流程
    目录openStack核心组件的工作流程1.Keystone1.1User1.2Credentials1.3Authentication1.4Token1.5Project1.6Service1.7Endpoint1.8Role1.9keystone综述2.glance2.1glance-api2.2glance-registry2.3backend2.4glance综述3.placement4.nova4.1nova-api4.2nova-s......
  • 乒乓球比赛计分系统需求流程
    计应222_杜晓瑾_2210502012乒乓球比赛计分系统需求流程1、产品愿景:我们的产品乒乓球比赛计分系统是为了解决乒乓球运动员、裁判、教练、爱好者、普通用户等人的问题,他们可以使用乒乓球计分器软件,在登录后可随时查看以往记录,进行对比,但是现有的计分器不能达到他们的需求。我们有......
  • 大概的开发流程
    计算机系统引导介绍前三步:硬件自己完成后两步:由自己编写第四步:bios会先检查硬盘第一个扇区(512字节)中是否有引导代码,(通过检查引导标志来确定,即第0扇区的最后两个字节);接着再将第一个扇区的内容加载到内存中,即把引导代码加载到内存中(暂不考虑磁盘分区的情况)整......