《机器学习实战》KMeans均值聚类算法

【机器学习】K均值聚类:从理论到实战深度解析 K均值聚类(K-Means Clustering)是最经典的无监督学习算法之一,以距离度量和迭代优化为核心,广泛应用于数据分组、模式发现等场景。 阅读详情

一、引言

聚类是一种无监督学习,对一些没有标签的数据进行分类。

二、K均值聚类算法

2.1 算法过程:

随机确定K个初始点为质心(簇个数k由用户给定),计算数据集中每个点到每个质心的距离

本次采用的是欧式距离,

然后将数据集中的每个点寻找距其最近的质心,分配到对应的簇中

完成后,每个簇的质心更新为该簇所有点的平均值。

进行迭代,直到相邻结果得到最终的质心误差在允许范围内。

2.2 对testSet.txt进行数据可视化:


2.3 聚类结果(K=4):+表示聚类中心点


2.4 后处理提高聚类性能

K是一个用户预先定义的参数,但我们并不清楚K的选择是否正确,也不知道这样生成的簇是否是最好的,如果有比较偏离的一小簇点,也会导致质心偏移,达不到好的聚类效果。
例如在书中10-2的图中,可以看出点的簇分类结果没有那么准确,原因是K均值算法收敛到了局部最小,而非全局最小值。
在包含簇分配结果的矩阵保存着每个点到簇质心的距离平方值,可以利用该值来评价聚类质量的方法。一类用于度量聚类效果的指标是SSE(误差平方和),对应我们在clusterAssment矩阵的第一列之和,SSE值越小表明数据点接近于他们的质心,聚类效果越好。

       图10-2

这里介绍一下误差平方和:
对象 误差的平方和表示为:
参数控制隶属度的影响.p的值越大,隶属度影响越大。
由于一个对象可能参与多个簇,所以用隶属度加权到簇中心的距离之和代表对象拟合聚类的程度。
簇 的SSE是:
聚类C的SSE的定义:,用来度量模糊聚类对数据集合的拟合程度

对图10-2的优化:

将具有最大SSE的簇划分为两个簇,实现时可以将最大簇包含的点过滤出来并在这些点上运行K均值算法,K=2。

为了保证簇的总数不变,可以将某两个簇进行合并。

对原图中即是,将两个出错的质心进行合并。

那么在多维空间中如何合并最近的质心呢?我们可以计算所有质心之间的距离,然后合并距离最近的两个点来实现,又或者合并两个簇后计算两次总SSE值,在所有簇上重复执行,知道找到合并最佳的两个簇。

2.3 K均值聚类主函数程序

def kMeans(dataSet, k, distMeas=distEclud,createCent=randCent):

    m= shape(dataSet)[0]

   clusterAssment = mat(zeros((m,2)))#create mat to assign data points 

  #存储每个点的簇分配结果(两列,存储簇索引值,存储误差(当前点到簇质心的距离))

  centroids = createCent(dataSet, k)

   clusterChanged = True   #标志变量,true就继续迭代

   while clusterChanged:

       clusterChanged = False

       for i in range(m):#for each data point assign it to the closest centroid

           minDist = inf; minIndex = -1

           for j in range(k):

                distJI =distMeas(centroids[j,:],dataSet[i,:])

                if distJI < minDist:

                    minDist = distJI; minIndex= j

           if clusterAssment[i,0] != minIndex: clusterChanged = True

           clusterAssment[i,:] = minIndex,minDist**2

       print(centroids)

       for cent in range(k):#recalculate centroids

           ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get allthe point in this cluster

           centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean

   return centroids, clusterAssment

三、二分K均值算法

3.1 算法原理

为了克服K均值收敛于局部最小值,二分K均值算法首先将所有点作为一个粗,然后将簇一分为二,之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分是否可以最大程度降低SSE的值,基于SSE的划分过程不断重复,直到得到用户指定的簇数目为止。

3.2 对testSet2.txt数据集进行测试


得到最终的质心结果:centList


画图:


得到较好的聚类效果。

3.3 实验代码

