K-means的介绍

2024-05-09 22:13

1. K-means的介绍

K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。

K-means的介绍

2. K-Means(一)K值的选择

算法1.1 基本K均值算法 
  
     1:选择K个点作为初始质心
  
     2:repeat
  
     3:    将每一个点指派到最近的质心,形成K个簇
  
     4:    重新计算每个簇的质心
  
     5:until    质心不发生变化
  
  关于K值的选择 
  
         Tan et al.的《数据挖掘导论》给了许多簇评估的方式,包括非监督的、监督的和相对的。这里只介绍两种非监督的。其中重点介绍第一种,关于凝聚度和分离度的方法。
  
         (1)使用凝聚度和分离度
  
         凝聚度是衡量簇内点的临近程度,而分离度是指簇与簇之间的临近程度。衡量总体的有效性可以用凝聚度、分离度或者是两者的某种组合。
  
         关于两者的计算,分为基于图的观点和基于原型(有质心)的观点。都不难理解。一个是基于点本身,另一个基于点与质心。
  
         ①基于图的观点
  
         凝聚度可以定义为用连接簇内点的邻近度图中边的加权和。
  
         分离度可以用从一个簇到另一个簇的点的边的加权和来表示。
  
         ②基于原型的观点
  
         凝聚度可以定义为关于簇原型(质心或中心)的邻近度的和。
  
         分离度可以用两个簇的临近性度量。就是两个簇质心之间的距离。
  
         ③关于凝聚度与分离度之间的关系
  
         聚类的目标就是使组内的相似性越大,组间的差别越大。而这两个指标可以用凝聚度和分离度来表示。也就是说,使凝聚度越小,分离度越大。于是我想到可以把两者结合起来对聚类效果进行评价。然而,在《数据挖掘导论》写道:
  
         是否可以这样理解,总TSS不变,减少SSE就是增加SSB,这就是聚类的目标。即,我们只需要关注两者其一即可。问题是,SSE随着K值的增加,是会减少的。可以看到,随着K越来越大,甚至趋向于m(数据集总的样本数),SSE这时等于0。所以单单通过这个值评价聚类效果我认为是不合理的。在实际应用中还是需要结合domain knowledge选择K。
  
         Tan在书中写道可以通过观察“拐点”来选择最优K值。但是像我这张图是很难找到一个拐点的。
                                          
         ④使用轮廓系数
  
         轮廓系数结合了凝聚度和分离度。轮廓系数的定义不难理解,就是一种度量凝聚度和分离度的方式。计算个体的轮廓系数由三步组成。
  
          Definition 轮廓系数 
  
         ⅰ 对于第i个对象,计算它到簇中所有其他对象的平均距离,记为ai
  
         ⅱ 对于第i个对象和不包含该对象的任意簇,计算该对象到给定簇中所有对象的平均距离。关于所有的簇,找出最小值,记作bi
  
          ⅲ 对于第i个对象,轮廓系数Si=(bi - ai) /  max(ai, bi)
  
         轮廓系数的值在-1与1之间,我们不希望出现负值。因为出现负值表示点到簇内点的平均距离大ai于点到其他簇的最小平均距离。这在直觉上也是不对的,因为我们想要簇内距离最小。
  
         我们可以简单地取簇中点的轮廓系数的平均值,计算簇的平均轮廓系数。通过计算所有点的平均轮廓系数,可以得到聚类优良性的总度量。
  
         轮廓系数越趋近于1,说明聚类效果越好。因为此时ai越趋近于0。
  
         类似于绘制SSE,我们也可以绘制K与轮廓系数的图,通过观察“拐点”选择最优K值。值得注意的是,轮廓系数是越高越好,而SSE是越低越好,两种拐点的类型在图上有微小差别。
  
 总结:
  
         本小节主要介绍了基本K-Means算法和K值的选择。接下来会介绍K-Means的优化算法。
  
 
  
  
 
  
  
 
  
  
  参考文献: 
  
  [1]Pang-Ning Tan, Michael Steinbach, Vipin Kumar.  数据挖掘导论 [M]. 人民邮电出版社, 2011.

