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 表示
各點的加權和

S2 表示各點平方的加權和

聚類分析的抽象是計算: NumPoint、Radius、Center、(其中 Radius、Center 均是N維向量)
計算公式推導如下:
NumPoint = S0
Center = S1/S0
Radius = Sqrt(S2*S0-S1*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均值是什么意思呢?)
個人理解而已。望讀者不吝賜教。