Mahout in Action-Clustering-聚类算法

第九章聚类算法

9.1 K-means聚类

  K-means需要用户设定一个聚类个数(k)作为输入数据,有时k值可能非常大(10,000),这是Mahout闪光的(shines)地方,它确保聚类的可测量性。

  为了用k-means达到高质量的聚类,需要估计一个k值。估计k值一种近似的方法是根据你需要的聚类个数。比如100万篇文章,如果平均500篇分为一类,k值可以取2000(1000000/500)。这种估计聚类个数非常模糊,但k-means算法就是生成这种近似的聚类。

9.1.1 All you need to know about k-means

  下面看一下k-means算法的细节,K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。算法采用误差平方和准则函数作为聚类准则函数。K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。k个初始类聚类中心点的选取对聚类结果具有较大的。

  算法步骤:

  (1)随机选取任意k个对象作为初始聚类中心,初始代表一个簇;

  (2)计算点到质心的距离,并把它归到最近的质心的类;

  (3)重新计算已经得到的各个类的质心;

  (4)迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束。

  这种两步算法是最大期望算法(EM)的典型例子,

  第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;

  第二步是最大化(M),最大化在 E 步上求得的最大似然值来计算参数的值。

  M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。

9.1.2 Running k-means clustering

  K-mean聚类用到KMeansClusterer或KMeansDriver类,前一个是在内存(in-memory)里对节点聚类,后者采用MapReduce任务执行。这两种方法都可以就像一个普通的Java程序运行,并且可以从硬盘读取和写入数据。它们也可以在hadoop上执行聚类,通过分布式文件系统读写数据。

  下面举例,使用一个随机点生成器函数来创建一些点。这些点生成矢量格式的点作为一个正态分布围绕着一个中心。使用Mahout的in-memory K-means 聚类方法对这些点聚类。

  创建节点:generateSamples方法,取(1,1)为中心点,标准差为2,400个围绕着(1,1)的随机点,近似于正态分布。另外又取了2个数据集,中心分别为(1,0)和(0,2),标准差分别为0.5和0.1。

  KMeansClusterer.clusterPoints()方法用到一下参数:

  • List<Vector>作为输入;
  • 距离算法DistanceMeasure采用EuclideanDistanceMeasure;
  • 聚类的阈值Threshold为0.01;
  • 聚类的个数为3;
  • 聚类的中心点采用RandomPointsUtil,随机选取的节点。

  Mahout-example里的DisplayKMeans类可以直观的看到该算法在二维平面的结果,9.2节将介绍运行一个Java Swing application的DisplayKMeans。

  如果数据量很大时,应采取MapReduce运行方式,将聚类算法运行在多个机器上,每个mapper得到一个子集的点,每个子集运行一个mapper。这些mapper任务计算出最近的集群作为输入流。

  K-means聚类的MapReduce Job

  采用KMeansDriver类的run()方法,需要输入的参数有:

  • Hadoop的配置conf;
  • 输入Vectors的路径,SequenceFile格式;
  • 初始化聚类中心的路径,SequenceFile格式;
  • 输出结果的路径,SequenceFile格式;
  • 求相似距离时采用的方法,这里采用EuclideanDistanceMeasure;
  • 收敛的阈值,没有超过该阈值的点可移动时,停止迭代;
  • 最大迭代次数,这是硬性限制,到达该最大迭代次数时,聚类停止;
  • true-迭代结束后聚类;
  • true-串行执行该算法,false-并行执行该算法;

  public static void run(Configuration conf,Path input,Path clustersIn,Path output,
              DistanceMeasure measure,
              double convergenceDelta,
              int maxIterations,
              boolean runClustering,
              boolean runSequential)

  采用SparseVectorsFromSequenceFile工具,将sequenceFile转换成Vector,因为K-means算法需要用户初始化k个质心。

posted @ 2012-06-08 12:43  跳刀的兔子  阅读(3314)  评论(0编辑  收藏  举报