3. K-Means原理总结

    K-means是聚类中的一个经典方法。其中的原理和思想实在是巧妙到爆炸💥。接下来让我来给大家展示来自1967年的算法的智慧。
  
 问题引出:如下图所示,我们想要自动的聚类,肉眼一看是5类。那么我们随机生成5个点,它们最终将会成为聚类后每个类的中心点。由于是随机初始化的5个点,所以它们的位置刚开始大概率不在每个类的中心点上,不过没关系,我们可以慢慢调整。
                                          
 过程描述:如上图所示生成的5个点,它们最终会成为每个类的中心点,此时此刻,每个点有着自己的领域范围。比如最上面的那个点1,它想要成为一个类的中心点,这个类此时此刻都包含哪些点呢,答案当然是到它的距离比到其他中心点距离更近的所有样本点。那么接下来,哪些点符合条件呢?由于每个中心点它都想要控制尽可能多的点,并且得合理。那最上面那个中心点1想要控制位于它自己下面的一些样本点,会有哪些中心点在跟它竞争呢? 答案是中间左右两个点2和3,注意最下面两个中心点4和5参与不到竞争了。所以我们做出两条垂直平分线a,b。a是连线点1,2的垂直平分线,b是连线点1,3的垂直平分线。垂直平分线有什么性质啊? 位于线上的点到两端的距离相等,位于线一侧的点到该侧端点距离更小。所以!位于垂直平分线a,b上面的所有样本点暂时归中心点的领域,注意此时点1并未是该领域样本点的中心,我们应该更新点1的位置,把它挪到领域的中心。因为三角形三条边的垂直平分线会交于一点(先画出两条交于一点,再从该点向另一个边做垂线,证明该垂线与边的交点为中点即可)所以5个中心点互相竞争划分领域会呈现出如上并不杂乱的界限。我们更新5个中心点的位置,再次重新竞争领域,再更新位置。。。直到中心点的位置不动了,聚类完毕。
  
 
  
                                          
         原理中一直贯穿着中心的概念,这就是means的含义。接下来我们来分析一下K-means的优缺点。
  
             1.对分布类似球型的数据效果很好。为什么?试想长条带状的末端有一小簇。
  
 .............................................           。
  
 .............................................           。
  
 如果刚开始随机的中心点一左一右刚刚好,开始竞争,显然...这些右侧的..离。。。的中心点更近,按规则应该归它领域,然后再更新。这样就不符合人的直觉了。
  
             2.收敛的很快,中心点更新个几次后就不咋动了。
  
             3.相对高效并且易估计复杂度O(k·t·n),t是迭代次数一般几次就可以完成,k是中心点个数,簇的个数,不会很大。n是数据点的个数,可能会很大。
  
         1.K值不好估计,不能预先去判断。
  
         2.可能会因为初始点随机的不好,会收敛到一个奇怪的结果。如下图。

K-Means原理总结

