关于k-means算法的聚类分析

2024-05-14

1. 关于k-means算法的聚类分析


关于k-means算法的聚类分析

2. 聚类分析:k-means和层次聚类

 尽管我个人非常不喜欢人们被划分圈子,因为这样就有了歧视、偏见、排挤和矛盾,但“物以类聚,人以群分”确实是一种客观的现实——这其中就蕴含着聚类分析的思想。
   前面所提到的机器学习算法主要都是 分类 和 回归 ,这两类的应用场景都很清晰,就是对分类型变量或者数值型变量的 预测 。 聚类分析 是一种根据样本之间的距离或者说是相似性(亲疏性),把越相似、差异越小的样本聚成一类(簇),最后形成多个簇,使同一个簇内部的样本相似度高,不同簇之间差异性高。
   有人不理解 分类 和 聚类 的差别,其实这个很简单:分类是一个已知具体有几种情况的变量,预测它到底是哪种情况;聚类则是尽量把类似的样本聚在一起,不同的样本分开。举个例子,一个人你判断他是男是女这是分类,让男人站一排女人站一排这是聚类。
   聚类分析算法很多,比较经典的有 k-means 和 层次聚类法 。
   k-means的k就是最终聚集的簇数,这个要你事先自己指定。k-means在常见的机器学习算法中算是相当简单的,基本过程如下:
   k-means的聚类过程演示如下:
                                           k-means聚类分析的原理虽然简单,但缺点也比较明显:
   值得一提的是,计算距离的方式有很多种,不一定非得是笛卡尔距离;计算距离前要归一化。
   尽管k-means的原理很简单,然而层次聚类法的原理更简单。它的基本过程如下:
   层次聚类不指定具体的簇数,而只关注簇之间的远近,最终会形成一个树形图。
                                           通过这张树形图,无论想划分成几个簇都可以很快地划出。
   以下以癌细胞细据为例,演示K-means和层次聚类法的过程。
                                                                                                                           可见选择不同的距离指标,最终的聚类效果也不同。其中最长距离和类平均距离用得比较多,因为产生的谱系图较为均衡。
                                           图中一条红线将簇划分成4类,很容易看出哪些样本各属于哪一簇。
   以上是层次聚类法的结果,但如果用k-means聚类的话,结果很可能就不一样了。

3. 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、例子、细节

K-Means聚类算法

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

5. K-Means 聚类算法

