【机器学习】十大算法之一 “K-means”

news2024/12/25 8:58:14

 

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?type=blog个人简介:打工人。

持续分享:机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。

如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com 

        机器学习是一种能够让计算机在不接收显式编程的情况下自主学习的技术。在机器学习的各种算法中,k-means算法是一种常见的聚类算法,它可以将一组数据分成多个不同的类别,并且属于同一类别的数据彼此之间具有高度的相似性。

本文将详细讲解机器学习十大算法之一 “K-means” 


目录

一、简介

二、发展史

Lloyd的k-means算法的初始版本可以被描述如下:

三、算法原理详解

k-means算法是一个迭代聚类算法,主要包括以下几个步骤:

具体算法流程:

下面我们依次对以上几个步骤进行解析。

        1. 初始聚类中心

        2. 分配到最近聚类中心

        3. 重新计算聚类中心

        4. 重复聚类过程

四、算法功能详解

五、示例代码

        1. 安装相关库

        2. 分布讲解

        3. 完整代码

六、总结 

        k-means算法的优点:

        k-means算法的缺点:


一、简介

        k-means算法早在1957年就被发明了,最早由J. MacQueen提出 。后来,Lloyd(1982年)、Hartigan(1975年)、Forgy(1965年)等学者对此算法进行了修正和改进。这个算法已被广泛应用于数据挖掘、模式识别、图像处理等领域,它可以用来识别数据集之间的模式,因此是一种十分实用的机器学习算法。

二、发展史

        k-means算法是基于传统的聚类分析技术而发展起来的。聚类分析在早期主要应用于社会学、心理学和生物学等领域,用来发现自然类或发现结果变量。

        k-means算法的思想具有很强的几何直觉,最早是由Lloyd于1957年提出,并用于电话网络分割应用,它的主要思想是通过迭代方法将数据聚成k个类别,每个类别由一个中心点表示。

Lloyd的k-means算法的初始版本可以被描述如下:

  1. 随机选择k个点,作为初始的k个聚类的中心。

  2. 将每个点分配到距离最近的聚类中心所代表的聚类。

  3. 针对每个聚类重新计算聚类中的所有点的平均值,作为新的聚类中心。

  4. 重复步骤2和3,直到聚类中心不再发生变化或者是经过了预定的迭代次数。

        在Lloyd算法之后,Hartigan和Wong提出了两个改进的k-means算法,分别是k-means++和k-medoids。

        k-means++算法的主要思想是在选择初始点时尽可能的均匀分布整个数据集。在k-medoids算法中,每个聚类的中心不是由聚类内的所有点的平均值计算而成,而是由聚类内的某个代表点计算而成,这个代表点也称为medoids。

        现在,k-means算法已经成为了一种十分流行地聚类算法,也被广泛应用于各个领域。

三、算法原理详解

k-means算法是一个迭代聚类算法,主要包括以下几个步骤:

  1. 随机选择k个数据点作为初始聚类中心。

  2. 对于剩下未被选择的数据点,将其与k个聚类中心距离找到最接近的那个,并将其加入该聚类。

  3. 根据新的数据点的加入更新聚类中心。

  4. 重复上述过程,直至聚类中心不再发生变化为止或达到预设的迭代次数。

        简而言之,k-means算法通过最小化所有数据点到其所属聚类中心的距离平方和(SSE),来不断迭代更新聚类中心以达到聚类效果。

具体算法流程:

  1. 随机选择k个数据点作为初始聚类中心。

  2. 对每个数据点,都计算其到全部k个聚类中心的距离。然后将该数据点分配给距离最近的那个聚类中心所代表的聚类。

  3. 针对每个聚类重新计算聚类中的所有点的平均值,作为新的聚类中心。

  4. 重复步骤2和3,直到聚类中心不再发生变化或者是经过了预定的迭代次数。

