K-Means聚类算法原理

k-means聚类算法原理简析 k-means聚类算法原理简介概要算法思想算法流程图解代码实现 概要 K-means算法是最普及的聚类算法,也是一个比较简单的聚类算法,所以刚接触的同学不要感到害怕。算法接受一个未标记的数据集,然后将数据聚类成不同的组,同时,k-means算法也是一种无监督学习。 算法思想 k-means算法的思想比较简单,假设我们要把数据分成K个类,大概可以分为以下几个步骤: 随机选取k个点,作为聚类中心; ... 阅读详情

本文以 刘建平:《K-Means聚类算法原理》为主体,并在其中加入了大量其他来源和自己的内容,以此帮助读者对K-Means算法有一个更清晰的了解。



K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体方法。包括初始化优化K-Means++, 距离计算优化elkan K-Means算法和大数据情况下的优化Mini Batch K-Means算法。

1. K-Means原理初探

    K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

    如果用数据表达式表示,假设簇划分之间的随机数为 (C1,C2,...Ck) ,则我们的目标是最小化平方误差E:


    其中 μ i 是簇 C i 的均值向量,有时也称为质心,表达式为:


如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的迭代方法。K-Means采用的启发式方式很简单,用下面一组图就可以形象的描述。

上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图4所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。当然在实际K-Mean算法中,我们一般会多次运行图c和图d,才能达到最终的比较优的类别。

读者可以通过下面这个动态图来形象的了解算法的实现过程


2. 传统K-Means算法流程

    在上一节我们对K-Means的原理做了初步的探讨,这里我们对K-Means的算法做一个总结。

    首先我们看看K-Means算法的一些要点。

    1)对于K-Means算法,首先要注意的是k值的选择,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什么先验知识,则可以通过交叉验证选择一个合适的k值。

    2)在确定了k的个数后,我们需要选择k个初始化的质心,就像上图b中的随机质心。由于我们是启发式方法,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心,最好这些质心不能太近。

    好了,现在我们来总结下传统的K-Means算法流程。 

    输入是样本集 D={x1,x2,...xm} ,聚类的簇树k,最大迭代次数N

    输出是簇划分 C={C1,C2,...Ck}  

    1) 从数据集D中随机选择k个样本作为初始的k个质心向量:  {μ1,μ2,...,μk}

    2)对于n=1,2,...,N

      a) 将簇划分C初始化为 Ct=∅t=1,2...k

      b) 对于i=1,2...m,计算样本 xi 和各个质心向量 μj(j=1,2,...k) 的距离: dij=||xi−μj||22 ,将 xi 标记最小的为 dij 所对应的类别 λi 。此时更新


      c) 对于j=1,2,...,k,对 Cj 中所有的样本点重新计算新的质心


      e) 如果所有的k个质心向量都没有发生变化,则转到步骤3)

    3) 输出簇划分 C={C1,C2,...Ck}

3. K-Means初始化优化K-Means++

在上节我们提到,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心。如果仅仅是完全随机的选择,有可能导致算法收敛很慢。K-Means++算法就是对K-Means随机初始化质心的方法的优化。

关于这里,原作者博客写的有点儿含糊,网上有几篇博客写的不是很清楚,这里把他们总结在一起,特别对有问题的地方用红色字体解释和说明:

 k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。wiki上对该算法的描述是如下:

1,从输入的数据点集合中随机选择一个点作为第一个聚类中心
2,对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
3,选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
4,重复2和3直到k个聚类中心被选出来
5,利用这k个初始的聚类中心来运行标准的k-means算法

  从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:

1,先从我们的数据库随机挑个随机点当“种子点”
2,对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
3,然后,再取一个随机值,用权重的方式来取下一个“种子点”。
这个算法的实现是:先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到,Random<=0( 注意,这个式子的意思是:在刚才保存的那个数组里,我们从头开始遍历每一个元素的D(x),直到减掉的Random小于0,此时停止),此时的点就是下一个“种子点”。
4,重复2和3直到k个聚类中心被选出来
5,利用这k个初始的聚类中心来运行标准的k-means算法

可以看到算法的第三步选取新中心的方法,这样就能保证距离D(x)较大的点,会被选出来作为聚类中心了。至于为什么原因很简单,如下图 所示:  

                                                

 假设A、B、C、D的D(x)如上图所示,当算法取值Sum(D(x))*random(原作者博客里这样写是因为在编程语言中,random函数产生的是0-1之间的 随机数,所以他用Sum(D(x))*random来表示随机生成一个位于[0-Sum(D(x))]之间的随机数),该值会以较大的概率落入D(x)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。

4. K-Means距离计算优化elkan K-Means

