聚类及Python下实现 K-means 算法

ops/2024/12/12 21:48:05/

聚类

聚类是无监督学习中的一种重要方法,旨在将数据集中相似的数据对象划分到同一个簇中,使得不同簇之间的数据对象差异尽可能大。在大数据环境下,聚类可以帮助挖掘数据中的隐藏结构和模式,应用场景十分广泛,比如在客户细分领域,根据客户的消费行为、年龄、地域等特征进行聚类,能将客户分为不同群体,方便企业制定针对性的营销策略;在图像识别中,可以依据图像的特征(如颜色、纹理等)聚类来进行图像分类等。

常见的聚类算法除了下面要详细说的 K-means 之外,还有层次聚类(如凝聚式层次聚类、分裂式层次聚类等,通过不断合并或拆分簇来构建聚类层次结构)、密度聚类(例如 DBSCAN 算法,基于数据点的密度来确定簇,能发现任意形状的簇并且能识别出数据集中的噪声点)等。

K-means 算法及其实现

K-means 是一种非常经典且应用广泛的聚类算法,它的核心思想比较简单直观:

  1. 步骤概述

    • 初始化:首先确定要划分的簇的数量 k,然后从数据集中随机选择 k 个数据点作为初始的聚类中心(也可以采用其他初始化方法来提高聚类效果,比如 K-means++ 初始化,尽量让初始聚类中心相互之间距离较远)。
    • 分配数据点到簇:对于数据集中的每个数据点,计算它与各个聚类中心的距离(通常采用欧几里得距离等度量方式),然后将该数据点分配到距离它最近的那个聚类中心所在的簇中。
    • 更新聚类中心:当所有数据点都被分配到相应的簇后,重新计算每个簇的中心位置(比如对于数值型数据,簇中心通常是簇内所有数据点对应维度的均值)。
    • 迭代:重复上述分配数据点和更新聚类中心的步骤,直到聚类中心不再发生明显变化(可以通过设置一个收敛阈值,比如前后两次迭代聚类中心的位置变化小于某个值时,就认为算法收敛)或者达到预设的最大迭代次数为止。
  2. Python 实现示例
    以下是 Python 代码实现 K-means 算法(使用 Python 的 numpy 库来进行数值计算),这里假设输入数据是一个二维的数值型数据集(可以方便可视化展示聚类效果,实际应用中可以处理多维数据):

