Canopy一般用在K均值之前的粗聚类。考虑到K均值在使用上必须要确定K的大小,而往往数据集预先不能确定K的值大小的,这样如果K取的不合理会带来K均值的误差很大(也就是说K均值对噪声的抗干扰能力较差)。总之基于以下三种原因,选择利用Canopy聚类做为Kmeans的前奏比较科学、也是Canopy的优点。
 
Canopy的优点
 
    1、Kmeans对噪声抗干扰较弱,通过Canopy对比较小的NumPoint的Cluster直接去掉 有利于抗干扰。
    2、Canopy选择出来的每个Canopy的centerPoint作为Kmeans比较科学。
    3、只是针对每个Canopy的内容做Kmeans聚类,减少相似计算的数量。
 
 
Canopy的缺点算法中 T1、T2(T2 < T1 的确定问题 (在并行计算上Maper的T1、T2 可以和Raduce的T1、T2不同)
 
        
        Canopy的关键是以下公式:
 
        S0 表示Canopy包含点的权重之和  
 
       
        S1 表示各点的加权和      s_1=\sum\limit_{i=0}^{n}{x_iw_i}
 
 
        S2 表示各点平方的加权和  
 
 
 
        聚类分析的抽象是计算: NumPoint、Radius、Center、(其中 Radius、Center 均是N维向量)
   计算公式推导如下:
 
        NumPoint  =  S0
        Center       =  S1/S0    
        Radius      =   Sqrt(S2*S0-S1*S1)/S0 推导过程如下:
 
        std=\sqrt{\frac{\sum\limit_{i=0}^{n}{(x_i-\mu)^2} }{n}},其中\mu=\frac{1 }{n}\sum\limit_{i=0}^{n}{x_i}

               =\sqrt{\frac{\sum\limit_{i=0}^{n}({x_i^2}-2\mu x_i+\mu^2) }{n}}

               =\sqrt{\frac{\sum\limit_{i=0}^{n}{x_i^2} -2\mu \sum\limit_{i=0}^{n}{x_i} +n\mu^2  }{n}}=\sqrt{\frac{\sum\limit_{i=0}^{n}{x_i^2} -2n\mu^2 +n\mu^2  }{n}}

               =\sqrt{\frac{\sum\limit_{i=0}^{n}{x_i^2}  }{n}-\mu^2 } ,其中s1=s0 \quad \mu

               =\frac{\sqrt{s2\quad s0 -s1\quad s1}}{s0}

       
 
       单机版Canopy算法
 
            
                1、从PointList中取一个Point ,寻找已经建立好的Canopy 计算这个点于所有的Canopy的距离。如果和某一个Canopy的距离小于T1,                           则把这个点加到Canopy中,如果没有Canopy则选择这个点为一个Canopy的中心。
                2、如果这个店Point和某个Canopy的距离小于T2,则把这个点从PointList中删除(这个点以后做不了其他的Canopy的中心了)。
                3、循环直到所有的Point都被加入进来,然后计算各个Canopy的Center和Radius。
 
 
       模型MapReduce版本
 
 
                1、把数据整理成SequcnceFile格式(Mahout-InputMapper)作为初始化文件PointFile
                2、CanopyMapper阶段本机聚成小的Canopy 中间文件写成SequenceFile 这一步的T1、T2 和Reduce的T1、T2可以是不同的( index、Canpy)
                3、所有的Mapper阶段的输出到1个Reducer中 然后Reduce把Map阶段中的Center点再次做聚类算法。聚出全局的Canopy。同时计算每个Canopy的CenterPoint点。写到临时文件CenterPoint中。
                4、针对全集合PointFile在CenterPoint上的findClosestCanopy操作(通过传入的距离算法)。然后输出一个SequenceFile。 
 
 
     
        有2个问题不知道如何答案:
                        1、T1、T2 的选择(我需要采样计算出吗?)
                        2、如何和Kmeans结合?(只在Canopy内做K均值是什么意思呢?)
 
   个人理解而已。望读者不吝赐教。
 
 
 
 
 
    
posted on 2012-05-08 19:23  真心的不懂  阅读(13757)  评论(2编辑  收藏  举报