K-means原理、优化、应用

2024-05-14

1. 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

K-means原理、优化、应用

2. K-means的介绍

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

3. K-means的算法优点

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

K-means的算法优点

4. 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 算法是对样本数据进行聚类,无论是初始点的选择还是一次迭代完成时对数据的调整,都是建立在随机选取的样本数据的基础之上,这样可以提高算法的收敛速度。

5. K-means的基本信息

 K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,J的值没有发生变化,说明算法已经收敛。算法过程如下:1)从N个文档随机选取K个文档作为质心2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类3)重新计算已经得到的各个类的质心4)迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束具体如下:输入:k, data[n];(1) 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1];(2) 对于data[0]….data[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i;(3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数;(4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值。 K-MEANS算法的工作原理及流程K-MEANS算法输入:聚类个数k,以及包含 n个数据对象的数据库。输出:满足方差最小标准的k个聚类。 (1) 从 n个数据对象任意选择 k 个对象作为初始聚类中心;(2) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;(3) 重新计算每个(有变化)聚类的均值(中心对象)(4) 循环(2)到(3)直到每个聚类不再发生变化为止k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。工作过程k-means 算法的工作过程说明如下:首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然 后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数。k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。

K-means的基本信息

6. K-means的存在问题

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

7. 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.

K-Means(一)K值的选择

8. K-Means 聚类原理

K-Means 是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。
  
 假设有一些点分散在直线上,现在需要对这些点进行聚类分析。
                                          
 第一步,想一下我们希望最终将这些点聚为多少类?
  
 假设我们希望聚为3类
  
 第二步,在这些点中随机选择3个点,作为初始簇(initial cluster)
                                          
 第三步,计算第一个点f分别到这3个initial cluster的距离
                                          
 第四步,将第一个点归属为距离最近的那个cluster
                                          
 重复第三/四步
                                          
 一一判断所有点的归属
                                          
 第五步,计算每一个cluster的均值
                                          
 然后像之前一样,通过计算每个点到这些均值的距离,重新判断每个点归属于哪个cluster
                                          
 判断完每个点的归属之后,重新计算均值……判断归属……计算均值……判断归属……直到聚出来的cluster不再变化
                                          
 很明显,上面的聚类效果很差,还不如我们肉眼聚类出来的效果。是否有办法判断不同聚类结果的好坏呢?
                                          
 第一步,计算每一个cluster的总变差(total variation)
                                          
 第二步,重新选择3个initial cluster,并且多次迭代判断cluster,计算total variation
                                          
 第三步,多次重复上一步的内容,选择total variation最小的聚类结果
                                          
 在本文的案例中,我们通过肉眼可以判断出K选择3比较好。但是如果我们自己无法判断时,如何处理?
  
 一种方法是直接尝试不同的K值进行聚类
  
 K=1是最差的一种结果,total variation此时最大
                                          
 K=2的效果会稍微好些
                                          
 随着K值增大,total variation也逐渐减小;当K=N(样本数)时,total variation降至0。
  
 绘制total variation随K值变化的elbow plot
                                          
 可以看出,K>3时,variation的降低速率明显降低。所以K=3是较好的选择。
  
 二维平面上的点,可以通过欧式距离来判断聚类
                                          
 然后同之前一般,计算平面上同一cluster的中心,重新判断点的归属,寻找中心……判断归属……
                                          
 对于热图相关数据,也可以通过欧式距离来判断样本的聚类
                                          
  https://blog.csdn.net/huangfei711/article/details/78480078 
  
  https://www.biaodianfu.com/k-means-choose-k.html 
  
  https://www.youtube.com/watch?v=4b5d3muPQmA&feature=youtu.be