下面我们依次对以上几个步骤进行解析。

        1. 初始聚类中心

        为了开始聚类过程,我们需要先指定k(即要将数据集聚类成k个类别)。然后从数据集中随机选择k个数据点作为初始聚类中心。

        2. 分配到最近聚类中心

        接下来的步骤是将其它数据点和初始的聚类中心进行比较,然后将它们分配到它们离得最近的聚类中心所代表的聚类。这个过程通常被称为“簇的分配”。

        该过程可以由以下的式子来计算。

        其中,xi​ 代表第i个数据点, cj​ 代表第j个聚类中心。

        下面详细解析:

        对于数据集中的一个数据点xi​,计算其到聚类中心cj​的欧氏距离:

        其中,n是每个数据点的特征数量。

        数据点xi​被分配给距离最近的聚类中心cj​所代表的聚类,即xi​被分配到聚类j中去。

        3. 重新计算聚类中心

        将数据点分配给聚类之后,我们需要重新计算每个聚类中的所有点的平均值,作为新的聚类中心。这个过程是一个迭代过程,对于每个聚类都要执行一次。

        给定聚类j及其所有数据点的集合S={x1​,x2​,......,x∣S∣​},新的聚类中心cj​可以计算为:

        其中,|S|是聚类的大小,表示其包含的数据点的数量。 

        4. 重复聚类过程

        聚类过程完成后,需要检查聚类的中心是否发生了改变。如果任意一个聚类的中心发生了改变,那么我们需要重新执行分配数据点和重新计算聚类中心的过程。

        聚类过程需要重复执行以上的步骤,直至聚类中心不再发生变化或者是达到预设的迭代次数。

四、算法功能详解

        k-means算法的主要功能是实现数据点的聚类,用来将数据集划分成k个不同的类别。它的应用领域非常广泛,比如人脸识别、数据挖掘、社交网络分析等。

        在具体的应用过程中,k-means算法的结果可以:

  1. 帮助研究者发现不同观察或实验对象之间的相似性和不同之处。

  2. 帮助企业分析用户行为,提升销售和服务质量。

  3. 通过对大规模数据的聚类,从数据中提取出有用的信息,为业务决策提供依据。

  4. 将项目中的应用程序划分成不同的类别,便于维护和支持。

五、示例代码

        为了演示k-means算法的应用,我们针对一个简单的数据集进行聚类分析。

        在这个示例中,我们使用Python的scikit-learn库来实现k-means算法。这个库已经内置了众多的机器学习算法,包括k-means算法。

        1. 安装相关库

pip install matplotlib

pip install -U scikit-learn

        2. 分布讲解

        首先,我们需要导入一些必要的库并加载数据。在这个示例中,我们使用sklearn库中的make_blobs函数来生成带有标签的聚类数据。

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 生成带有标签的聚类数据
X, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=10)

        接下来,我们将数据可视化,颜色代表每个数据点所属的聚类。 

# 可视化数据集,颜色代表聚类标签
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.5)
plt.title('Original Data')
plt.show()

        我们可以看到,数据呈现簇状分布,我们需要将其聚成4类。

        然后,我们使用KMeans类中的fit_predict方法来执行k-means算法。

# 执行k-means算法
kmeans = KMeans(n_clusters=4, init='random', max_iter=100, n_init=1)
y_pred = kmeans.fit_predict(X)

        在这里,我们指定要将数据聚成4个类别。max_iter代表每次迭代的最大次数。n_init代表KMeans类执行k-means算法的次数。每次迭代之后,我们可以通过使用KMeans类中的cluster_centers_属性,来获取每个类别的中心。 

# 获取聚类中心
centroids = kmeans.cluster_centers_
# 可视化聚类结果,颜色代表聚类标签
plt.scatter(X[:, 0], X[:, 1], c=y_pred, alpha=0.5)
# 可视化聚类中心
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=100)
plt.title('K-means Clustering Result')
plt.show()

        最后,我们可以看到,k-means算法成功将数据点聚成了4类,并将每个类别的中心用红色标出。 

        3. 完整代码

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 生成带有标签的聚类数据
X, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=10)
# 可视化数据集,颜色代表聚类标签
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.5)
plt.title('Original Data')
plt.show()

# 执行k-means算法
kmeans = KMeans(n_clusters=4, init='random', max_iter=100, n_init=1)
y_pred = kmeans.fit_predict(X)

