【聚類】— Canopy算法


    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均值是什么意思呢?)
 
   個人理解而已。望讀者不吝賜教。
 
 
 
 
 
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM