数据挖掘:Top 10 Algorithms in Data Mining(二)K-Means算法

来源:互联网 发布:张碧晨红玫瑰网络链接 编辑:程序博客网 时间:2024/05/18 14:45

先引用IDMer整理的图初步了解下K-means

k1

k2

K-means也被称为C-means,因为它的目标是要找到c个均值向量u1,u2,……uc。除上面提到的用处,k-means还常用于加速其它算法的收敛。聚类算法主要有两类:硬聚类和软聚类(FCM)。K-means属于前者。

K-means的两大难点是确定c的数值和避免算法的抖动(不稳定性)。对这两个问题都有大量的针对性的研究。

算法的伪代码为:

  1. Begin initialize n,c,u1,u2,……uc
  2.                Do 按照最近邻ui分类n个样本
  3.                               重新计算ui
  4.                Until u不再改变
  5.       Return u1,u2,……uc
  6. End

其复杂度为O(ndcT),d表示特征数量;T为迭代次数。实际应用中通常迭代次数都不会太多。

硬聚类k-means

  在该算法中任意样本属于类别i的概率要么是1要么是0. 所以在计算过程中距离度量算法确定之后,只需要计算样本离哪类的聚类中心近就将该样本划分为哪类,即样本属于该类的概率为1,属于其它c-1类的概率都为0. 这样的规则使得计算简单。但最后的聚类结果容易出现局部最优。因此,在次基础上,模糊K-means被提出,我们通常我们称为FCM(Fuzzy C-Means)。

k3

K-means聚类2维数据的迭代轨迹,图中用Voronoi网格标出分类结果。Voronoi单元中心即为聚类中心

软聚类FCM

在FCM中每个样本属于某类别的概率不是绝对的1或0,而是介于[0~1]之间的一个值。样本属于所有类别的概率和为1. 该样本在当前迭代中属于哪类的概率最大就将该样本划分到哪类中。

FCM算法伪代码:

  1.  begin initialize n,c,b, u1,u2,……ucP(wi|xj),i=1,2……c;j=1,2,……n
  2.                               归一化, P(wi|xj)
  3.                               do 重新计算ui
  4.                                              重新计算P(wi|xj)
  5.                               until uiP(wi|xj)变化很小
  6.                 return u1,u2,……uc
  7.  End

常用的结束条件:

  1. u1,u2,……uc的变化小于某个阈值
  2. 迭代次数T大于某个阈值。

由于对不熟悉的样本的收敛速度未知,通常两个条件都会设置。K-means通常也被归类为迭代优化算法。

归一化公式 :c1

计算ui公式:c2

计算P(wi|xj)公式:c3

k4 FCM聚类的迭代轨迹

关于FCM与k-means 性能的比较参考:http://www.eurojournals.com/ejsr_46_3_02.pdf

作为较早的基本算法,目前k-means和FCM都有较多实现。常用工具多有对其的支持,网上源码也较多。以matlab中FCM函数为100个随机树分2类的例子:

data = rand(100, 2);

[center,U,obj_fcn] = fcm(data, 2);

plot(data(:,1), data(:,2),'o');

maxU = max(U);

index1 = find(U(1,:) == maxU);

index2 = find(U(2, :) == maxU);

line(data(index1,1),data(index1, 2),'linestyle','none',...

     'marker','*','color','g');

line(data(index2,1),data(index2, 2),'linestyle','none',...

     'marker', '*','color','r');

另外,开源项目Mahout对K-Means进行了分布式实现。通过MapReduce实现的分布式K-means支持更大数据量的聚类。

更多信息参考:http://www.tnove.com/?cat=40

Wiki K-Means: http://en.wikipedia.org/wiki/K-means_clustering

Mahout学习——K-Means Clustering: http://www.cnblogs.com/vivounicorn/archive/2011/10/08/2201986.html



原创粉丝点击