问题导入
  
     假如有这样一种情况,在一天你想去某个城市旅游,这个城市里你想去的有70个地方,现在你只有每一个地方的地址,这个地址列表很长,有70个位置。事先肯定要做好攻略,你要把一些比较接近的地方放在一起组成一组,这样就可以安排交通工具抵达这些组的“某个地址”,然后步行到每个组内的地址。那么,如何确定这些组,如何确定这些组的“某个地址”?答案就是聚类。而本文所提供的k-means聚类分析方法就可以用于解决这类问题。
  
 一,聚类思想
  
         所谓聚类算法是指将一堆没有标签的数据自动划分成几类的方法,属于无监督学习方法,这个方法要保证同一类的数据有相似的特征,如下图:
                                          
         根据样本之间的距离或者说相似性,把越相似,差异越小的样本聚成一类(簇),最后形成多个簇,使同一个簇内部的样本相似度高,不同簇之间差异性高。
  
 二,K-Means聚类分析算法
  
         K-Means是一种基于自下而上的聚类分析方法,基本概念就是空间中有N个点,初始选择K个点作为中心聚类点,将N个点分别与K个点计算距离,选择自己最近的点作为自己的中心点,不断地更新中心聚集点。
  
 相关概念:
  
         K值:要得到的簇的个数
  
         质心:每个簇的均值向量,即向量各维取品军即可
  
         距离度量:常用欧几里得距离和余弦相似度(先标准化)
  
         两点之间的距离:
                                          
 算法流程:
  
         1    首先确定一个K值,即我们希望将数据集经过聚类得到 K个集合;
  
         2    从数据集中随机选择K个数据点作为质心;
  
         3    对数据集中每一个点,计算其与每个质心的距离(如欧式距离),离哪个质心近,就划分到哪个质心所属的集合
  
         4    把所有数据归好集合,一共有K个集合,然后重新计算每个集合的质心;
  
         5    如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。
  
         6    如果新质心和原质心距离变化大,需要迭代3-5步骤
  
 K-means实现过程
  
 K-means 聚类算法是一种非监督学习算法,被用于非标签数据(data without defined categories or groups)。该算法使用迭代细化来产生最终结果。算法输入的是集群的数量 K 和数据集。数据集是每个数据点的一组功能。
  
  算法从 Κ 质心的初始估计开始,其可以随机生成或从数据集中随机选择 。然后算法在下面两个步骤之间迭代:
  
  1.数据分配: 
  
 每个质心定义一个集群。在此步骤中,基于平方欧氏距离将每个数据点分配到其最近的质心。更正式一点, ci 属于质心集合 C ,然后每个数据点 x 基于下面的公式被分配到一个集群中。
                                          
 其中 dist(·)是标准(L2)欧氏距离。让指向第 i 个集群质心的数据点集合定为 Si 。
  
  2. 质心更新: 
  
 在此步骤中,重新计算质心。这是通过获取分配给该质心集群的所有数据点的平均值来完成的。公式如下:
                                          
 K-means 算法在步骤 1 和步骤 2 之间迭代,直到满足停止条件(即,没有数据点改变集群,距离的总和最小化,或者达到一些最大迭代次数)。
  
 K 值的选择
  
 上述算法找到特定预选 K 值和数据集标签。为了找到数据中的集群数,用户需要针对一系列 K 值运行 K-means 聚类算法并比较结果。通常,没有用于确定 K 的精确值的方法,但是可以使用以下技术获得准确的估计。
  
  Elbow point 拐点方法 
  
 通常用于比较不同 K 值的结果的度量之一是数据点与其聚类质心之间的平均距离。由于增加集群的数量将总是减少到数据点的距离,因此当 K 与数据点的数量相同时,增加 K 将总是减小该度量,达到零的极值。因此,该指标不能用作唯一目标。相反,绘制了作为 K 到质心的平均距离的函数,并且可以使用减小率急剧变化的“拐点”来粗略地确定 K 。
                                          
  DBI(Davies-Bouldin Index) 
  
 DBI 是一种评估度量的聚类算法的指标,通常用于评估 K-means 算法中 k 的取值。简单的理解就是:DBI 是聚类内的距离与聚类外的距离的比值。所以,DBI 的数值越小,表示分散程度越低,聚类效果越好。
  
 还存在许多用于验证 K 的其他技术,包括交叉验证,信息标准,信息理论跳跃方法,轮廓方法和 G 均值算法等等。
  
 
  
  
 三,数学原理
                                          
 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
  
 可以发现,第三次分组结果和第二次分组结果一致,说明已经收敛,聚类结束。
  
 五、K-Means的优缺点
  
  优点: 
  
 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 聚类算法

6. k-means算法是聚类算法还是分类算法

