【数据挖掘】聚类算法学习—K-Means

K-Means

        K-Means是一种经典的无监督学习算法,用于将数据集划分为K个簇(clusters),使得同一簇内的数据点相似度高,不同簇间的相似度低。它在数据挖掘、模式识别和机器学习中广泛应用,如客户细分、图像压缩和异常检测。下面我将逐步介绍其核心原理、算法步骤、优缺点和应用场景。

要求:

        理解并掌握K-Means算法,理解算法的原理,能够实现算法,并对给定的数据集进行聚类

代码实现:

import numpy as np
import matplotlib.pyplot as plt
import random
#算法实现
class KMeans:def __init__(self, n_clusters=3, max_iter=300):self.n_clusters = n_clustersself.max_iter = max_iterself.centroids = Noneself.labels = Nonedef fit(self, X):#随机初始化质心indices = random.sample(range(len(X)), self.n_clusters)self.centroids = X[indices]for _ in range(self.max_iter):#分配样本到最近的质心distances = self._calc_distances(X)self.labels = np.argmin(distances, axis=1)#更新质心位置new_centroids = np.array([X[self.labels == k].mean(axis=0) for k in range(self.n_clusters)])#检查收敛if np.allclose(self.centroids, new_centroids):breakself.centroids = new_centroidsdef _calc_distances(self, X):return np.array([[np.linalg.norm(x - c) for c in self.centroids] for x in X])def predict(self, X):distances = self._calc_distances(X)return np.argmin(distances, axis=1)#数据加载函数
def load_data(file_path):data = []labels = []with open(file_path, 'r') as f:for line in f:values = line.strip().split(',')#提取前两个特征和标签data.append([float(values[0]), float(values[1])])labels.append(values[2])return np.array(data), np.array(labels)#评估函数(使用多数投票原则)
def evaluate_clustering(true_labels, pred_labels):#创建映射关系label_mapping = {}for cluster_id in set(pred_labels):cluster_samples = np.where(pred_labels == cluster_id)[0]cluster_labels = true_labels[cluster_samples]majority_label = max(set(cluster_labels), key=list(cluster_labels).count)label_mapping[cluster_id] = majority_label#计算准确率correct = 0for i in range(len(true_labels)):if label_mapping[pred_labels[i]] == true_labels[i]:correct += 1return correct / len(true_labels), label_mappingif __name__ == "__main__":#加载数据file_path = "D:/课程/数据挖掘/实验六/实验6-iris-聚类.txt"X, true_labels = load_data(file_path)#创建K-Means实例并训练kmeans = KMeans(n_clusters=3)kmeans.fit(X)#预测聚类标签pred_labels = kmeans.labels#评估聚类结果accuracy, mapping = evaluate_clustering(true_labels, pred_labels)print(f"聚类准确率: {accuracy:.2%}")print("聚类标签映射关系:")for cluster_id, species in mapping.items():print(f"聚类{cluster_id} -> {species}")plt.figure(figsize=(12, 5))plt.subplot(121)colors = {'Iris-setosa': 'red', 'Iris-versicolor': 'green', 'Iris-virginica': 'blue'}for species in np.unique(true_labels):plt.scatter(X[true_labels == species, 0], X[true_labels == species, 1], label=species,c=colors[species],alpha=0.6)plt.title('真实标签分布')plt.xlabel('花萼长度')plt.ylabel('花萼宽度')plt.legend()#聚类结果分布plt.subplot(122)for cluster_id in range(3):plt.scatter(X[pred_labels == cluster_id, 0], X[pred_labels == cluster_id, 1], label=f'聚类{cluster_id}',alpha=0.6)#标记质心位置plt.scatter(kmeans.centroids[:, 0], kmeans.centroids[:, 1], marker='X', s=200, c='black', label='质心')plt.title('K-Means聚类结果')plt.xlabel('花萼长度')plt.ylabel('花萼宽度')plt.legend()plt.tight_layout()plt.savefig('kmeans_clustering_result.png')plt.show()

运行结果:

左图为真实的标签分布,右图为K-Means的聚类结果

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

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

相关文章

linux环境内存满php-fpm

检查 PHP-FPM 配置 pm.max_children:该参数控制 PHP-FPM 进程池中最大允许的子进程数。过高的子进程数会导致内存占用过大。你可以根据服务器的内存大小来调整 pm.start_servers:控制 PHP-FPM 启动时创建的进程数。根据实际情况调整此值。 pm.min_spare_…

基于CNN卷积神经网络图像识别小程序9部合集

基于CNN卷积神经网络图像识别小程序合集-视频介绍下自取 ​ 内容包括: 基于python深度学习的水果或其他物体识别小程序 003基于python深度学习的水果或其他物体识别小程序_哔哩哔哩_bilibili 代码使用的是python环境pytorch深度学习框架,代码的环境安…

WebRTC(九):JitterBuffer

