KMeans聚类 K值以及初始类簇中心点的选取 转

本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的《大数据-互联网大规模数据挖掘与分布式处理》一书。

KMeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。

KMeans算法本身思想比较简单,但是合理的确定K值和K个初始类簇中心点对于聚类效果的好坏有很大的影响。

1. 确定K个初始类簇中心点

最简单的确定初始类簇中心点的方法是随机选择K个点作为初始的类簇中心点,但是该方法在有些情况下的效果较差,如下(下图中的数据是用五个二元正态高斯分布生成的,颜色代表聚类效果):

《大数据》一书中提到K个初始类簇点的选取还有两种方法:1)选择彼此距离尽可能远的K个点 2)先对数据用层次聚类算法或者Canopy算法进行聚类,得到K个簇之后,从每个类簇中选择一个点,该点可以是该类簇的中心点,或者是距离类簇中心点最近的那个点。

1) 选择批次距离尽可能远的K个点

首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。

该方法经过我测试效果很好,用该方法确定初始类簇点之后运行KMeans得到的结果全部都能完美区分五个类簇:

2) 选用层次聚类或者Canopy算法进行初始聚类,然后利用这些类簇的中心点作为KMeans算法初始类簇中心点。

常用的层次聚类算法有BIRCH和ROCK,在此不作介绍,下面简单介绍一下Canopy算法,主要摘自Mahout的Wiki:

首先定义两个距离T1和T2,T1>T2.从初始的点的集合S中随机移除一个点P,然后对于还在S中的每个点I,计算该点I与点P的距离,如果距离小于T1,则将点I加入到点P所代表的Canopy中,如果距离小于T2,则将点I从集合S中移除,并将点I加入到点P所代表的Canopy中。迭代完一次之后,重新从集合S中随机选择一个点作为新的点P,然后重复执行以上步骤。

Canopy算法执行完毕后会得到很多Canopy,可以认为每个Canopy都是一个Cluster,与KMeans等硬划分算法不同,Canopy的聚类结果中每个点有可能属于多个Canopy。我们可以选择距离每个Canopy的中心点最近的那个数据点,或者直接选择每个Canopy的中心点作为KMeans的初始K个类簇中心点。

2. K值的确定。

《大数据》中提到:给定一个合适的类簇指标,比如平均半径或直径,只要我们假设的类簇的数目等于或者高于真实的类簇的数目时,该指标上升会很缓慢,而一旦试图得到少于真实数目的类簇时,该指标会急剧上升。

类簇的直径是指类簇内任意两点之间的最大距离。

类簇的半径是指类簇内所有点到类簇中心距离的最大值。

废话少说,上图。下图是当K的取值从2到9时,聚类效果和类簇指标的效果图:

左图是K取值从2到7时的聚类效果,右图是K取值从2到9时的类簇指标的变化曲线,此处我选择类簇指标是K个类簇的平均质心距离的加权平均值。从上图中可以明显看到,当K取值5时,类簇指标的下降趋势最快,所以K的正确取值应该是5.为以下是具体数据:

  1. <span style="">2 个聚类
  2. 所有类簇的半径的加权平均值 8.51916676443
  3. 所有类簇的平均质心距离的加权平均值 4.82716260322
  4. 3 个聚类
  5. 所有类簇的半径的加权平均值 7.58444829472
  6. 所有类簇的平均质心距离的加权平均值 3.37661824845
  7. 4 个聚类
  8. 所有类簇的半径的加权平均值 5.65489660064
  9. 所有类簇的平均质心距离的加权平均值 2.22135360453
  10. 5 个聚类
  11. 所有类簇的半径的加权平均值 3.67478798553
  12. 所有类簇的平均质心距离的加权平均值 1.25657641195
  13. 6 个聚类
  14. 所有类簇的半径的加权平均值 3.44686996398
  15. 所有类簇的平均质心距离的加权平均值 1.20944264145
  16. 7 个聚类
  17. 所有类簇的半径的加权平均值 3.3036641135
  18. 所有类簇的平均质心距离的加权平均值 1.16653919186
  19. 8 个聚类
  20. 所有类簇的半径的加权平均值 3.30268530308
  21. 所有类簇的平均质心距离的加权平均值 1.11361639906
  22. 9 个聚类
  23. 所有类簇的半径的加权平均值 3.17924400582
  24. 所有类簇的平均质心距离的加权平均值 1.07431888569</span>