一,k-means聚类算法原理
k-means
算法接受参数
k
;然后将事先输入的n个数据对象划分为
k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小.聚类相似度是利用各聚类中对象的均值所获得一个“中心对
象”(引力中心)来进行计算的.
  k-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.k-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果.
  假设要把样本集分为c个类别,算法描述如下:
  (1)适当选择c个类的初始中心;
  (2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类;
  (3)利用均值等方法更新该类的中心值;
  (4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代.
  该算法的最大优势在于简洁和快速.算法的关键在于初始中心的选择和距离公式.

7. 国外K-means聚类算法的研究现状

国外K-means聚类算法的研究现状
您好亲, k-means 算法属于聚类分析方法中一种基本的且应用最广泛的划分算法,它是一种已知聚类类别数的聚类算法。指定类别数为k,对样本集合进行聚类,聚类的结果由k 个聚类中心来表达,基于给定的聚类目标函数(或者说是聚类效果判别准则),算法采用迭代更新的方法,每一次迭代过程都是向目标函数值减小的方向进行,最终的聚类结果使目标函数值取得极小值,达到较优的聚类效果。
使用平均误差准则函数e作为聚类结果好坏的衡量标准之一,保证了算法运行结果的可靠性和有效性。希望可以帮到您哦。【摘要】
国外K-means聚类算法的研究现状【提问】
国外K-means聚类算法的研究现状
您好亲, k-means 算法属于聚类分析方法中一种基本的且应用最广泛的划分算法,它是一种已知聚类类别数的聚类算法。指定类别数为k,对样本集合进行聚类,聚类的结果由k 个聚类中心来表达,基于给定的聚类目标函数(或者说是聚类效果判别准则),算法采用迭代更新的方法,每一次迭代过程都是向目标函数值减小的方向进行,最终的聚类结果使目标函数值取得极小值,达到较优的聚类效果。
使用平均误差准则函数e作为聚类结果好坏的衡量标准之一,保证了算法运行结果的可靠性和有效性。希望可以帮到您哦。【回答】
有没有国外的相关参考文献【提问】
有没有国外的相关参考文献
您好亲,自己去sciencedirect,springerlink等外文数据库下载啊或者到知网,维普等中文数据库下载很多的,校园网内免费获取校园网外可以利用google学术搜索,有部分能免费下载仅供参考~
 
希望可以帮到您哦。【回答】

国外K-means聚类算法的研究现状

8. K-Means聚类若干问题

1 K-Means聚类收敛性怎么证明?一定会收敛???
  
 2 聚类中止条件:迭代次数、簇中心变化率、最小平方误差MSE???
  
 3 聚类初值的选择,对聚类结果的影响???(K-Means对初值是敏感的)
  
 4 肘部选择法——确定聚类数K
  
 没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题,人工进行选择的。选择的时候思考我们运用 K-均值算法聚类的动机是什么,然后选择能最好服务于该目的标聚类数。当人们在讨论,选择聚类数目的方法时,有一个可能会谈及的方法叫作“肘部法则”。 关于“肘部法则”,我们所需要做的是改变 K 值,也就是聚类类别数目的总数 。我们 用一个聚类来运行 K 均值聚类方法。这就意味着,所有的数据都会分到一个聚类里,然后计算成本函数J,K 代表聚类种类 。
                                          
 我们可能会得到一条类似于这样的曲线。像一个人的肘部。这就是“肘部法则”所做的,让我们来看这样一个图,看起来就好像有一个很清楚的肘在那儿。好像人的手臂,如果你伸出你的胳膊,那么这就是你的肩关节、肘关节、手。这就是“肘部法则”。你会发现这种模式,它的畸变值会迅速下降,从 1 到 2,从 2 到 3 之后,你会在 3 的时候达到一个肘点。在此之后,畸变值就下降的非常慢,看起来就像使用 3 个聚类来进行聚类是正确的,这是因为 那个点是曲线的肘点,畸变值下降得很快 ,K 等于 3 之后就下降得很慢,那么我们就选 K 等于 3。 当你应用“肘部法则”的时候,如果你得到了一个像上面这样的图,那么这将是一种用来选择聚类个数的合理方法。 
  
 uk是第k 个类的重心位置。成本函数是各个类畸变程度(distortions)之和。每个类的畸变程度等于该类重心与其内部成员位置距离的平方和。若类内部的成员彼此间越紧凑则类的畸变程度越小,反之,若类内部的成员彼此间越分散则类的畸变程度越大。求解成本函数最小化的参数就是一个重复配置每个类包含的观测值,并不断移动类重心的过程。
  
 importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansfromscipy.spatial.distanceimportcdistx = np.array([1,2,3,1,5,6,5,5,6,7,8,9,7,9])y = np.array([1,3,2,2,8,6,7,6,7,1,2,1,1,3])data = np.array(list(zip(x, y)))# 肘部法则 求解最佳分类数# K-Means参数的最优解也是以成本函数最小化为目标# 成本函数是各个类畸变程度(distortions)之和。每个类的畸变程度等于该类重心与其内部成员位置距离的平方和# 画肘部图aa=[]K = range(1,10)forkinrange(1,10):    kmeans=KMeans(n_clusters=k)    kmeans.fit(data)    aa.append(sum(np.min(cdist(data, kmeans.cluster_centers_,'euclidean'),axis=1))/data.shape[0])plt.figure()plt.plot(np.array(K), aa,'bx-')plt.show()# 绘制散点图及聚类结果中心点plt.figure()plt.axis([0,10,0,10])plt.grid(True)plt.plot(x, y,'k.')kmeans = KMeans(n_clusters=3)kmeans.fit(data)plt.plot(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1],'r.')plt.show()
                                                                                  
 5 K-Means优缺点及适用范围
                                                                                  
  K值需要预先给定,属于预先知识,很多情况下K值的估计是非常困难的,对于像计算全部微信用户的交往圈这样的场景就完全的没办法用K-Means进行 。对于可以确定K值不会太大但不明确精确的K值的场景,可以进行迭代运算,然后 找出Cost Function最小时所对应的K值,这个值往往能较好的描述有多少个簇类 。
  
 K-Means算法对 初始选取的聚类中心点是敏感的 ,不同的随机种子点得到的聚类结果完全不同
  
 K-Means算法 并不是适用所有的样本类型 。它 不能处理非球形簇、不同尺寸和不同密度的簇 。
  
 K-Means算法对离群点的数据进行聚类时,K均值也有问题,这种情况下,离群点检测和删除有很大的帮助。( 异常值对聚类中心影响很大,需要离群点检测和剔除 )
  
 5.K-Means算法对噪声和离群点敏感,最重要是结果不一定是全局最优,只能保证局部最优。
  
 6 从K-Means 到 Gaussian Mixture Model
  
  数据表示 
  
 在 k-means 中,我们用单个点来对 cluster 进行建模,这实际上是一种最简化的数据建模形式。这种用点来对 cluster 进行建模实际上就已经假设了各 cluster 的数据是呈圆形(或者高维球形)分布的。但在实际生活中,很少能有这种情况。 所以在 GMM 中,我们使用一种更加一般的数据表示,也就是高斯分布。 
  
  数据先验 
  
 在 k-means 中,我们假设各个 cluster 的先验概率是一样的,但是各个 cluster 的数据量可能是不均匀的。举个例子,cluster A 中包含了10000个样本,cluster B 中只包含了100个。那么对于一个新的样本,在不考虑其与 A B cluster 相似度的情况,其属于 cluster A 的概率肯定是要大于 cluster B的。 在 GMM 中,同样对数据先验进行了建模。 
  
  相似度衡量 
  
 在 k-means 中,我们通常采用 欧氏距离来衡量样本与各个 cluster 的相似度 。这种距离实际上假设了数据的 各个维度对于相似度的衡量作用是一样的 。 但在 GMM 中,相似度的衡量使用的是后验概率 
                                          
  通过引入协方差矩阵,我们就可以对各维度数据的不同重要性进行建模。 
  
  数据分配 
  
 在 k-means 中,各个 样本点只属于与其相似度最高的那个cluster ,这实际上是一种 hard clustering 。 在 GMM 中则使用的是后验概率来对各个cluster 按比例分配,是一种 fuzzy clustering 。
  
  Hierarchical Clustering 与 K-Means 和 GMM 这一派系的聚类算法不太相同:
  
 K-Means 与 GMM 更像是一种 top-down 的思想,它们首先要解决的问题是,确定 cluster 数量,也就是 k 的取值。在确定了 k 后,再来进行数据的聚类。
  
 Hierarchical Clustering 则是一种 bottom-up 的形式,先有数据,然后通过不断选取最相似的数据进行聚类。
  
 K-Means业界用得多的原因之一就是 收敛快 ,现在还能通过分布式计算加速,别的原因有调参就一个K。
    
 链接:https://www.jianshu.com/p/cc74c124c00b
  
 来源: