Mahout系列之Canopy聚类算法分析

    俗话说的好,物以类聚,那么数据呢,也是可以聚一聚的。这个就是我们机器学习中常说的聚类算法。聚类的思想和过程,说起来很简单明了,就是根据某种或者某些特性(比如数据分布),计算或者判断数据之间的相似性,将相似的作为一类,逐步使得属于同一类的数据之间的距离最小,而不同类之间的距离达到最大,这样就认为是较优的聚类方法。聚类分析的算法可以分为划分法(Partitioning Methods)、层次法(Hierarchical Methods)、基于密度的方法(density-based methods)、基于网格的方法(grid-based methods)、基于模型的方法(Model-Based Methods)。

    基于划分法基本思想的算法有:K-MEANS算法、K-MEDOIDS算法、CLARANS算法;

    层次法(hierarchical methods),代表算法有:BIRCH算法、CURE算法、CHAMELEON算法等;

    基于密度的方法代表算法有:DBSCAN算法、OPTICS算法、DENCLUE算法等;

    基于网格的方法(grid-based methods)代表算法有:STING算法、CLIQUE算法、WAVE-CLUSTER算法;下去,于是出现一种简单而又有效地方法:Canopy Method,说简单是因为它不用什么高深的理论或推导就可以理解,说有效是因为它的实际表现确实可圈可点。

    对于这些算法,各有特点,后面有时间在针对有代表性的一些算法,一一给出实现的方法和算法的原理,尤其是R的代码实现。

    聚类的算法或者说思想不是太难,但是如果有大量的类别,大量的特征,海量的数据的情况下,该怎么来做呢?传统的这些算法可能是吃不消了。这里来介绍下,在mahout中的Canopy算法。(下面摘自网上)

    1、基于Canopy Method的聚类算法将聚类过程分为两个阶段

      Stage1、聚类最耗费计算的地方是计算对象相似性的时候,Canopy Method在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy ,通过一系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况,可以把这一阶段看做数据预处理;

      Stage2、在各个Canopy 内使用传统的聚类方法(如K-means),不属于同一Canopy 的对象之间不进行相似性计算。

      从这个方法起码可以看出两点好处:首先,Canopy 不要太大且Canopy 之间重叠的不要太多的话会大大减少后续需要计算相似性的对象的个数;其次,类似于K-means这样的聚类方法是需要人为指出K的值的,通过Stage1得到的Canopy 个数完全可以作为这个K值,一定程度上减少了选择K的盲目性。

    2、聚类精度

      对传统聚类来说,例如K-means、Expectation-Maximization、Greedy Agglomerative Clustering,某个对象与Cluster的相似性是该点到Cluster中心的距离,那么聚类精度能够被很好保证的条件是:

      对于每个Cluster都存在一个Canopy,它包含所有属于这个Cluster的元素。

      如果这种相似性的度量为当前点与某个Cluster中离的最近的点的距离,那么聚类精度能够被很好保证的条件是:

      对于每个Cluster都存在若干个Canopy,这些Canopy之间由Cluster中的元素连接(重叠的部分包含Cluster中的元素)。

      数据集的Canopy划分完成后,类似于下图:


     Mahout在实现的时候使用的Mapreduce方法来解决针对海量数据的问题,在分布式的情况下采用并行计算的方式,就是生成Canopy的过程可以并行,第一阶段,各个slave可以依据存储在本地的数据,各自在本地用上述算法生成若干Canopy,最后在master机器将这些Canopy用相同算法汇总后得到最终的Canopy集合,第二阶段聚类操作就利用最终的Canopy集合进行。

      用map-reduce描述就是:datanode在map阶段,利用上述算法在本地生成若干Canopy,之后通过reduce操作得到最终的Canopy集合。



   下面来实际在Hadoop里面是驴子是马拉出来溜溜。

   1下载测试用的数据集,上传到HDFS

      wget http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data

      这是一个600行*60列的数据

   

2. 运行Mapreduce Job

# canopy
hadoop jar mahout-examples-0.11.0-job.jar org.apache.mahout.clustering.syntheticcontrol.canopy.Job


# kmeans
hadoop jar mahout-examples-0.11.0-job.jar org.apache.mahout.clustering.syntheticcontrol.kmeans.Job


3.  查看并分析结果





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值