層次聚類之AGNES及Python實現
層次聚類
層次聚類,顧名思義,就是一層一層的進行聚類,它試圖在不同層次對資料集進行劃分,可以由上向下把大的類別分割,即“自頂向下”的分拆策略(見下面AGNES部分),也可以由下向上對小的類別進行聚合,即“自底向下”的聚合策略:開始把所有的樣本都歸為一類,然後逐步將他們劃分為更小的單元,直到最後每個樣本都成為一類。在這個迭代的過程中通過對劃分過程中定義一個鬆散度,當鬆散度最小的那個類的結果都小於一個閾值,則認為劃分可以終止。這種方法用的不普遍,在這裡不予詳細介紹。下面本文主要對採用自底向上聚合策略的AGNES(AGglomerative NESting)做一個介紹。
AGNES
AGNES,是一種採用自底向上聚合策略的層次聚類演算法,是先將資料集中的每個樣本看作一個初始聚類簇,然後在演算法執行的每一步中找出距離最近的兩個聚類簇進行合併,該過程不斷重複,直至達到預設的聚類簇個數,這裡的關鍵是如何計算聚類簇之間的距離。其實每個聚類簇就是一個樣本集合,聚類簇之間的聚類就是集合之間的聚類。
簇直接的距離
最小距離,是由兩個簇的最近樣本決定。如果層次聚類的距離度量函式採用,兩個簇之間的相似度由兩個簇中最近樣本決定,這樣容易造成Chaining的效果,即兩個簇明明從“大局”上離得比較遠,但是由於其中個別點的距離比較近就被合併了,並且這樣合併之後Chaining效應會進一步擴大,最後會得到比較鬆散的簇。
python程式碼實現:
#計算歐幾里得距離,a,b分別為兩個元組
def dist(a, b) :
return math.sqrt(math.pow(a[0]-b[0], 2)+math.pow(a[1]-b[1], 2))
#dist_min
def dist_min(Ci, Cj):
return min(dist(i, j) for i in Ci for j in Cj)
最大距離,由兩個簇的最遠樣本決定。這個則是最小距離的反面極端,其效果也是剛好相反的,限制非常大,兩個 cluster 即使已經很接近了,但是隻要有不配合的點存在,就頑固到底,老死不相合並,也是不太好的辦法。和這兩種相似度的定義方法的共同問題就是指考慮了某個有特點的資料,而沒有考慮類內資料的整體特點。
python程式碼實現:
#dist_max
def dist_max(Ci, Cj):
return max(dist(i, j) for i in Ci for j in Cj)
平均距離,由兩個簇所有樣本共同決定。就是把兩個集合中的點兩兩的距離全部放在一起求一個平均值,相對也能得到合適一點的結果。有時異常點的存在會影響均值,平常人和富豪平均一下收入會被拉高是吧,因此這種計算方法的一個變種就是取兩兩距離的中位數
python程式碼實現:
#dist_avg
def dist_avg(Ci, Cj):
return sum(dist(i, j) for i in Ci for j in Cj)/(len(Ci)*len(Cj))
演算法過程(摘抄於周志華的《機器學習》)
AGNES演算法描述如下所示,在第1-9行,演算法先對僅含一個樣本的初始聚類簇和相應的距離矩陣進行初始化;然後在第11-23行,AGNES不斷合併最近的聚類簇,並對合並得到的聚類簇的距離矩陣進行更新;上述過程不斷重複,直至達到預設的聚類簇數。
輸入:樣本集
聚類簇距離度量函式;
聚類簇數
過程:
1. for do
2.
3. end for
4. for do
5. for