# 获取聚类中心
centroids = kmeans.cluster_centers_
# 可视化聚类结果,颜色代表聚类标签
plt.scatter(X[:, 0], X[:, 1], c=y_pred, alpha=0.5)
# 可视化聚类中心
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=100)
plt.title('K-means Clustering Result')
plt.show()

六、总结 

        本篇文章介绍了k-means算法,一种常见的聚类算法。我们详细讲解了该算法的发展史、原理、功能以及示例代码。在应用中,k-means算法一般用于数据聚类和模式识别,可以帮助我们从数据中提取出有用的信息,为业务决策提供依据。

        为了更好地应用k-means算法,我们需要了解它的优点和缺点。

        k-means算法的优点:

  1. 算法简单,易于实现;

  2. 可以处理非常大的数据集;

  3. 可以应用于各种领域,有很广泛的应用。

        k-means算法的缺点:

  1. 需要人为指定k;

  2. 对于初始聚类中心的选择,很敏感;

  3. 对于非凸形数据集聚类效果不好;

  4. 迭代次数及聚类中心的选择都会影响算法的运行速度。

        尽管k-means算法有一些缺点,但它在实际应用中表现出色。因此,我们需要理解其原理、功能和使用方法,以便更好地应用它。

 

 

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

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

相关文章

第六章 彩色图像处理

第六章 彩色图像处理 6.1彩色基础 颜色特性: 亮度:表达了无色的强度概念色调:光波混合中与波长有关的属性(即颜色)饱和度:即相对纯净度,或一种颜色混合白光的数量。饱和度与所加白光成反比 …

tf卡和sd卡引脚定义和性能指标

sd卡和tf卡的引脚定义和引脚对应关系,见下图 tf卡的性能 选择tf卡时,我们主要是考虑下边几个性能,这几个性能一般都是可以直接看内存卡看出来的。 注:只介绍通过卡的标识来判断性能,卡的真假自己识别,不考…

踩坑笔记 Spring websocket并发发送消息异常

文章目录 示例代码WebSocketConfig配置代码握手拦截器代码业务处理器代码 问题复现原因分析解决方案方案一 加锁同步发送方案二 使用ConcurrentWebSocketSessionDecorator方案三 自研事件驱动队列(借鉴 Tomcat) 总结 今天刚刚经历了一个坑,非…

Linux系统基础知识与自学方法

大部分非计算机相关的朋友也经常使用电脑,所以我们频繁接触的是Windows系统。关于这个系统的评价不一,一部分人觉得简洁快捷,一部分人觉得问题(病毒、弹窗)多多,总之对Windows系统系统的评价参差不齐&#…

案例精述 | FortiEDR双活终端安全方案护航金融多云多分支场景

金融行业多云、多分支等特点,在数字化时代迎来更多安全挑战。尤其在勒索软件等威胁猖獗的大背景下,“安全运营”理念要求金融企业不仅要对威胁攻击“知其然”,还要“知其所以然”。因此,某金融企业希望提升端点安全防护&#xff0…

样本文件的使用方法以及注意事项

经常使用CHS零壹视频系列的朋友们应该对“样本文件”不陌生,在各种案例中我们也强烈建议在视频扫描时加载样本文件,而在视频修复时则样本文件成了必选项。今天我们来聊聊样本文件的作用和使用要求。 什么是样本文件? 从数据恢复广义的角度讲…

分布式文件系统HDFS

分布式文件系统HDFS 分布式文件系统计算机集群结构分布式文件系统的结构分布式文件系统的设计需求 HDFS简介HDFS相关概念块HDFS总体框架HDFS Client名称节点和数据节点名称节点数据节点 第二名称节点HDFS存在的问题 HDFS体系结构HDFS体系结构概述HDFS命名空间管理通信协议客户端…

Python高级系列教程:Python的进程和线程

学习目标 1、了解多任务的概念 2、了解进程的概念以及多进程的作用 3、掌握多进程完成多任务的工作原理及案例编写 4、掌握进程编号的获取方式以及进程使用的注意事项 5、了解线程的概念以及多线程的作用 6、掌握多进程完成多任务的工作原理及案例编写 一、多任务的概念 …

微服务 springcloud 05 hystrix框架,降级,可视化Hystrix dashboard 仪表盘,熔断

