K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

news2024/2/27 15:33:22


原文:http://www.cnblogs.com/yixuan-xu/p/6272208.html

K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

  一、概述

      在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATA和Kernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别。

      首先需要明确的是上述四种算法都属于"硬聚类”算法,即数据集中每一个样本都是被100%确定得分到某一个类别中。与之相对的"软聚类”可以理解为每个样本是以一定的概率被分到某一个类别中。

      先简要阐述下上述四种算法之间的关系,已经了解过经典K-means算法的读者应该会有所体会。没有了解过K-means的读者可以先看下面的经典K-means算法介绍再回来看这部分。

     (1) K-means与K-means++:原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。在选取第一个聚类中心(n=1)时同样通过随机的方法。可以说这也符合我们的直觉:聚类中心当然是互相离得越远越好。这个改进虽然直观简单,但是却非常得有效。

      (2) K-means与ISODATA:ISODATA的全称是迭代自组织数据分析法。在K-means中,K的值需要预先人为地确定,并且在整个算法过程中无法更改。而当遇到高维度、海量的数据集时,人们往往很难准确地估计出K的大小。ISODATA就是针对这个问题进行了改进,它的思想也很直观:当属于某个类别的样本数过少时把这个类别去除,当属于某个类别的样本数过多、分散程度较大时把这个类别分为两个子类别。

      (3) K-means与Kernel K-means:传统K-means采用欧式距离进行样本间的相似度度量,显然并不是所有的数据集都适用于这种度量方式。参照支持向量机中核函数的思想,将所有样本映射到另外一个特征空间中再进行聚类,就有可能改善聚类效果。本文不对Kernel K-means进行详细介绍。

      可以看到,上述三种针对K-means的改进分别是从不同的角度出发的,因此都非常具有代表意义。目前应用广泛的应该还是K-means++算法(例如2016年底的NIPS上也有针对K-means++的改进,感兴趣的读者可以进一步学习)。

 

二、经典K-means算法

    算法描述如下,非常清晰易懂。经典K-means算法应该是每个无监督学习教程开头都会讲的内容,故不再多费口舌说一遍了。

图1图1. 经典K-means算法

 

      值得一提的是关于聚类中心数目(K值)的选取,的确存在一种可行的方法,叫做Elbow Method:通过绘制K-means代价函数与聚类数目K的关系图,选取直线拐点处的K值作为最佳的聚类中心数目。但在这边不做过多的介绍,因为上述方法中的拐点在实际情况中是很少出现的。比较提倡的做法还是从实际问题出发,人工指定比较合理的K值,通过多次随机初始化聚类中心选取比较满意的结果。

 

三、K-means++算法

      2007年由D. Arthur等人提出的K-means++针对图1中的第一步做了改进。可以直观地将这改进理解成这K个初始聚类中心相互之间应该分得越开越好。整个算法的描述如下图所示:

图2

    图2. K-means++算法

      下面结合一个简单的例子说明K-means++是如何选取初始聚类中心的。数据集中共有8个样本,分布以及对应序号如下图所示:

demo图3. K-means++示例

      假设经过图2的步骤一后6号点被选择为第一个初始聚类中心,那在进行步骤二时每个样本的D(x)和被选择为第二个聚类中心的概率如下表所示:

图3

    其中的P(x)就是每个样本被选为下一个聚类中心的概率。最后一行的Sum是概率P(x)的累加和,用于轮盘法选择出第二个聚类中心。方法是随机产生出一个0~1之间的随机数,判断它属于哪个区间,那么该区间对应的序号就是被选择出来的第二个聚类中心了。例如1号点的区间为[0,0.2),2号点的区间为[0.2, 0.525)。

      从上表可以直观的看到第二个初始聚类中心是1号,2号,3号,4号中的一个的概率为0.9。而这4个点正好是离第一个初始聚类中心6号点较远的四个点。这也验证了K-means的改进思想:即离当前已有聚类中心较远的点有更大的概率被选为下一个聚类中心。可以看到,该例的K值取2是比较合适的。当K值大于2时,每个样本会有多个距离,需要取最小的那个距离作为D(x)

 