4. K-means原理、优化、应用

 K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体方法。包括初始化优化K-Means++, 距离计算优化elkan K-Means算法和大数据情况下的优化Mini Batch K-Means算法。
  
     K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
  
 1、随机选择K个聚类的初始中心。
  
 2、对任意一个样本点,求其到K个聚类中心的距离,将样本点归类到距离最小的中心的聚类。
  
 3、每次迭代过程中,利用均值等方法更新各个聚类的中心点(质心)。
  
 4、对K个聚类中心,利用2、3步迭代更新后,如果位置点变化很小(可以设置阈值),则认为达到稳定状态,迭代结束。(画图时,可以对不同的聚类块和聚类中心可选择不同的颜色标注)
  
 1、原理比较简单,实现也是很容易,收敛速度快。 
  
 2、聚类效果较优。 
  
 3、算法的可解释度比较强。 
  
 4、主要需要调参的参数仅仅是簇数k。
  
 1、K值的选取不好把握 
  
 2、对于不是凸的数据集比较难收敛 
  
 3、如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。 
  
 4、 最终结果和初始点的选择有关,容易陷入局部最优。
  
 5、对噪音和异常点比较的敏感。
  
     解决K-Means算法对 初始簇心 比较敏感的问题,二分K-Means算法是一种弱化初始质心的一种算法。
  
 1、将所有样本数据作为一个簇放到一个队列中。
  
 2、从队列中选择一个簇进行K-Means算法划分,划分为两个子簇,并将子簇添加到队列中。
  
 3、循环迭代步骤2操作,直到中止条件达到(聚簇数量、最小平方误差、迭代次数等)。
  
 4、队列中的簇就是最终的分类簇集合。
  
  从队列中选择划分聚簇的规则一般有两种方式;分别如下: 
  
 1、对所有簇计算误差和SSE(SSE也可以认为是距离函数的一种变种),选择SSE最大的聚簇进行划分操作(优选这种策略)。
  
 2、选择样本数据量最多的簇进行划分操作:
                                          
     由于 K-means 算法的分类结果会受到初始点的选取而有所区别,因此有提出这种算法的改进: K-means++ 。
  
     其实这个算法也只是对初始点的选择有改进而已,其他步骤都一样。初始质心选取的基本思路就是, 初始的聚类中心之间的相互距离要尽可能的远 。
  
 1、随机选取一个样本作为第一个聚类中心 c1;
  
 2、计算每个样本与当前已有类聚中心最短距离(即与最近一个聚类中心的距离),用 D(x)表示;这个值越大,表示被选取作为聚类中心的概率较大;最后,用轮盘法选出下一个聚类中心。
  
 3、重复步骤2,知道选出 k 个聚类中心。
  
 4、选出初始点(聚类中心),就继续使用标准的 k-means 算法了。
  
 尽管K-Means++在聚类中心的计算上浪费了很多时间,但是在迭代过程中,k-mean 本身能快速收敛,因此算法实际上降低了计算时间。
  
       解决K-Means++算法缺点而产生的一种算法;主要思路是改变每次遍历时候的取样规则,并非按照K-Means++算法每次遍历只获取一个样本,而是每次获取K个样本,重复该取样操作O(logn)次 (n是样本的个数) ,然后再将这些抽样出来的样本聚类出K个点,最后使用这K个点作为K-Means算法的初始聚簇中心点。实践证明:一般5次重复采用就可以保证一个比较好的聚簇中心点。
  
 1、在N个样本中抽K个样本,一共抽logn次,形成一个新的样本集,一共有Klogn个数据。
  
 2、在新数据集中使用K-Means算法,找到K个聚簇中心。
  
 3、把这K个聚簇中心放到最初的样本集中,作为初始聚簇中心。
  
 4、原数据集根据上述初始聚簇中心,再用K-Means算法计算出最终的聚簇。
  
         Canopy属于一种‘粗’聚类算法,即使用一种简单、快捷的距离计算方法将数据集分为若干可重叠的子集canopy,这种算法不需要指定k值、但精度较低,可以结合K-means算法一起使用:先由Canopy算法进行粗聚类得到k个质心,再使用K-means算法进行聚类。
  
  1、将原始样本集随机排列成样本列表L=[x1,x2,...,xm](排列好后不再更改),根据先验知识或交叉验证调参设定初始距离阈值T1、T2,且T1>T2 。
  
 2、从列表L中随机选取一个样本P作为第一个canopy的质心,并将P从列表中删除。
  
 3、从列表L中随机选取一个样本Q,计算Q到所有质心的距离,考察其中最小的距离D:
  
 如果D≤T1,则给Q一个弱标记,表示Q属于该canopy,并将Q加入其中;
  
 如果D≤T2,则给Q一个强标记,表示Q属于该canopy,且和质心非常接近,所以将该canopy的质心设为所有强标记样本的中心位置,并将Q从列表L中删除;
  
  如果D>T1,则Q形成一个新的聚簇,并将Q从列表L中删除。
  
 4、重复第三步直到列表L中元素个数为零。
  
 1、‘粗’距离计算的选择对canopy的分布非常重要,如选择其中某个属性、其他外部属性、欧式距离等。
  
 2、当T2<D≤T1时,样本不会从列表中被删除,而是继续参与下一轮迭代,直到成为新的质心或者某个canopy的强标记成员。
  
 3、T1、T2的取值影响canopy的重叠率及粒度:当T1过大时,会使样本属于多个canopy,各个canopy间区别不明显;当T2过大时,会减少canopy个数,而当T2过小时,会增加canopy个数,同时增加计算时间。
  
 4、canopy之间可能存在重叠的情况,但是不会存在某个样本不属于任何canopy的情况。
  
 5、Canopy算法可以消除孤立点,即删除包含样本数目较少的canopy,往往这些canopy包含的是孤立点或噪音点。
  
 
  
                                          
     由于K-Means算法存在初始聚簇中心点敏感的问题,常用使用Canopy+K-Means算法混合形式进行模型构建。
  
 1、先使用canopy算法进行“粗”聚类得到K个聚类中心点。
  
 2、K-Means算法使用Canopy算法得到的K个聚类中心点作为初始中心点,进行“细”聚类。
  
 1、执行速度快(先进行了一次聚簇中心点选择的预处理);
  
 2、不需要给定K值,应用场景多。
  
 3、能够缓解K-Means算法对于初始聚类中心点敏感的问题。
  
     Mini Batch K-Means算法是K-Means算法的一种优化变种,采用 小规模的数据子集 (每次训练使用的数据集是在训练算法的时候随机抽取的数据子集) 减少计算时间 ,同时试图优化目标函数;Mini Batch K-Means算法可以减少K-Means算法的收敛时间,而且产生的结果效果只是略差于标准K-Means算法。
  
 
  
 1、首先抽取部分数据集,使用K-Means算法构建出K个聚簇点的模型。
  
 2、继续抽取训练数据集中的部分数据集样本数据,并将其添加到模型中,分配给距离最近的聚簇中心点。
  
 3、更新聚簇的中心点值。
  
 4、循环迭代第二步和第三步操作,直到中心点稳定或者达到迭代次数,停止计算操作。
  
 
  
  
 https://www.jianshu.com/p/f0727880c9c0