01.微服务宕机时,ribbon 无法转发请求 关闭 user-service 和 order-service 02.hystrix框架 03.创建hystrix项目,hystrix与ribbon经常一起出现 第一步:复制 sp06-ribbon 项目,命名为sp07-hystrix 选择 sp06-ribbon 项目&#…

一个Java程序员的C++学习之路

最近接到了一个Windows客户端开发,需要用到C,由于大学嵌入式学习的时候用到了这种东西,虽然没忘记吧,但是还是打算用一周的时间复习一下,下面是我的复习笔记,当然了,也是基于尚硅谷和黑马的笔记…

NLP——Ethics伦理

文章目录 Core NLP ethics conceptsbiasprivacy Group discussionAutomatic Prison Term PredictionAutomatic CV ProcessingLanguage Community Classification Core NLP ethics concepts 自然语言处理(NLP)的伦理问题是一个日益重要的领域&#xff0c…

007、体系架构之PD

PD PD架构主要功能路由功能 TSO分配TSO概念分配过程时间窗口同步过程 调度总流程信息收集调度的实现调度需求生成调度执行调度调度的基本操作调度的策略 lablelabel与高可用label的配置 PD架构 PD:有高可用和强一致性。 也有leader。使用奇数的节点数量。它需要存储…

10 分钟理解微服务、容器和 Kubernetes及其关系

什么是微服务? 什么是微服务?你应该使用微服务吗?微服务与容器和 Kubernetes 有什么关系?如果这些事情在您的日常生活中不断出现,并且您需要在 10 分钟内进行概述,那么这篇博文适合您。 从根本上讲&#x…

小红书企业号限流原因有哪些,限流因素

作为企业、品牌在小红书都有官方账号,很多人将注册小红书企业号看作是获取品牌宣推“特权”的必行之举。事实真的如此吗,那为什么小红书企业号限流频发,小红书企业号限流原因有哪些,限流因素。 一、小红书企业号限流真的存在吗 首…

SpringBoot中Redis的基础使用

基础使用 首先引入依赖 <!-- redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>redis.clients</g…

中断处理流程以及程序状态寄存器CPSR的本质

文章目录 前言一、当前程序状态寄存器&#xff08;CPSR&#xff09;二、异常的分类2.1 7个异常源2.2 异常的优先级2.3 为什么FIQ比IRQ快&#xff1f;2.4 异常与工作模式的区别 三、异常的处理流程3.1 异常处理机制3.2 进入异常处理流程&#xff1a;3.3 退出异常的处理流程&…

送给蓝初小萌新系列(1)——Linux入侵排查

一、linux系统资源 1、linux被入侵的症状 linux系统资源用户和日志文件和命令篡改启动项和定时任务挖矿脚本分析 2、linux系统资源 2.1、CPU内存磁盘 top -c -o %CPU:查看cpu占用情况&#xff08;按cpu排序&#xff09; top -c -o %MEM:查看内存占用情况&#xff08;按内存…

兼容性测试如何提高网站的可用性?

兼容性测试如何提高网站的可用性? 在现代社会&#xff0c;网站已经成为了人们获取信息、进行交流的主要渠道之一。但是&#xff0c;在网站的设计和开发中&#xff0c;往往会存在兼容性问题&#xff0c;导致不同浏览器或设备的用户无法顺利地访问和使用网站&#xff0c;降低了网…

华为OD机试之最长连续子序列(Java源码)

最长连续子序列 题目描述 有N个正整数组成的一个序列。给定整数sum&#xff0c;求长度最长的连续子序列&#xff0c;使他们的和等于sum&#xff0c;返回此子序列的长度&#xff0c; 如果没有满足要求的序列&#xff0c;返回-1。 输入描述 第一行输入是&#xff1a;N个正整数…

【Spring 核心 | IoC】

IoC IoC 简介定义&#xff1a;IoC 和 DIBeanIoC 容器Ioc IoC容器 IoC 简介 定义&#xff1a; IoC即控制反转&#xff08;Inversion of Control&#xff0c;缩写为 IoC&#xff09;。IoC又称为依赖倒置原则&#xff08;设计模式六大原则之一&#xff09;。 IoC意味着将你设计好…