def biKmeans(dataSet, k,distMeas=distEclud):

    m= shape(dataSet)[0]

   clusterAssment = mat(zeros((m,2)))

    centroid0= mean(dataSet, axis=0).tolist()[0]

   centList =[centroid0] #create a list with one centroid

   for j in range(m):#calc initial Error

       clusterAssment[j,1] = distMeas(mat(centroid0), dataSet[j,:])**2

   while (len(centList) < k):

       lowestSSE = inf

       for i in range(len(centList)):

           ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A==i)[0],:]#getthe data points currently in cluster i

           centroidMat, splitClustAss = kMeans(ptsInCurrCluster, 2, distMeas)

           sseSplit = sum(splitClustAss[:,1])#compare the SSE to the currrentminimum

           sseNotSplit =sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1])

           print("sseSplit, and notSplit: ",sseSplit,sseNotSplit)

           if (sseSplit + sseNotSplit)< lowestSSE:

                bestCentToSplit = i

                bestNewCents = centroidMat

                bestClustAss =splitClustAss.copy()

                lowestSSE = sseSplit +sseNotSplit

       bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList)#change 1 to 3,4, or whatever

       bestClustAss[nonzero(bestClustAss[:,0].A == 0)[0],0] = bestCentToSplit

       print('the bestCentToSplit is: ',bestCentToSplit)

       print('the len of bestClustAss is: ', len(bestClustAss))

       centList[bestCentToSplit] = bestNewCents[0,:].tolist()[0]#replace acentroid with two best centroids

       centList.append(bestNewCents[1,:].tolist()[0])

       clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:]=bestClustAss#reassign new clusters, and SSE

   return mat(centList), clusterAssment

四、程序实例(对地图上的点聚类)

4.1 采用算法:二分K均值

    数据集:地图


4.2 使用Yahoo PlaceFinder API获得地图上的每个点的经纬度


4.3 实验结果


五、总结与体会

优点:容易实现

缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢

六、参考文献

【1】《机器学习实战》Peter Harrington

【2】《数据挖掘-概念与技术》JiaWei Han、Micheline Kamber、Jian Pei

非常感谢阅读!如有不足之处,请留下您的评价和问题。

datingTestSet2.txt 这是博客机器学习 & python 使用k-近邻算法改进约会网站的配对效果配套的文本文件 立即下载

相关推荐

UE5 Metahuman与Blender手动绑定:ARKit面部动画实战对比

面部动画是角色动画领域的核心技术,其核心原理在于通过驱动面部骨骼或混合形状来模拟真实肌肉运动,从而赋予数字角色生命力。这项技术的价值在于极大地提升了虚拟角色的表现力与沉浸感,广泛应用于游戏开发、影视制作、虚拟现实和实时交互应用。在技术实现路径上,开发者常面临工业化集成方案与高度自定义方案的选择。本文聚焦于使用行业标准的ARKit 52个面部混合形状数据,深度对比了虚幻引擎Metahuman的工业化流程与Blender手动绑定方案在视觉保真度、工作流效率、性能开销和扩展性上的差异,为不同项目规模与技术需求的团

weixin_33901926的博客 449

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

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

tttaeyang的博客 8853

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 943

09 机器学习 - Kmeans聚类算法案例

1. 需求 对给定的数据集进行聚类 本案例采用二维数据集,共80个样本,有4个类。样例如下(testSet.txt): 1.658985 4.285136 -3.453687 3.424321 4.838138 -1.151539 -5.379713 -3.362104 0.972564 2.924086 -3.567919 1.531611 0.450614 -3.3022...

阿甘兄 3228

Python+whisper/vosk实现语音识别

Whisper 是一个由 OpenAI 开发的人工智能语音识别模型,它能够将语音转换为文本。Whisper 模型特别之处在于它的设计目标是能够理解和转录多种语言的语音,包括但不限于英语。Whisper 模型在训练时使用了大量不同语言的语音数据,这使得它具有很好的跨语言能力。Vosk 是一个开源的语音识别库,它可以在离线环境下工作,不依赖于任何外部服务。Vosk 基于Kaldi语音识别框架,支持多种语言,包括中文。Vosk提供了多种预训练模型,可以根据需求选择适合的模型进行语音识别。