5. K-means的算法优点

K-Means聚类算法的优点主要集中在:1.算法快速、简单;2.对大数据集有较高的效率并且是可伸缩性的;3.时间复杂度近于线性,而且适合挖掘大规模数据集。K-Means聚类算法的时间复杂度是O(nkt) ,其中n代表数据集中对象的数量,t代表着算法迭代的次数,k代表着簇的数目。

K-means的算法优点

6. K-means的存在问题

 存在的问题K-means 算法的特点——采用两阶段反复循环过程算法,结束的条件是不再有数据元素被重新分配: 优点:本算法确定的K 个划分到达平方误差最小。当聚类是密集的,且类与类之间区别明显时,效果较好。对于处理大数据集,这个算法是相对可伸缩和高效的,计算的复杂度为O(NKt),其中N是数据对象的数目,t是迭代的次数。一般来说,K<<N,t<<N 。

7. K-means的算法缺点

 ① 在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。这也是 K-means 算法的一个不足。有的算法是通过类的自动合并和分裂,得到较为合理的类型数目 K,例如 ISODATA 算法。关于 K-means 算法中聚类数目K 值的确定在文献中,是根据方差分析理论,应用混合 F统计量来确定最佳分类数,并应用了模糊划分熵来验证最佳分类数的正确性。在文献中,使用了一种结合全协方差矩阵的 RPCL 算法,并逐步删除那些只包含少量训练数据的类。而文献中使用的是一种称为次胜者受罚的竞争学习规则,来自动决定类的适当数目。它的思想是:对每个输入而言,不仅竞争获胜单元的权值被修正以适应输入值,而且对次胜单元采用惩罚的方法使之远离输入值。② 在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果,这也成为 K-means算法的一个主要问题。对于该问题的解决,许多算法采用遗传算法(GA),例如文献 中采用遗传算法(GA)进行初始化,以内部聚类准则作为评价指标。③ 从 K-means 算法框架可以看出,该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。所以需要对算法的时间复杂度进行分析、改进,提高算法应用范围。在文献中从该算法的时间复杂度进行分析考虑,通过一定的相似性准则来去掉聚类中心的侯选集。而在文献中,使用的 K-means 算法是对样本数据进行聚类,无论是初始点的选择还是一次迭代完成时对数据的调整,都是建立在随机选取的样本数据的基础之上,这样可以提高算法的收敛速度。

K-means的算法缺点

