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

【数据挖掘】聚类算法学习—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.lqws.cn/news/565615.html

相关文章:

  • Windows 4625日志类别解析:未成功的账户登录事件
  • 节点小宝:告别公网IP,重塑你的远程连接体验
  • 数据库 DML 语句详解:语法与注意事项
  • Android大图加载优化:BitmapRegionDecoder深度解析与实战
  • 【分布式 ID】生成唯一 ID 的几种方式
  • 面试150 螺旋矩阵
  • 模拟工作队列 - 华为OD机试真题(JavaScript卷)
  • llama.cpp学习笔记:后端加载
  • Windows系统安装鸿蒙模拟器
  • 接口自动化测试(Python+pytest+PyMySQL+Jenkins)
  • OpenLayers 全屏控件介绍
  • Wpf布局之StackPanel!
  • Mac电脑手动安装原版Stable Diffusion,开启本地API调用生成图片
  • 在Mac上查找并删除Java 21.0.5
  • 【Canvas与标志】圆规脚足球俱乐部标志
  • Spring Cloud Gateway 实战:从网关搭建到过滤器与跨域解决方案
  • 浮油 - 3 相分层和自由表面流 CFX 模拟
  • 医疗AI智能基础设施构建:向量数据库矩阵化建设流程分析
  • js 基础
  • PCB工艺学习与总结-20250628
  • JVM——垃圾回收
  • Kafka4.0初体验
  • 系统架构设计师备考之架构设计专业知识
  • 软考 系统架构设计师系列知识点之杂项集萃(100)
  • TCP/UDP协议深度解析(三):TCP流量控制的魔法—滑动窗口、拥塞控制与ACK的智慧
  • Cursor 教程:用 Cursor 创建第一个 Java 项目
  • Webpack 中的 Loader 和 Plugin 全面详解
  • 全新大模型开源,腾讯(int4能打DeepSeek) Vs 谷歌(2GB运行多模态)
  • 【GESP 四级】一个程序掌握大部分知识点
  • 学习使用dotnet-dump工具分析.net内存转储文件(3)