四、ISODATA算法

     放在最后也是最复杂的就是ISODATA算法。正如之前所述,K-means和K-means++的聚类中心数K是固定不变的。而ISODATA算法在运行过程中能够根据各个类别的实际情况进行两种操作来调整聚类中心数K:(1)分裂操作,对应着增加聚类中心数;(2)合并操作,对应着减少聚类中心数。

    下面首先给出ISODATA算法的输入(输入的数据和迭代次数不再单独介绍):

      [1] 预期的聚类中心数目Ko:虽然在ISODATA运行过程中聚类中心数目是可变的,但还是需要由用户指定一个参考标准。事实上,该算法的聚类中心数目变动范围也由Ko决定。具体地,最终输出的聚类中心数目范围是 [Ko/2, 2Ko]。

      [2] 每个类所要求的最少样本数目Nmin:用于判断当某个类别所包含样本分散程度较大时是否可以进行分裂操作。如果分裂后会导致某个子类别所包含样本数目小于Nmin,就不会对该类别进行分裂操作。

      [3] 最大方差Sigma:用于衡量某个类别中样本的分散程度。当样本的分散程度超过这个值时,则有可能进行分裂操作(注意同时需要满足[2]中所述的条件)。

      [4] 两个类别对应聚类中心之间所允许最小距离dmin:如果两个类别靠得非常近(即这两个类别对应聚类中心之间的距离非常小),则需要对这两个类别进行合并操作。是否进行合并的阈值就是由dmin决定。

      相信很多人看完上述输入的介绍后对ISODATA算法的流程已经有所猜测了。的确,ISODATA算法的原理非常直观,不过由于它和其他两个方法相比需要额外指定较多的参数,并且某些参数同样很难准确指定出一个较合理的值,因此ISODATA算法在实际过程中并没有K-means++受欢迎。

      首先给出ISODATA算法主体部分的描述,如下图所示:

图4

图4. ISODATA算法的主体部分

     上面描述中没有说明清楚的是第5步中的分裂操作和第6步中的合并操作。下面首先介绍合并操作:

图5

图5. ISODATA算法的合并操作

     最后是ISODATA算法中的分裂操作。

图6

图6. ISODATA算法的分裂操作

      最后,针对ISODATA算法总结一下:该算法能够在聚类过程中根据各个类所包含样本的实际情况动态调整聚类中心的数目。如果某个类中样本分散程度较大(通过方差进行衡量)并且样本数量较大,则对其进行分裂操作;如果某两个类别靠得比较近(通过聚类中心的距离衡量),则对它们进行合并操作。

       可能没有表述清楚的地方是ISODATA-分裂操作的第1步和第2步。同样地以图三所示数据集为例,假设最初1,2,3,4,5,6,8号被分到了同一个类中,执行第1步和第2步结果如下所示:

图7

      而在正确分类情况下(即1,2,3,4为一类;5,6,7,8为一类),方差为0.33。因此,目前的方差远大于理想的方差,ISODATA算法就很有可能对其进行分裂操作。

 

五、聚类算法源代码

      我已经将上述三种算法整合成一个Matlab函数Clustering.m。读者可以直接使用该函数对数据集进行聚类。由于代码比较长,而且代码插件还不怎么会用,就不在文中介绍了。需要使用的读者可以点击下面的链接下载使用(欢迎Star和Fork,之后会不定期补充新的算法和优化的):

https://github.com/AaronX121/Unsupervised-Learning-Clustering

     使用方式非常简单,目前支持三种形式的输入,分别对应着上面的三种算法:

     [centroid, result] = Clustering(data, ‘kmeans’, k , iteration);

     [centroid, result] = Clustering(data, ‘kmeans++’, k , iteration);

     [centroid, result] =

   Clustering(data, ‘isodata’, desired_k , iteration, minimum_n, maximum_variance, minimum_d);

      其中的输入data是一个矩阵,每一行代表数据集中的一个样本。其他输入的意义与上面的算法描述中一一对应。输出的centroid是聚类中心的位置,result是每个样本所对应的类别索引。

 

六、数据集测试

      最后以一个简单的满足二维高斯分布的数据集为例,展示上述三种算法的聚类结果,如下图所示。

测试结果

图7. 一个简单数据集上三种算法的聚类效果(绿色加号代表聚类中心位置)

