K-Means聚类分析以及误差平方和SSE(Python实现)

news/2024/11/14 19:51:05/文章来源:https://www.cnblogs.com/h4o3/p/18546633

代码介绍

使用 make_blobs 函数生成一个二维的随机数据集,包含120个样本和3个中心。生成的数据将用于后续的聚类分析。
数据生成后,通过散点图可视化这些点,展示不同的聚类中心。

定义了一个函数 calculate_sse,用于计算给定聚类数 k 时的误差平方和(SSE)。该函数使用K-Means算法进行聚类,并返回聚类后的SSE值。

# 导入必要的库
import numpy as np  # 用于数值计算
import matplotlib.pyplot as plt  # 用于数据可视化
from sklearn.datasets import make_blobs  # 用于生成聚类数据
from sklearn.cluster import KMeans  # 用于K-Means聚类算法# 1. 生成数据
X, y_true = make_blobs(n_samples=120, n_features=2, centers=3, random_state=42)  # 生成120个样本,2个特征,3个聚类中心# 可视化生成的数据
# 设置matplotlib的字体为中文和负号的显示
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 使绘图时中文正确显示
plt.rcParams["axes.unicode_minus"] = False  # 使绘图时负号正确显示
plt.scatter(X[:, 0], X[:, 1], s=30)  # 绘制散点图
plt.title("初始数据")  # 图表标题
plt.xlabel("特征 1")  # x轴标签
plt.ylabel("特征 2")  # y轴标签
plt.show()  # 显示图形# 2. 定义计算SSE的函数
def calculate_sse(X, k):kmeans = KMeans(n_clusters=k, random_state=42)  # 初始化K-Means算法,指定聚类数量kkmeans.fit(X)  # 进行聚类sse = kmeans.inertia_  # 获取聚类的误差平方和(SSE)return sse  # 返回SSE值# 3. 执行聚类并记录SSE
sse_list = []  # 初始化一个列表用于存储不同K值的SSE
k_values = range(1, 11)  # 定义K的范围,从1到10
n_trials = 5  # 每个K值进行5次实验以降低随机性影响for k in k_values:  # 遍历每一个K值sse_trials = []  # 记录每个K值的SSE试验结果for _ in range(n_trials):  # 进行n_trials次实验sse = calculate_sse(X, k)  # 计算当前K值下的SSEsse_trials.append(sse)  # 将结果保存到列表avg_sse = np.mean(sse_trials)  # 计算当前K值的平均SSEsse_list.append(avg_sse)  # 将平均SSE保存到sse_list中# 4. 输出K值与平均SSE关系数据
print("K值与平均SSE关系:")  # 打印说明
for k, sse in zip(k_values, sse_list):  # 遍历K值及其对应的平均SSEprint(f"K = {k}, 平均 SSE = {sse:.2f}")  # 格式化输出K值及其对应的平均SSE# 将输出保存到文件
with open("sse_results.txt", "w") as file:  # 打开文件以写入file.write("K值与平均SSE关系:\n")  # 写入文件标题for k, sse in zip(k_values, sse_list):  # 遍历K值及其对应的平均SSEfile.write(f"K = {k}, 平均 SSE = {sse:.2f}\n")  # 保存K值和平均SSE到文件中print("SSE数据已保存到 sse_results.txt 文件中")  # 输出保存成功的提示信息# 5. 绘制K值与平均SSE关系图
plt.plot(k_values, sse_list, marker='o')  # 绘制K值与平均SSE的折线图,并使用圆点标记
plt.title("平均SSE vs 簇数量(K)")  # 图表标题
plt.xlabel("簇个数(K)")  # x轴标签
plt.ylabel("平均 SSE")  # y轴标签
plt.xticks(k_values)  # 设置x轴刻度
plt.grid()  # 添加网格
plt.show()  # 显示图形# 6. 使用最佳K值重新进行聚类并可视化结果
best_k = 3  # 假设最优的K值为3
kmeans = KMeans(n_clusters=best_k, random_state=42)  # 初始化K-Means算法
y_kmeans = kmeans.fit_predict(X)  # 进行聚类并返回每个样本的聚类标签# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=30, cmap='viridis')  # 绘制聚类结果的散点图,颜色代表不同聚类
centers = kmeans.cluster_centers_  # 获取聚类中心
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')  # 绘制聚类中心
plt.title(f"K={best_k}的K- means聚类")  # 图表标题
plt.xlabel("特征 1")  # x轴标签
plt.ylabel("特征 2")  # y轴标签
plt.show()  # 显示聚类结果图

为了确定最佳的聚类数量K,代码计算从1到10的不同K值对应的平均SSE。每个K值重复进行5次实验,以减少随机性对结果的影响。
计算好的平均SSE值被存储在一个列表中,并最终输出至控制台以显示K值与SSE的关系。