复制代码

转自:http://www.cnblogs.com/kemaswill/archive/2013/01/26/2877434.html

时间: 2024-10-07 23:21:49

KMeans聚类 K值以及初始类簇中心点的选取 转的相关文章

机器学习-KMeans聚类 K值以及初始类簇中心点的选取

[转]http://www.cnblogs.com/kemaswill/archive/2013/01/26/2877434.html 本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的

kmeans 聚类 k 值优化

kmeans 中k值一直是个令人头疼的问题,这里提出几种优化策略. 手肘法 核心思想 1. 肉眼评价聚类好坏是看每类样本是否紧凑,称之为聚合程度: 2. 类别数越大,样本划分越精细,聚合程度越高,当类别数为样本数时,一个样本一个类,聚合程度最高: 3. 当k小于真实类别数时,随着k的增大,聚合程度显著提高,当k大于真实类别数时,随着k的增大,聚合程度缓慢提升: 4. 大幅提升与缓慢提升的临界是个肘点: 5. 评价聚合程度的数学指标类似 mse,均方差,是每个类别的样本与该类中心的距离平方和比上样

Kmeans算法的K值和聚类中心的确定

0 K-means算法简介 K-means是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一. K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果. 算法过程如下: 1)从N个文档随机选取K个文档作为质心 2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 3)重新计算已经得到的各个类的质心 4)迭代2-3步直至新的质心与原质心相等或小于指定阈值,算法结束 参考Java代码

scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处 ====================================================================== K-means算法分析与Python代码实现请参考之前的两篇博客: <机器学习实战>k

转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处 ======================================

聚类算法(K-means聚类算法)

在数据分析挖掘过程中常用的聚类算法有1.K-Means聚类,2.K-中心点,3.系统聚类. 1.K-均值聚类在最小误差基础上将数据划分为预定的类数K(采用距离作为相似性的评价指标).每次都要遍历数据,所以大数据速度慢 2.k-中心点,不采用K-means中的平均值作为簇中心点,而是选中距离平均值最近的点最为簇中心点. 3.系统聚类又叫多层次聚类,分类是由高到低(可以想象下二叉树这种结构),越靠后,包含的数据点越少,但共同特征越多,缺点是不适合大数据量,速度慢. K-mans聚类实战代码: #-*

SparkMLlib聚类学习之KMeans聚类

(一),KMeans聚类 k均值算法的计算过程非常直观: 1.从D中随机取k个元素,作为k个簇的各自的中心. 2.分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇. 3.根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数. 4.将D中全部元素按照新的中心重新聚类. 5.重复第4步,直到聚类结果不再变化. 6.将结果输出. (二),Spark下KMeans的应用 1,数据集下载:数据来源电影集ml-100k,解压后内容如下: 2,加载数据

k-means聚类算法C++实现

原文:http://www.cnblogs.com/luxiaoxun/archive/2013/05/09/3069594.html Clustering 中文翻译作“聚类”,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它“这个东西被分为某某类”这样一些例子,理想情况下,一个 classifier 会从它得到的训练集中进行“学习”,从而具备对未知数据进行分类的能力,这种提供训练数据的过程通常叫做 superv

机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定,可视化数据分布,直观确定即可): 2 遍历数据集的每个实例,计算其到每个质心的相似度,这里也就是欧氏距离:把每个实例都分配到距离最近的质心的那一类,用一个二维数组数据结构保存,第一列是最近质心序号,第二列是距离: 3 根据二维数组保存的数据,重新计算每个聚簇新的质心: 4 迭代2 和 3,直到收敛