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)(C1,C2,...Ck),则我们的目标是最小化平方误差E:

E=∑i=1k∑x∈Ci||x−μi||22E=∑i=1k∑x∈Ci||x−μi||22

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

μi=1|Ci|∑x∈Cixμi=1|Ci|∑x∈Cix

    如果我们想直接求上式的最小值并不容易,这是一个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}D={x1,x2,...xm},聚类的簇树k,最大迭代次数N

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

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

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

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

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

      c) 对于j=1,2,...,k,对CjCj中所有的样本点重新计算新的质心μj=1|Cj|∑x∈Cjxμj=1|Cj|∑x∈Cjx

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

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

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

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

    K-Means++的对于初始化质心的优化策略也很简单,如下:

    a)  从输入的数据点集合中随机选择一个点作为第一个聚类中心μ1μ1
    b) 对于数据集中的每一个点xixi,计算它与已选择的聚类中心中最近聚类中心的距离D(x)=argmin∑r=1kselected||xi−μr||22D(x)=argmin∑r=1kselected||xi−μr||22
    c) 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)D(x)较大的点,被选取作为聚类中心的概率较大
    d) 重复b和c直到选择出k个聚类质心
    e) 利用这k个质心来作为初始化质心去运行标准的K-Means算法

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

    在传统的K-Means算法中,我们在每轮迭代时,要计算所有的样本点到所有的质心的距离,这样会比较的耗时。那么,对于距离的计算有没有能够简化的地方呢?elkan K-Means算法就是从这块入手加以改进。它的目标是减少不必要的距离的计算。那么哪些距离不需要计算呢?

    elkan K-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。

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

    第二种规律是对于一个样本点xx和两个质心μj1,μj2μj1,μj2。我们可以得到D(x,j2)≥max{0,D(x,j1)−D(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与KNN

    初学者很容易把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值的选取不好把握(改进:可以通过在一开始给定一个适合的数值给k,通过一次K-means算法得到一次聚类中心。对于得到的聚类中心,根据得到的k个聚类的距离情况,合并距离最近的类,因此聚类中心数减小,当将其用于下次聚类时,相应的聚类数目也减小了,最终得到合适数目的聚类数。可以通过一个评判值E来确定聚类数得到一个合适的位置停下来,而不继续合并聚类中心。重复上述循环,直至评判函数收敛为止,最终得到较优聚类数的聚类结果)。

    2)对于不是凸的数据集比较难收敛(改进:基于密度的聚类算法更加适合,比如DESCAN算法)

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

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

    5) 对噪音和异常点比较的敏感(改进1:离群点检测的LOF算法,通过去除离群点后再聚类,可以减少离群点和孤立点对于聚类效果的影响;改进2:改成求点的中位数,这种聚类方式即K-Mediods聚类(K中值))。

6)初始聚类中心的选择(改进1:k-means++;改进2:二分K-means,相关知识详见这里和这里)。

转自:

http://www.cnblogs.com/pinard/p/6164214.html

http://blog.csdn.net/u010536377/article/details/50884416

k-means 的原理,优缺点以及改进相关推荐

  1. 为了联盟还是为了部落 | K means

    1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...

  2. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  3. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  4. 文献记录(part89)--I-k-means-+:An iterative clustering algorithm based on an enhanced k -means

    学习笔记,仅供参考,有错必究 关键词:k均值:解决方案改进:准确的k均值:迭代改进 I-k-means-+:An iterative clustering algorithm based on an ...

  5. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  6. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  7. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  8. K-Means(K均值聚类)原理及代码实现

    机器学习 没有免费午餐定理和三大机器学习任务 如何对模型进行评估 K-Means(K均值聚类)原理及代码实现 KNN(K最近邻算法)原理及代码实现 KMeans和KNN的联合演习 文章目录 机器学习 ...

  9. 算法-聚类-K均值与模糊K均值:原理+python代码

    这篇文章是根据作业修改后得到的,个人感觉写的比较详细了.但还有许多不足,希望大家评论指出. K均值聚类与模糊K均值 1. 算法原理及流程 相关名词解释如表1. 表1-相关名词解释 1.1 K均值算法原 ...

最新文章

  1. 实现数组字符串翻转的两种方法
  2. 计算机动画课程设计,计算机动画课程设计.doc
  3. 【解决方案】调用multiprocessing中创建的文件无法打开的问题FileNotFoundError: [WinError 2]
  4. cass生成曲线要素文件_《CASS道路断面法施工技术》
  5. 爹地,我找到了!15个极好的Linux find命令示例
  6. 在Linux系统中存储设备的两种表示方法
  7. puppeteer 自动化测试 一
  8. Linux 常见命令操作(杀死全部screen)
  9. P1571 眼红的Medusa
  10. 【论文精读】Grounded Language-Image Pre-training(GLIP)
  11. ESP8266深度睡眠计时器唤醒
  12. matlab 215卷积码,基于matlab的卷积码的分析与应用
  13. git——04 远程仓库/标签/别名
  14. python写入excel表格数据绘制图表,Python对数据写入Execl文件并生成图表
  15. 电视量价齐跌,小米电视率先跌回5字头,或促使电视跌回白菜价
  16. SQL——JDBC练习题
  17. win 和linux
  18. 经典飞控-APM中文参考手册
  19. 在测试aes加密的时候,出现一个关于密钥的长度问题
  20. Python爬虫的基本思路

热门文章

  1. 51群接龙-社区社群团购专业营销工具
  2. luogu P2801 教主的魔法
  3. 一款轻、快、无广告的杀毒安全软件(火绒5.0)
  4. Axure绘制页面框架
  5. Linux 文件权限 -rwxr-xr-- 可读 可写 可执行 什么意思 ?
  6. 测试主管面试必问合集:get 与 post 的区别
  7. 一点还算不郁闷的郁闷的事
  8. 钛资本研究院:RegTech监管科技有望成为投融资新风口
  9. unity鼠标滚轮放大缩小
  10. M1的MacBook Air性能评测