在传统的K-Means算法中,我们在每轮迭代时,要计算所有的样本点到所有的质心的距离,这样会比较的耗时。那么,对于距离的计算有没有能够简化的地方呢?elkan K-Means算法就是从这块入手加以改进。它的目标是减少不必要的距离的计算。那么哪些距离不需要计算呢?elkan K-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。

第一种规律是对于一个样本点x和两个质心μj1,μj2。如果我们预先计算出了这两个质心之间的距离D(j1,j2),则如果计算发现2D(x,j1)≤D(j1,j2),我们立即就可以知道

D(x,j1)≤D(x,j2) 。此时我们不需要再计算 D(x,j2) ,也就是说省了一步距离计算。

    第二种规律是对于一个样本点 x x和两个质心 μj1,μj2 。我们可以得到 D(x,j2)≥max{0,D(x,j1)−D(j1,j2)} 这个从三角形的性质也很容易得到。

利用上边的两个规律,elkan K-Means比起传统的K-Means迭代速度有很大的提高。但是如果我们的样本的特征是稀疏的,有缺失值的话,这个方法就不使用了,此时某些距离无法计算,则不能使用该算法。

5. 大样本优化Mini Batch K-Means

    在传统的K-Means算法中,要计算所有的样本点到所有的质心的距离。如果样本量非常大,比如达到10万以上,特征有100以上,此时用传统的K-Means算法非常的耗时,就算加上elkan K-Means优化也依旧。在大数据时代,这样的场景越来越多。此时Mini Batch K-Means应运而生。

    顾名思义,Mini Batch,也就是用样本集中的一部分的样本来做传统的K-Means,这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。

    在Mini Batch K-Means中,我们会选择一个合适的批样本大小batch size,我们仅仅用batch size个样本来做K-Means聚类。那么这batch size个样本怎么来的?一般是通过无放回的随机采样得到的。

    为了增加算法的准确性,我们一般会多跑几次Mini Batch K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。

6. K-Means(K-近邻学习)与KNN(k-近邻估计)

初学者很容易把K-Means和KNN搞混,两者其实差别还是很大的。

K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。

当然,两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。

7. K-Means小结

    K-Means是个简单实用的聚类算法,这里对K-Means的优缺点做一个总结。

    K-Means的主要优点有:

    1)原理比较简单,实现也是很容易,收敛速度快。

    2)聚类效果较优。

    3)算法的可解释度比较强。

    4)主要需要调参的参数仅仅是簇数k。

    K-Means的主要缺点有:

    1)K值的选取不好把握

    2)对于不是凸的数据集比较难收敛

    3)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。

    4) 采用迭代方法,得到的结果只是局部最优。

    5) 对噪音和异常点比较的敏感。




用java实现K-means算法,k-means聚类算法原理 阅读详情

相关推荐

K-means聚类算法的原理、应用与实例

K-means聚类算法的原理、应用与实例

qqrrjj2011的博客 8193

elkan K-Means