分类:  Machine Learning

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

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

相关文章

数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

原文&#xff1a;http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树&#xff08;BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B树、B*树&#xff09; 转载 2014年09月16日 12:07:0827624 BST树 即二叉搜索树&#xff1a; 1.所有非叶子结点至…

html载入字体,css怎么导入字体?

在做前端页面的时候&#xff0c;有些内容文字需要通过css来指定第三方的字体进行显示&#xff0c;而不是默认支持的一些字体&#xff0c;这就需要自己制作或者获得字体文件&#xff0c;然后放入对应的字体目录&#xff0c;并通过font-family来指定字体。在 CSS3 之前&#xff0…

奇异值的物理意义

知乎上的解释特别好&#xff0c;非常佩服&#xff0c;在此转载一下&#xff0c;做个笔记 原文&#xff1a;https://www.zhihu.com/question/22237507/answer/28007137 奇异值作用&#xff1a;图片压缩&#xff0c;去燥&#xff0c;模糊等等矩阵的奇异值是一个数学意义上的概念…

mabatisplus怎么给实体类自定义属性_如果你的角色属性可以自定义,你会怎么点?...

如今越来越多的人抱怨小时候学的一些特长&#xff0c;长大之后根本没什么用处&#xff0c;比如乐器、绘画等等。反而是一些实用的比如烹饪和动手能力更受到大家的欢迎。阿庆想说的是&#xff0c;你肯定是没有坚持&#xff0c;到最后自然只能像方仲永一样“泯然众人矣”了。在游…

selector多路复用_超详细的I/O多路复用概念、常用I/O模型、系统调用等介绍

概述当我们要编写一个echo服务器程序的时候&#xff0c;需要对用户从标准输入键入的交互命令做出响应。在这种情况下&#xff0c;服务器必须响应两个相互独立的I/O事件&#xff1a;1)网络客户端发起网络连接请求&#xff0c;2)用户在键盘上键入命令行。我们先等待哪个事件呢&am…

余弦计算相似度度量

目录 pytorch 余弦相似度&#xff0c; 余弦计算相似度度量 pytorch 余弦相似度&#xff0c; 余弦相似度1到-1之间&#xff0c;1代表正相关&#xff0c;0代表不相关&#xff0c;-1代表负相关 def l2_norm(input, axis1):norm torch.norm(input, 2, axis, True)output torc…

程序员表白简短html代码,【杂谈】2018浪漫七夕:7款程序员必备表白源码(超炫酷)...

2018七夕将要来临&#xff0c;ki4网给大家准备了七款程序员表白专用源码&#xff0c;让你可以一举俘获美人心&#xff0c;下面就来看一看这七款表白代码大全&#xff0c;包含html、html5、CSS、JQ编写的一些非常简单实用的表白代码&#xff0c;非常炫酷、浪漫&#xff01;1、CS…

哪种css实现方式优势更突出_【第十三课】更合理的CSS结构

前言从零开始学前端系列课程&#xff0c;与传统的视频大课堂教学不同&#xff0c;没有填鸭&#xff1b;也普通做练习题的方式不同&#xff0c;没有假想的模拟题。 本课程拆出80个左右必须掌握的技能点&#xff0c;并对其分组&#xff0c;从易到难地列出学习曲线。同时从真实项目…

TF-IDF与余弦相似性的应用

原文&#xff1a;http://www.ruanyifeng.com/blog/2013/03/tf-idf.html TF-IDF与余弦相似性的应用&#xff08;一&#xff09;&#xff1a;自动提取关键词 这个标题看上去好像很复杂&#xff0c;其实我要谈的是一个很简单的问题。 有一篇很长的文章&#xff0c;我要用计算机提取…

webloigc12服务启动不了_一键启动知多少!

一键启动(自动挡车型)相比对手动挡的钥匙启动高大上不会出现膝盖被钥匙磕到的情况也不会出现钥匙孔边上有划痕的现象但是一键启动开关启动的顺序是什么&#xff1f;是长按至启动还是通电后再启动&#xff1f;一键启动常见问题答疑■ 问&#xff1a;一键启动车辆是如何启动的&a…

机器学习算法之决策树