weixin_44458771的博客 5941

芯片散热技术突破:多尺度结构与VC集成方案解析

在半导体技术快速发展的背景下,芯片散热成为制约性能提升的关键瓶颈。传统散热技术如风冷和水冷已接近物理极限,而两相浸没式液冷技术凭借其超高传热系数成为新的解决方案。通过多尺度表面结构设计与真空腔均热板(Vapor Chamber)的集成创新,可以显著提升沸腾性能,降低沸腾起始温差(ONB)并突破临界热流密度(CHF)限制。这种技术在数据中心、高性能计算(HPC)和边缘计算等高热流密度场景中具有重要应用价值,能有效提升能效比(PUE)并降低能耗。

weixin_36288992的博客 153

实验五、k-均值聚类算法

聚类的类数已知,设 k=3。////////////////////定义存储结构////////////////////////////////////////////初始化质心/////////////////////////////////////////更新质心//////////////////////////////////////////////读入数据////////////////////////////////声明函数//////////////////////////////

Da1JueYv的博客 1692

声音编程(Voice Coding) Talon(一) 基本介绍与安装使用

语音编程平台简介 语音编程工具有哪些:Talon是一款声音编程平台,它追求的意义在于完全取代键盘和鼠标。。当前,全球有两个领先的语音编程平台(Programming-By-Speech Platforms)。一是Serenade,它的作用有点像数字助手,可以让你描述正在编程的命令,而不要求你必须逐字逐句地口述每条指令。另一个就是Talon,它提供了对每一行代码更精细的控制,这也意味着你需要对每一个被编入机器的任务有更细致的把握。具体的差别可以参考文章末尾的Serenade 和 Talon编程的例子。 除了这

yinglang19941010的专栏 4139

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

一、K-means聚类算法 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去。 1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,选择方法有两种一种就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好。另一种则是根据具体的需求确定,比如说进行衬衫尺寸的聚类你可能就会考虑分成三类...

. 2084

大红球预警版-精选+自定义板块监控

这是一款简单易用的股票大单资金监控插件,兼容通达信软件,可嵌入分时图或定制版面。它以红绿圆球直观显示主力买卖情况(红球为买,绿球为卖),支持300万以上大单语音播报。插件提供实时资金流向分析、多股同时监控、自定义预警条件等功能,无需L2账号。用户可自由切换图形/列表模式,监控特定板块,并配合幻影软件实现自动交易。虽然上涨股通常红球占优,但需结合其他指标综合判断。该插件完全免费,包含详细视频教程,适合新手使用。

guleba的博客 1794

『杭电1199』Color the Ball

Problem Description There are infinite balls in a line (numbered 1 2 3 ....), and initially all of them are paint black. Now Jim use a brush paint the balls, every time give two integers a b and follow by a char 'w' or 'b', 'w' denotes the ball from a to

漠宸离若的博客 497

K-均值聚类算法和二分K-均值算法

环境: jupyter python3.6.5 数据集:链接:https://pan.baidu.com/s/1pdRvuADFkt-7a9deV45-Sw 提取码:k3v2 准备工作 点击屏幕右上方的下载实验数据模块,选择下载kmeans_algo.tgz到指定目录下,然后再依次选择点击上方的File->Open->Upload,上传刚才下载的数据集压缩包,再使用如下命令解压: !tar -zxvf kmeans_algo.tgz 结果如下: kmeans_alg.

weixin_56273009的博客 1426

Docker:快速部署 Temporal 工作流引擎的技术指南

Temporal是一个开源的分布式工作流引擎,适用于复杂业务流程(如订单处理、支付流程等),提供状态持久化、自动重试、多语言SDK支持等特性。部署简单,支持Docker Compose,包含核心服务、Web UI及数据库。以TypeScript为例,开发者可快速编写工作流(如订单处理)和Worker,通过CLI或SDK启动和管理。Temporal简化了分布式系统的可靠性设计,适合电商、自动化任务等场景。

木头 641

《机器学习实战》kMeans算法(K均值聚类算法)