将K值与平均SSE的关系写入到一个文本文件中,方便后续查看和分析。
使用折线图将K值与对应的平均SSE可视化,直观展示聚类数量对聚类效果的影响。

由图得出最佳的K值为3,重新使用K-Means算法进行聚类,并可视化聚类结果。每个聚类用不同的颜色标记,并且绘制出聚类中心,以便清晰了解聚类的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生如何赋能智慧能源?揭秘技术背后的核心价值

随着能源行业不断向智能化、数字化转型,数字孪生技术在智慧能源项目中扮演的角色愈发重要。数字孪生不仅带来了前所未有的资源优化和成本节约方式,还为整个能源系统的可持续运营奠定了坚实基础。那么,为什么数字孪生技术在智慧能源项目中如此不可或缺?下面我就从可视化从业…

激活函数

一、正向传播和反向传播在模型训练过程中,是同时包含正向传播和反向传播的正向传播是模型根据输入数据和当前的参数(权重和偏置)计算预测输出的过程。例如,在一个图像分类神经网络模型中,输入是图像的像素数据,经过多个隐藏层的计算,最终在输出层得到预测的类别概率分布…

centOS7 docker 安装步骤

一、安装前检查工作: 1.检查/etc/yum.repos.d/CentOS-Base.repo文件是否存在,如果不存在,从网络仓库中复制一份新的 CentOS-Base.repo 文件。 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 或者使用 wget: sudo wget -O /…

k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储

目录docker registry 部署生成 htpasswd 文件生成 secret 文件生成 registry 配置文件创建 service创建 statefulset创建 ingress验证 docker registrydocker registry 监控docker registry uidocker registry dockerfile docker registry 配置文件 S3 storage driver registry…

[68] (炼石计划) NOIP 模拟赛 #20

学了一个挺帅的 MerMaid 所以用一下 flowchart TBA(邻间的骰子之舞)style A color:#ffffff,fill:#00c0c0,stroke:#ffffff 考虑每次复制以后一定会粘贴若干次(大于零,否则没有意义),因此将复制粘贴捆绑起来考虑,设复制后连续粘贴了 \(m\) 次,则代价为 \(x+my\),贡献为让编…

团队项目Scrum冲刺-day4

一、每天举行站立式会议 站立式会议照片一张昨天已完成的工作成员 任务陈国金 用户模块接口开发凌枫 整合MD编辑器陈卓恒 完成管理题目页面谭立业 完成题目搜索页面廖俊龙 接口测试曾平凡 前端页面测试曾俊涛 完成题目模块接口开发薛秋昊 完成题目提交模块接口开发今天计划完成…

【闲话】先觉

题图太大了,遂放到里面了能 窥探 到未来的 命运 又怎样? 不愿向 命运 屈服,自以为一次次地“战胜” 命运 后却不知一切都是 命运 早就 安排 好的。亦或是他即是 命运 的代理人。 不久后的 毁灭 已成为他的梦魇,面对好友的一个个离去他 无能为力 ,只好请求 那位大人 伸出援…

团队作业4——项目冲刺-4

团队作业4——项目冲刺-4信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 在七天敏捷冲刺中,完成工大严选开发,记录每日进展和问题,更新燃尽图、签入代码,并发布集合日志总结成果GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗…

MX 2025--炼石计划 NOIP 模拟赛 #20

斥责打得抽象。T3,T4放俩难的板子。由于是MX的题,就不放题意了。 邻间的骰子之舞 发现复制操作不会超过\(64\)次,而粘贴操作肯定是越均匀越好,直接二分暴力跑就行了。点此查看代码 #include<bits/stdc++.h> using namespace std; #define rep(i,s,t,p) for(int i = s;…

EBS:物料搬运单查看人限制(创建人栏位)

EBS:物料搬运单查看人限制(创建人栏位)Applies to:Oracle Inventory Management - Version: 11.5.9 to 12.0.0 - Release: 11.5 to 12.2Information in this document applies to any platform.FORM:INVTOMAI.FMB - Response CenterSymptomsIn the Move Orders form (INVTOMA…

实景三维赋能智慧公安建设

在新型智慧城市建设的大潮中,智慧公安作为关键一环,对于提高城市安全和治理效率具有重要意义。实景三维技术以其独特的优势,为智慧公安建设提供了强有力的支撑。本文将探讨实景三维技术如何赋能智慧公安建设。一、智慧公安建设的重要性智慧公安是利用现代信息技术,实现对城…

OpenAI模型whisper 音频转文本

最近有一个音频转文本的需求,了解到了OpenAI的whisper模型可以实现。 Whisper 是 OpenAI 提供的一个通用语音识别模型,支持多语言的音频转文本功能,并具有较高的准确性。它的主要用途包括自动语音识别 (ASR)、语言翻译(将音频直接翻译成英文文本)等。Whisper 支持将长时间…