JitterBuffer Jitter “Jitter”指的是连续到达的媒体包之间时间间隔的变化。在网络传输中,由于: 网络拥塞路由路径变化队列排队不同链路带宽差异 导致包之间的接收时间不一致,这就是网络“抖动”。 作用 **JitterBuffer(抖…

【推荐100个unity插件】在 Unity 中绘制 3D 常春藤,模拟生长——hedera插件的使用

注意:考虑到后续接触的插件会越来越多,我将插件相关的内容单独分开,并全部整合放在【推荐100个unity插件】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 效果演示 文章目录 效果演示前言一、常春藤生成器工具下载二、工具使用1、…

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换前言模型变换(Model Transformation)观测变换(Viewing Transformation)视图变换(View Transformation)投影…

EXISTS 和 NOT EXISTS 、IN (和 NOT IN)

在 SQL 中,EXISTS、NOT EXISTS 和 IN 都是用于子查询的条件运算符,用于根据子查询的结果过滤主查询的行。它们之间的区别主要体现在工作方式、效率、对 NULL 值的处理以及适用场景上。 1. EXISTS 和 NOT EXISTS 作用: EXISTS: 检查子查询是…

GitHub 趋势日报 (2025年06月25日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 880 awesome 788 build-your-own-x 691 free-for-dev 427 best-of-ml-python 404 …

互联网大厂Java求职面试:Java虚拟线程实战

互联网大厂Java求职面试:Java虚拟线程实战 文章内容 开篇:技术总监与程序员郑薪苦的三轮对话 在一场紧张而严肃的Java工程师面试中,技术总监张工正对候选人郑薪苦进行深入提问。郑薪苦虽然性格幽默,但对技术有着扎实的理解。今天…

网络安全的两大威胁:XSS与CSRF攻击实例解析

在网络攻击中,XSS跨站脚本攻击(Cross Site Scripting)与CSRF跨站请求伪造攻击(Cross-Site Request Forgery)是两种常见的攻击方式,它们之间存在显著的区别。以下是对这两种攻击方式的详细比较: 一、攻击原理 XSS跨站脚本攻击 攻击者通过在Web页面中注入恶意脚本来实现攻…

如何一次性将 iPhone 中的联系人转移到 PC

许多重要的联系人都存储在您的 iPhone 上。为了保护关键信息,您可能需要将联系人从 iPhone 转移到 PC,这是一种有效的联系人备份方法。如果您在将 iPhone 联系人转移到电脑上遇到困难,现在可以从本文中学习 5 个有效的解决方案,然…

Spring Boot开启定时任务的三种方式 【@EnableScheduling注解,SchedulingConfigurer接口,Quartz 框架】

Spring Boot 开启定时任务的三种方式​ ​ ​ 在 Spring Boot 应用开发过程中,定时任务是十分常见的需求,比如定时清理日志文件、定期备份数据库数据、定时发送邮件提醒等。Spring Boot 提供了多种开启定时任务的方式,本文将详细介绍三种常见…

LLM 编码器 怎么实现语义相关的 Token 向量更贴近? mask训练:上下文存在 ;; 自回归训练:只有上文,生成模型

LLM 编码器 怎么实现语义相关的 Token 向量更贴近? 目录 LLM 编码器 怎么实现语义相关的 Token 向量更贴近?mask训练:上下文存在自回归训练:只有上文,生成模型一、核心机制:损失函数与反向传播的“语义校准”1. 损失函数的“语义约束”2. 嵌入层参数的“动态调整”二、关…

从OCR瓶颈到结构化理解来有效提升RAG的效果

当人们探讨如何让人工智能系统更好地从文档中查找和使用信息时,通常关注的是令人瞩目的算法和前沿的大型语言模型。但问题是:如果文本提取的质量很差,那么后续的努力都将付诸东流。本文探讨OCR质量如何影响检索增强生成(RAG&#…

SpringBoot -- 整合Junit

11.SpringBoot 整合 Junit 11.1 为什么需要单元测试 由于在SpringBoot开发过程中,每开发一个模块,有时需要从 controller、service、mapper 到甚至 xml 文件的编写全部开发完毕才能进行测试,这是十分浪费时间的,比如开发人员想测…

虚拟机远程连接编译部署QT程序

概要 逻辑 我们需要凑齐 QT库、交叉编译工具、sysroot这三大件。 交叉编译的程序是部署到板卡环境运行,需要构建和板卡一样的库环境。 sysroot是我们在虚拟机上自己命名的一个文件夹,包含开发板的运行系统所需的所有文件。 虚拟机是x64版本,开发板是arm64版本。 如果开发板…

基于SpringBoot的智慧旅游系统

以智慧旅游系统的设计与实现为研究对象,旨在通过科技手段提升旅游业的管理效能和游客体验。在系统设计方面,深入分析了地理特征、丰富的文化底蕴以及多样的自然景观。结合这些独特之处,构建了一个多层次的旅游管理系统,包括景点信…

下载最新版本的OpenOCD

Download OpenOCD for Windowsd: https://gnutoolchains.com/arm-eabi/openocd/

Geollama 辅助笔记:raw_to_prompt_strings_geo.py

1 GeoLifePreprocessingDF 1.1 创造函数 1.2 读取原始数据 读取这个DataFrame 1.3 处理原始DataFrame 1.4 生成对应prompt 1.5 打乱轨迹 1.6 打乱轨迹里面的事件

TDengine 如何打破工业实时数据库势力边界?

打破工业实时数据库势力边界,TDengine 时序数据库与工业 SCADA 深度融合 随着 时序数据库(Time Series Database)的日益普及,越来越多的工业自动化控制(工控)人员开始认识到其强大能力。然而,时…

渗透靶场:事件和属性被阻止的反射xss

本关很多标签被拦截了&#xff0c;需要使用 burp 模糊测试哪个标签可以用 <a>和<animate>可以使用&#xff0c;<animate>是<svg>标签中用来给动画设定属性的&#xff0c;看看<svg>可不可用 利用<svg>、<animate>、<a>来构造 这…