============================================================================================ 《机器学习实战》系列博客是博主阅读《机器学习实战》这本书的笔记,包含对其中算法的理解和算法的Python代码实现 另外博主这里有机器学习实战这本书的所有算法源代码和算法所用到的源文件,有需要的留言 ...

Thinkgamer博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《机器学习实战》二分-kMeans算法(二分K均值聚类)

===================================================================== 《机器学习实战》系列博客是博主阅读《机器学习实战》这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https...

Thinkgamer博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记关键字:k-均值、kMeans、聚类、非监督学习作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harrington)源码下载地址:https://www.manning.com/b...

weixin_30655569的博客 232

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

kmeans中的k的含义_机器学习实战项目- K-Means(K-均值)聚类算法

K-Means 算法聚类是一种无监督的学习, 它将相似的对象归到一个簇中, 将不相似对象归到不同簇中.相似这一概念取决于所选择的相似度计算方法.K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值 是因为它可以发现 K 个不同的簇, 且每个簇的中心采用簇中所含值的均值计算而成.簇个数 K 是用户指定的, 每一个簇通过其质心(centroid), 即簇中所有点的中心来描述...

weixin_35171603的博客 1350

code 10-2 中KMeans函数PAD图

sunjianqiang12345的博客 367

机器学习之聚类

给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。以空间中的K个点为中心进行聚类,对最靠近它们的对象归类,是聚类算法中最为基础也是最为重要的算法。机器学习的一种方法,没有给定事先标记过的训练示例,自动对输入的数据进行分类或分群。根据对象某些属性的相似度,将其自动划分为不同的类别。,该样本被划分为类1,因为在。,该样本被划分为类2,因为在。距离中,类1的样本最多。距离中,类2的样本最多。

2301_79226024的博客 451

kmeans聚类算法_kmeans原理及实现

聚类算法在实际工作中经常被使用,尤其是在数据规模较大的情况下,会先用kmeans做下聚类,分一下组。吴恩达 机器学习课程 中对kmeans讲的很清楚。K-均值是一个迭代算法,假设我们想要将数据聚类成n个组,其方法为:首先选择个随机的点,称为聚类中心(cluster centroids);对于数据集中的每一个数据,按照距离个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成...

weixin_39892481的博客 243

Kmeans聚类算法详解

摘要:本文通过图文详细介绍Kmeans聚类算法的原理和程序实现,以及如何选取类簇中心点。本文首先介绍利用该算法的原理及理解,详细介绍基于MATLAB设计一个自定义的Kmeans函数过程,然后利用该函数对UCI的数据集进行聚类以测试聚类结果。同时对Python及Java的编程实现作一个简单介绍,最后针对Kmeans的不足总结解决办法。后续章节将介绍的主要部分有: Kmeans算法的原理 Kmea...

思绪无限的博客 27万+

机器学习篇-聚类Kmeans算法

无监督学习算法,主要用于将相似的样本自动归到一个类别中;计算样本和样本之间的相似性,一般使用欧式距离误差平方和SSE (The sum of squares due to error)SSE 越小,表示数据点越接近它们的中心,聚类效果越好# @FileName : 03-顾客数据分析.pyimport os​os.environ["OMP_NUM_THREADS"] = '1' # 解决内存泄露警告​​。

m0_60916732的博客 1851

python机器学习手写算法系列——kmeans聚类

从机器学习到kmeans 聚类是一种非监督学习,他和监督学习里的分类有相似之处,两者都是把样本分布到不同的组里去。区别在于,分类分析是有标签的,聚类是没有标签的。或者说,分类是有y的,聚类是没有y的,只有X。所以,聚类只能根据X的特征本身,把样本分布到不同的组。 比如,我们有个成语,叫物以类聚,人以群分。我们可以把人分成男人和女人,这里分组的根据是人本身的属性-性别。而性别是知道的,而不需要用一...

juwikuang的专栏 9691
上一篇: 《机器学习实战》利用回归预测数值型数据的算法理解及程序调试
下一篇: 《机器学习实战》PCA简化数据
Enpiyahh
博客等级 码龄9年 55粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值