zoukankan      html  css  js  c++  java
  • Mahout kmeans聚类

    Mahout  K-means聚类

    一、Kmeans 聚类原理

    K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。

    假设要把样本集分为c个类别,算法描述如下:

    (1)适当选择c个类的初始中心;

    (2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;

    (3)利用均值等方法更新该类的中心值;

    (4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

    算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式

    二、Mahout kmeans实现

     Mahout kmeans MapReduce实现的原理和上述的一致,值得注意的是,Mahout将数据存储在HDFS,用MapReduce做批量并行的计算。在做kmeans之前,需要将文本用Mahout向量化模块工具做向量化。计算过程主要分为三个步骤:初始中心选取,寻找簇中心,划分数据。

    (一) 簇定义

    簇Cluster是一个实体,保存该簇的关键信息。

     privateint id; 簇编号

    核心参数:计算完数据后最终的簇属性

     private long numPoints; 簇中点的个数

     private Vector center; 中心向量 center=

     private Vector radius; 半径向量 radius =

    调整参数:簇中加入一个点后调整的参数

     private double s0; s0= 权重和。对于Kmeansw=1 ,所有s0=numPoints

     private Vector s1;  s1=  x pointw为权重。对kmeansw =1

     private Vector s2 ;  s2= x pointw为权重。对kmeansw =1

    (二) 初始中心点选择

    (1)RandomSeedGenerator 将输入的向量随机选择K个输出到HDFS作为Kmeans 聚类的初始中心点。

    (2)另一种将Canopy计算出的簇中心作为kmeans聚类的初始中心点。

    (三) 迭代更新中心

      通过不断的迭代,移动簇中心。该过程划分为两个部分,一个是簇划分Job,一个是控制迭代循环。

    1.簇划分Job过程:

          Map:

    Collection<Cluster> clusters = newArrayList<Cluster>()

    setUp(){

                         读入上一次输出的全部中心点,填充cluster。

    }

    Map(WritableComparable<?> key, VectorWritable point){

    用KMeansClustererclusterer 将point 划分到cluster中距离最近的一个cluster中。

    输出: key  clusterID ,value  ClusterObservations

    }

    }

      Combiner:

        Reduce(key clusterID ,value  Iterator<ClusterObservations> it ){

                 计算同一个cluster的局部参数。

        }

       Reduce:

         Reduce(key  clusterID ,value  ClusterObservations){

    计算同一cluster的全局参数。

    计算cluster的新中心。

    对比之前的中心,计算是否收敛。

    替换新的中心点作为cluster的中心。

    输出 keyclusterID,value Cluster

    }

    2.循环过程

     while(!收敛||没有达到相应的迭代次数){

         1.执行迭代Job,输入全部数据,输出新的簇中心;

         2.判断是否有簇没有收敛。只要有一个簇没有收敛,则断定为全局不收敛。

     }

    (四) 划分数据

      划分数据过程是对简单的,只需要计算向量和所有簇的距离,将其划分到距离最小的一个簇中。由一个map完成。

    Map:

    Collection<Cluster> clusters = new ArrayList<Cluster>()

    setUp(){

    读取最终收敛的簇,填充clusters。

    }

    Map(WritableComparable<?> key, VectorWritable point){

       Double min = 0 ;

       String clusterID ;

           While(cluster :clusters){

          计算min;

          得到最小距离的clusterID;

          }

           输出:clusterID ,point

         }

    三、API说明

    API

    KMeansDriver.main(args);

    --input(-i)

    输入路径

    --outpu(-o)

    输出路径

    --distanceMeasure(-dm)

    距离类权限命名,如“org.apache.mahout.common.distance.Cosine

    DistanceMeasure”

    --clusters(-c)

    中心点存储路径,如果该路径下没有中心点,则随机生成并写入该目录

    --numClusters(-k)

    簇个数

    --convergenceDelta(-cd)

    收敛值

    --maxIter(-x)

    最大迭代次数

    --overwrite(-ow)

    是否覆盖上次操作

    --clustering(-cl)

    是否执行聚类

    --method(-xm)

    默认”mapreduce”,或”sequential”

     

    示例

    String  [] arg=           {"-x","10",

                                              "-c","kmeans_center",

                                              "-i","vector fidf-vectors",

                                              "-o","kmeans",

                            "-dm","org.apache.mahout.common.distance.   EuclideanDistanceMeasure",

                                              "-k","3",

                                              "-cd","0.01",

                                              "-ow",

                                              "-cl",

                                              "-xm","mapreduce"};

                  KMeansDriver.main(arg);

     

    输出

    结果文件

    Key类型

    Value类型

    说明

    clusters-*

    类id (org.apache.hadoop.io.Text)

    类中心

    (org.apache.mahout.

    clustering.kmeans.Cluster)

    每条记录以类id和类中心表示一个类别

    clusteredPoints

    类id (org.apache.hadoop.io.IntWritable)

    文档向量

    (org.apache.

    mahout.clustering.WeightedVectorWritable)

    每条记录中,文档向量代表文档,类id代表该文档所属类别

    注:clusters-*中*代表数字,第i次迭代产生的类信息即为clusters-i

    四、参考文献

     1.《web数据挖掘》

  • 相关阅读:
    JDK1.8源码(四)——java.util.Arrays类
    JDK1.8源码(三)——java.lang.String类
    Java基础(六)——集合
    设计模式(二)——单例模式
    当你忘了数据库的设计语句,看这一篇就能拾起记忆
    MyBatis之配置优化
    Mybatis中的一些配置,直接拿来就可以用
    网络编程---ip&端口
    java基础数据类型小知识
    学习了MarkDown文本工具
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205088.html
Copyright © 2011-2022 走看看