python">import numpy as npdef euclidean_distance(point1, point2):"""计算两点之间的欧几里得距离"""return np.sqrt(np.sum((point1 - point2) ** 2))def k_means(data, k, max_iterations=100, tolerance=1e-4):"""K-means聚类算法实现参数:data (numpy.ndarray): 输入的数据集,形状为 (样本数, 特征数)k (int): 要划分的簇的数量max_iterations (int, 可选): 最大迭代次数,默认为100tolerance (float, 可选): 收敛阈值,默认为1e-4返回:centroids (numpy.ndarray): 最终的聚类中心,形状为 (k, 特征数)labels (numpy.ndarray): 每个数据点所属的簇的标签,形状为 (样本数,)"""# 随机选择k个初始聚类中心indices = np.random.choice(len(data), k, replace=False)centroids = data[indices]for _ in range(max_iterations):# 存储每个数据点所属的簇的标签labels = np.zeros(len(data), dtype=int)# 分配数据点到簇for i, point in enumerate(data):distances = [euclidean_distance(point, centroid) for centroid in centroids]labels[i] = np.argmin(distances)# 更新聚类中心new_centroids = np.array([data[labels == j].mean(axis=0) for j in range(k)])# 检查聚类中心是否收敛if np.all(np.abs(new_centroids - centroids) < tolerance):breakcentroids = new_centroidsreturn centroids, labels

 调用这个函数进行测试,数据为随机生成的二维数据点

python"># 生成示例数据
np.random.seed(0)
data = np.random.rand(100, 2)# 设置簇的数量
k = 3# 运行K-means算法
centroids, labels = k_means(data, k)# 简单打印聚类结果(可以进一步可视化展示等)
print("聚类中心:", centroids)
print("数据点所属簇的标签:", labels)

  K-means 算法有助于深入理解聚类的基本原理以及相关的距离计算、迭代优化等操作,但在实际应用中,为了更高效和方便地使用聚类功能,也可以直接调用一些成熟的机器学习库(如 scikit-learn 库中已经实现好且经过优化的 K-means 算法类)。

关于在写作过程中原创与使用AI的声明

本手稿的作者声明,在本作品的写作过程中,我们使用AI只包含:生成式AI图片/视频为了提高文章的观赏性、使用AI编辑器提升文章的可读性和精炼语言、修订程序过程中出现的错误以及添加标准化说明。这种使用是在严格的人为监督和控制下进行的。在应用AI技术后,作者对稿件进行了仔细的审查和编辑,以确保稿件的原创性、准确性和连贯性。

作者理解AI产生的内容可能是不正确的、不完整的或有偏见的。考虑到这一点,作者确保所有AI编辑器修订过的手稿以及语句最后经过了人类的眼睛和判断并彻底作者本人人工修改与校订,以符合人类的阅读习惯。所生成文本遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明,学术使用本文必须按期刊规定标注本文出处,翻用必究。

根据CSDN的原创政策,作者确认没有AI或AI辅助技术被列为本文的作者或合著者。作者完全理解,作者身份带来的责任和任务只能归因于人类并由人类执行,作者在准备本文时遵守了这些指导方针。

参考资料:

K均值(K-means)聚类算法(Python3实现代码)_聚类_helloWorld-GitCode 开源社区

K-means聚类算法原理及python实现_机器学习_杨Zz.-百度飞桨星河社区


http://www.ppmy.cn/ops/141351.html

相关文章

PyCharm文件、临时文件、目录、文件夹(Directory)、软件包(Package)的区别

首先是目录(Directory&#xff09;文件夹是一样的&#xff0c;只是叫法不一样 软件包它是一个包含多个模块&#xff08;.py文件&#xff09;的目录&#xff0c;并且这个目录中必须包含一个特殊的文件__init__.py 从功能角度看&#xff0c;软件包提供了一种命名空间的机制。这意…

CPP项目推荐:协程库项目

星球里的协程库项目正式做了第二版更新&#xff1a; 更新后的协程库项目代码开源的Github上&#xff1a;https://github.com/youngyangyang04/coroutine-lib 大家可以自己学习&#xff0c;也欢迎star、fork 目前知识星球里已经更新 6个CPP项目、2个Java项目、两个前端、一个G…

Spring Boot性能提升:实战案例分析

引言 随着微服务架构的流行&#xff0c;Spring Boot因其轻量级和快速开发周期而受到开发者的青睐。然而&#xff0c;随着应用规模的增大和复杂度的提升&#xff0c;如何优化Spring Boot应用的性能成为了开发者关注的焦点。本文将从实战案例出发&#xff0c;探讨Spring Boot性能…

Spring Boot日志:从Logger到@Slf4j的探秘

写在前面 Hello大家好&#xff0c;今日是2024年的第一天&#xff0c;祝大家元旦快乐?? 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用&#xff1f;三、日志怎么用&#xff1f;四、自定义日志打印 ?? 常见日志框架说明4.1 在程序中得到?志对象【…

Redisson分布式锁

官方文档&#xff1a;Redisson参考指南 分布式锁案例 RLock lock redissonClient.getLock("test_lock"); lock.lock(); try {log.info("lock success");Thread.sleep(10000); } catch (InterruptedException e) {e.printStackTrace(); } finally {lock.u…

蓝桥杯刷题日记01-握手问题

问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 5050 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 77 个人&#xff0c;这 77 人彼此之间没有进行握手 (但这 77 人与…

K 个一组翻转链表&什么是纯虚函数?什么是抽象类?纯虚函数和抽象类在面向对象编程中的意义是什么?

K 个一组翻转链表 25. K 个一组翻转链表 1.好理解的方法&#xff1a; 1 2 3 4 5 要得到 2 1 4 3 5 应该先得到 4 3 2 1 5 再得到 2 1 4 3 5 首先反转要反转的部分链表 然后根据给定的k值分组 每组的头结点和尾节点成pair存入数组中 然后反转pair数组 连接无需反转的部分&…

用Go语言重写Linux系统命令 -- nc简化版

用Go语言重写Linux系统命令 – nc简化版 1. 引言 netcat&#xff0c;简称 nc&#xff0c;被誉为网络工具中的“瑞士军刀”&#xff0c;是网络调试与分析的利器。它的功能十分强大&#xff0c;然而平时我们经常使用的就是他的连通性测试功能&#xff0c;但是nc是被设计用来测试…