K-means聚类算法

来源:互联网 发布:淘宝客怎么看 编辑:程序博客网 时间:2024/06/16 08:15

K-means聚类算法属于无监督学习,样本不带标签。其核心思想:由用户指定k个初始质心(initial centroids),以作为聚类的类别(cluster),重复迭代直至算法收敛。算法流程为:

  1. 随机在图中取K个质心,即有K类。
  2. 然后对剩余的每个点对每一个质心求距离,并将其归类为距离最近的质心,即找到其所属的类
  3. 对每一类重新求质心,新质心为这一类的中心点。
  4. 重复2、3步骤,直到所有点所属的类不再改变。以下图为例

首先给出原始数据{x1,x2,...,xn},这些数据没有被标记的。

初始化k个随机数据u1,u2,...,uk。这些xn和uk都是向量。

根据下面两个公式迭代就能求出最终所有的u,这些u就是最终所有类的中心位置。

公式一:


意思就是求出所有数据和初始化的随机数据的距离,然后找出距离每个初始数据最近的数据。

公式二:

意思就是求出所有和这个初始数据最近原始数据的距离的均值。

然后不断迭代两个公式,直到所有的u都不怎么变化了,就算完成了。

K-Means++算法

K-Means主要有两个最重大的缺陷——都和初始值有关:

  • K是事先给定的,这个K值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。
  • K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)

K-Means++算法步骤:

  1. 先从数据库随机挑个随机点当“种子点”。
  2. 对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
  3. 然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
  4. 重复第(2)和第(3)步直到所有的K个种子点都被选出来。
  5. 进行K-Means算法

参考资料:
1、http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html
2、http://www.cnblogs.com/tiandsp/archive/2013/04/24/3040883.html
3、http://www.csdn.net/article/2012-07-03/2807073-k-means

原创粉丝点击