8. K-Means聚类算法

        所谓聚类算法是指将一堆没有标签的数据自动划分成几类的方法,属于无监督学习方法,这个方法要保证同一类的数据有相似的特征,如下图所示:
                                          
         根据样本之间的距离或者说是相似性(亲疏性),把越相似、差异越小的样本聚成一类(簇),最后形成多个簇,使同一个簇内部的样本相似度高,不同簇之间差异性高。
  
  相关概念: 
  
  K值 :要得到的簇的个数
  
  质心 :每个簇的均值向量,即向量各维取平均即可
  
  距离量度 :常用欧几里得距离和余弦相似度(先标准化)
                                          
  算法流程: 
  
 1、首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。
  
 2、从数据集中随机选择k个数据点作为质心。
  
 3、对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。
  
 4、把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。
  
 5、如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。
  
 6、如果新质心和原质心距离变化很大,需要迭代3~5步骤。
                                          
 K-Means采用的启发式方式很简单,用下面一组图就可以形象的描述:
                                          
         上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图d所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。
  
 坐标系中有六个点:
                                          
 1、我们分两组,令K等于2,我们随机选择两个点:P1和P2
  
 2、通过勾股定理计算剩余点分别到这两个点的距离:
                                          
 3、第一次分组后结果:
  
         组A:P1
  
         组B:P2、P3、P4、P5、P6
  
 4、分别计算A组和B组的质心:
  
         A组质心还是P1=(0,0)
  
         B组新的质心坐标为:P哥=((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)
  
 5、再次计算每个点到质心的距离:
                                          
 6、第二次分组结果:
  
         组A:P1、P2、P3
  
         组B:P4、P5、P6
  
 7、再次计算质心:
  
         P哥1=(1.33,1) 
  
         P哥2=(9,8.33)
  
 8、再次计算每个点到质心的距离:
                                          
 9、第三次分组结果:
  
         组A:P1、P2、P3
  
         组B:P4、P5、P6
  
 可以发现,第三次分组结果和第二次分组结果一致,说明已经收敛,聚类结束。
  
  优点: 
  
 1、原理比较简单,实现也是很容易,收敛速度快。
  
 2、当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。
  
 3、主要需要调参的参数仅仅是簇数k。
  
  缺点: 
  
 1、K值需要预先给定,很多情况下K值的估计是非常困难的。
  
 2、K-Means算法对初始选取的质心点是敏感的,不同的随机种子点得到的聚类结果完全不同 ,对结果影响很大。
  
 3、对噪音和异常点比较的敏感。用来检测异常值。
  
 4、采用迭代方法, 可能只能得到局部的最优解,而无法得到全局的最优解 。
  
  1、K值怎么定? 
  
         答:分几类主要取决于个人的经验与感觉,通常的做法是多尝试几个K值,看分成几类的结果更好解释,更符合分析目的等。或者可以把各种K值算出的 E 做比较,取最小的 E 的K值。
  
  2、初始的K个质心怎么选? 
  
         答:最常用的方法是随机选,初始质心的选取对最终聚类结果有影响,因此算法一定要多执行几次,哪个结果更reasonable,就用哪个结果。       当然也有一些优化的方法,第一种是选择彼此距离最远的点,具体来说就是先选第一个点,然后选离第一个点最远的当第二个点,然后选第三个点,第三个点到第一、第二两点的距离之和最小,以此类推。第二种是先根据其他聚类算法(如层次聚类)得到聚类结果,从结果中每个分类选一个点。
  
  3、关于离群值? 
  
         答:离群值就是远离整体的,非常异常、非常特殊的数据点,在聚类之前应该将这些“极大”“极小”之类的离群数据都去掉,否则会对于聚类的结果有影响。但是,离群值往往自身就很有分析的价值,可以把离群值单独作为一类来分析。
  
 4、单位要一致!
  
         答:比如X的单位是米,Y也是米,那么距离算出来的单位还是米,是有意义的。但是如果X是米,Y是吨,用距离公式计算就会出现“米的平方”加上“吨的平方”再开平方,最后算出的东西没有数学意义,这就有问题了。
  
 5、标准化
  
         答:如果数据中X整体都比较小,比如都是1到10之间的数,Y很大,比如都是1000以上的数,那么,在计算距离的时候Y起到的作用就比X大很多,X对于距离的影响几乎可以忽略,这也有问题。因此,如果K-Means聚类中选择欧几里德距离计算距离,数据集又出现了上面所述的情况,就一定要进行数据的标准化(normalization),即将数据按比例缩放,使之落入一个小的特定区间。
  
 
  
  
 
  
  
 参考文章: 聚类、K-Means、例子、细节
最新文章
热门文章
推荐阅读