原文&#xff1a;http://www.jianshu.com/p/6eecdeee5012 决策树是一种简单高效并且具有强解释性的模型&#xff0c;广泛应用于数据分析领域。其本质是一颗由多个判断节点组成的树&#xff0c;如&#xff1a; 决策树在使用模型进行预测时&#xff0c;根据输入参数依次在各个判断…

组件三层_Angular 练级之旅(8)-Zorro Select组件的实现和进阶

很久没写相关的文章&#xff0c;正好前两天把抄来的Select组件重写了一下&#xff0c;简化了一些逻辑。先看下zorro 中select组件的一个目录结构zorro将select组件分成了 三大块Input / 选择框下拉列表连接以上2层的控制器层先看 我们使用的 nz-select 内部的模板到底是什么样的…

目标检测 RCNN算法详解

原文&#xff1a;http://blog.csdn.net/shenxiaolu1984/article/details/51066975 【目标检测】RCNN算法详解 Girshick, Ross, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation.” Proceedings of the IEEE conference on comput…

燕赵志愿云如何认证_如何获得云安全专家CCSP认证

关注↑↑↑我们获得更多精彩内容&#xff01;千呼万唤始出来&#xff0c;云安全专家CCSP认证正式上线&#xff0c;全文皆重点&#xff0c;请仔细查看。CCSP云安全专家认证是什么&#xff1f;两家国际顶尖的安全组织,云安全联盟Cloud Security Alliance与 (ISC)&#xff0c;在20…

替代方法_ASD干预:替代行为的正确使用方法和注意事项

在我们的日常干预中&#xff0c;孤独症的儿童的行为问题一直是我们干预的一个重点&#xff0c;和普通的儿童不一样&#xff0c;自闭症孩子由于其认知和社交方面的障碍&#xff0c;都会采取很多的"不恰当行为"来表达自己的不满和需求&#xff0c;比如尖叫&#xff0c;…

长沙医学院计算机系怎么样,长沙医学院有哪些专业及什么专业好

本文讲述了长沙医学院最新的专业介绍&#xff0c;主要包含长沙医学院有哪些专业及每个专业的收费标准、长沙医学院都有什么专业比较好等&#xff0c;更多信息请访问大学高考。本文目录&#xff1a;长沙医学院什么专业好长沙医学院比较好的专业有&#xff1a;临床医学、中医学、…

goahead如何使用cgi服务_北斗导航系统现已提供全球服务!你知道如何使用这个服务吗?...

在11月份的时候&#xff0c;我国传来了一个好消息&#xff0c;北斗导航全球组网成功&#xff01;这意味着我国23年的努力没有白费&#xff0c;取得了圆满的成功。此项研究成果也迅速让中国的国际地位提高&#xff0c;很多国家都想和我们谈生意&#xff0c;一起参加北斗导航系统…

fullcalendar 显示的时间间隔只有四十五分钟_Linux命令行监控程序,还能实时高亮显示差异,我就选它了...

引言watch用于定期运行任意命令&#xff0c;并在终端窗口上显示该命令的输出。当你必须重复执行命令并观察命令输出随时间变化时&#xff0c;它非常有用。例如&#xff0c;可以使用watch命令来监视系统正常运行时间或磁盘使用情况。watch程序是procps(或procps-ng)软件包的一部…

计算机快速看图教程,CAD快速看图使用电脑版软件操作教程

下面给大家介绍一个非常好用的操作方法&#xff0c;能够解决大家在CAD快速看图、编辑与修改、格式转换、版本转换等问题。拿到图纸都能够打开浏览&#xff0c;转换成可以转换的文件格式&#xff0c;发送给客户都可以。1我们可以上网搜索&#xff0c;CAD快速看图或CAD编辑器&…

计算机考试不用输入扩展名吗,本周末的 计算机等级考试,如果不想考0分,一定要花2分钟看完...

原标题&#xff1a;本周末的 计算机等级考试&#xff0c;如果不想考0分&#xff0c;一定要花2分钟看完嗨喽~下午好&#xff01;我是超甜的小虎泰戈尔的爱情诗《世上最远的距离》里有一段“世上最远的距离不是生与死的距离&#xff0c;而是我站在你面前你不知道我爱你。”现在对…