在传统的K-Means算法中,我们在每轮迭代时,要计算所有的样本点到所有的质心的距离,这样会比较的耗时。elkan K-Means算法就是从这块入手加以改进。它的目标是减少不必要的距离的计算。elkan K-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。第一种规律是对于一个样本点x和两个质心μj1,μj2。如果我们预先计算出了这两个质心之间的距离D(...

zrh_优快云的博客 4866

数据挖掘十大算法(二):K-means聚类算法原理与实现

参考:1.机器学习-KMeans聚类 K值以及初始类簇中心点的选取2.K-Means算法的研究分析及改进一、K-means算法原理K-means算法是最常用的一种聚类算法。算法的输入为一个样本集(或者称为点集),通过该算法可以将样本进行聚类,具有相似特征的样本聚为一类。针对每个点,计算这个点距离所有中心点最近的那个中心点,然后将这个点归为这个中心点代表的簇。一次迭代结束之后,针对每个簇类,重新计算...

tensory的博客 7万+

KMeans 可视化:利用图形展示聚类结果

1.背景介绍 K-Means 是一种常用的无监督学习算法,主要用于聚类分析。在大数据时代,K-Means 算法在各个领域得到了广泛应用,例如图像处理、文本摘要、推荐系统等。然而,K-Means 算法的输出结果是一组数据点的聚类,这些结果往往是非常复杂且难以直观地理解。因此,在进行数据分析和可视化时,我们需要一种方法来将 K-Means 的聚类结果以图形的形式展示出来,以便更好地理解和分析这些结果...

AI天才研究院 3798

K-Means聚类算法原理及实现

由于个人理解有限,难免有错误之处,欢迎指正。 k-means 聚类算法原理:     1、从包含多个数据点的数据集 D 中随机取 k 个点,作为 k 个簇的各自的中心。     2、分别计算剩下的点到 k 个簇中心的相异度,将这些元素分别划归到相异度最低的簇。两个点之间的相异度大小采用欧氏距离公式衡量,对于两个点 T0(x1,y2)和 T1(x2,y2),T0 和 T1 之间的欧氏距离为

Abner 1万+

【机器学习-14】K-means聚类算法:原理、应用与优化

在众多聚类算法中,K-means算法因其简单高效而备受青睐。K-means算法的基本思想是:通过迭代的方式,将数据划分为K个不同的簇,并使得每个数据点与其所属簇的质心(或称为中心点、均值点)之间的距离之和最小。具体来说,K-means算法的执行过程通常包括以下几个步骤:首先,随机选择K个数据点作为初始的簇质心;然后,根据每个数据点与各个簇质心的距离,将其分配给最近的簇;接着,重新计算每个簇的质心,即取簇内所有数据点的平均值作为新的质心;

qq_38614074的博客 10万+

机器学习算法之K-means(K均值聚类)算法

聚类 聚类,简单来说,就是将一个庞杂数据集中具有相似特征的数据自动归类到一起,称为一个簇,簇内的对象越相似,聚类的效果越好。它是一种无监督的学习(Unsupervised Learning)方法,不需要预先标注好的训练集。聚类与分类最大的区别就是分类的目标事先已知,例如猫狗识别,你在分类之前已经预先知道要将它分为猫、狗两个种类;而在你聚类之前,你对你的目标是未知的,同样以动物为例,对于一个动物集来...

tttaeyang的博客 8853

基于单片机的自动喷淋系统设计【毕业设计】

随着人民生活质量提高与生活节奏的加快,城市居民对于花草绿植的家庭培养与装饰需求增加,随之因浇灌植物的需要,智能浇花系统的市场逐渐扩大。现有自动浇花系统大部分只能通过设置固定浇水时间而难以实现适时、适量浇水,或在植物环境土壤含水量低时进行报警而并不能实际补水。为克服局限性而设计以单片机为控制中心的自动浇花系统。通过湿度传感器检测目标植物环境土壤湿度数据,再经ADCO832将其放大转换为数字量,由单片机读取输出向LCD1602 显示屏显示并通过比对键盘向单片机所设置的湿度范围而利用中断服务程序进行补水需求判断。

qq_48771816的博客 1711

K-Means聚类算法

什么是聚类分析聚类分析是数据挖掘中一个重要概念,其核心是寻找数据对象中隐藏的有价值的信息,根据相似性原则,把具有较高相似度的数据对象划分到同一类簇,把具有较高相异度的数据对象划分到不同类簇,从而使相同组中的数据点之间比其他组中的数据点更具有相似性。聚类算法典型的聚类算法分为三个阶段,主要包括特征选择和特征提取、数据对象间相似度计算以及根据相似度将数据对象分组。聚类算法可以分为两大类:层次聚类算法和划分聚类算法。层次聚类算法通过不同类别间的数据对象的相似度试图构建一个高层次的嵌套聚类树结构,聚类树的构建有两种

软件工程小施同学 的专栏 6万+

手把手教你用ObjectCRX进行Caxa二次开发:从零开始的环境搭建教程

本文是一份面向零基础初学者的Caxa二次开发实战指南,重点讲解如何使用ObjectCRX框架从零开始搭建开发环境。内容涵盖Visual Studio 2015版本锁定、ObjectCRX向导集成、项目创建、典型错误解决,并最终实现一个可在Caxa中运行的HelloWorld程序,帮助开发者快速入门并避开常见陷阱。

w3x4y的博客 512

MMORPG网络游戏开发之任务系统的架构与设计

在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。...

voidinit的专栏 3049

【海量数据挖掘/数据分析】之 K-Means 算法(K-Means算法、K-Means 中心值计算、K-Means 距离计算公式、K-Means 算法迭代步骤、K-Means算法实例)

① 给定条件 :给定数据集 X , 该数据集有 n 个样本;将其分成 K 个聚类;③ 聚类分组要求 :每个聚类分组中 , 所有的数据样本 , 与该分组的中心点的距离之和最小;将每个样本的与中心点距离计算出来 , 分组中的这些距离累加 , K 个分组的距离之和 也累加起来 , 总的距离最小;①设置中心点 :设置了 3 个初始中心点 , A1​(2,4) 对应聚类 1 中心点 , B1​(5,8) 对应聚类 2 中心点 , C1​(6,2) 对应聚类 3 中心点;②计算中心点距离。

仙魁XAN 3万+

从2804云台电机到桌面机械臂:一个STM32/GD32玩家的FOC驱动踩坑全记录

本文详细记录了从2804云台电机到桌面机械臂的FOC驱动开发历程,涵盖了硬件选型、驱动方案优化、软件调试等关键环节。特别分享了L6234P驱动芯片的发热问题、AS5600编码器的I2C通信陷阱以及PID调参的实战经验,为DIY爱好者提供了宝贵的参考。

weixin_26897585的博客 482

K-means聚类算法原理及python实现

文章目录一.聚类算法二.K-means聚类算法三.K-means算法步骤详解Step1.K值的选择Step2.距离度量2.1.欧式距离2.2.曼哈顿距离2.3.余弦相似度Step3.新质心的计算Step4.是否停止K-means四.K-means算法代码实现1.其伪代码如下2.python实现五.K-means算法补充六.小结 一.聚类算法     &nbs...

Flaneur-yz的博客 26万+

论文翻译:Automatic Lesson Plan Generation via Large Language Models with Self-critique Prompting

在本文中,我们利用大型语言模型(LLMs)的理解和生成能力来自动生成定制化的课程计划。这解决了传统计划可能无法充分满足不同教学环境和学生群体的特定需求的常见挑战。我们提出了一个新颖的三阶段过程,包括使用检索增强生成(RAG)逐步生成课程计划的每个关键组成部分,通过LLMs进行自我批评,以及随后的细化。我们使用这种方法为小学2至5年级生成了涵盖80多个主题的数学课程计划。邀请了三位经验丰富的教育工作者制定全面的课程计划评估标准,然后使用这些标准将我们的LLM生成的课程计划与同一主题的实际课程计划进行基准比较。

CSPhD-winston的博客 1101

PCB铺铜技巧如何铺铜经验总结

铺铜是指在PCB电气层添加整块的铜皮;铺铜包括电源层铺铜,地层铺铜和信号走线层空闲区域铺铜;铺铜是PCB设计的一个重要的环节。

fydar的博客 1万+

聚类算法之K-Means算法原理及实现

聚类算法K-Means算法原理及实现

RuiMa的博客 3953

从一只龙虾到一支团队:OpenClaw 单 Bot 多 Agent 配置实践

单 Bot 多 Agent只有一个对外的聊天入口(飞书 Bot)内部有多个独立的 AI Agent,各司其职主 Agent(总指挥)负责接收任务并分配给子 Agent子 Agent 完成任务后将结果返回给主 Agent角色Agent ID职责使用场景🎯 总指挥main-agent统筹协调,任务分发接收所有用户请求✍️ 笔杆子内容创作公众号、博客、小红书🔬 参谋canmou深度研究竞品分析、市场调研📋 运营官operations运营管理邮件、日历、社交媒体。

Maynor的博客 1081

【机器学习】—— K-means聚类算法原理详解 以及 二维、三维数据的K-means聚类Python实现

文章目录一、K-Means聚类算法原理过程1.1 K-means聚类的一些细节1.1.1 样本x(i)x^{(i)}x(i)与中心点μkμ_kμk​距离的衡量1.1.2 K-means聚类算法的应用场合1.1.3 K-means聚类算法的优化目标1.1.4 随机初始化的要点1.1.5 类的数量K的选取二、二维,三维数据K-means算法的Python实现 一、K-Means聚类算法原理过程 K-m...

凝望,划过星空的博客 2万+

openclaw中文版安装教程和常用命令

OpenClaw 中文版的和,涵盖本地一键部署、Docker 隔离部署、阿里云极速部署三种方式,以及六大类高频命令,方便你快速上手和日常运维。

suny8的专栏 2998

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

自然语言处理系列五十四》文本聚类算法》K-means文本聚类算法原理

【配套新书教材】《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】新书特色:本书从自然语言处理基础开始,逐步深入各种NLP热点前沿技术,使用了Java和Python两门语言精心编排了大量代码实例,契合公司实际工作场景技能,侧重实战。

weixin_52610848的博客 1684

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

k-means聚类算法原理与参数调优详解

https://www.toutiao.com/a6690435044869145101/ k-means算法原理 K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,直到质心不再改变,最终就确定了每个样...

喜欢打酱油的老鸟 4万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

K-means聚类算法原理及c++实现

聚类是指根据数据本身的特征对数据进行分类,不需要人工标注,是无监督学习的一种。k-means算法是聚类算法中最简单的算法之一。 k-means 算法将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。 基于这样一个假设,我们再来导出k-means所要优...

qq_40692109的博客 4556
上一篇: python线程、进程与协程
下一篇: 用scikit-learn学习K-Means聚类
相国大人
博客等级 码龄10年 1009粉丝 132原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值