層次聚類演算法 (hierarchical clustering method)又稱為系統聚類法、分級聚類法。
層次聚類演算法又分為兩種形式:
凝聚層次聚類:
首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。
**層次聚類:
首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇,直到達到了某個終結條件。
凝聚層次聚類:
本文介紹的為第一種形式,即凝聚層次聚類:
思路:每個樣本先自成一類,然後按距離準則逐步合併,減少類數。
演算法描述:
1)n個初始模式樣本自成一類,即建立n類:
g1(0),g2(0),…,gn(0)(g_group)
計算 各類之間(即各樣本間)的距離(相似性、相關性),得一n*n維距離矩陣。「0」表示初始狀態。
2)假設已求得距離矩陣d(n)(n為逐次聚類合併的次數),找出d(n)中的最小元素,將其對應的兩類合併為一類。由此建立新的分類:
g1(n+1),g2(n+1),…
3)計算合併後新類別之間的距離,得d(n+1)。
4)跳至第二步,重複計算及合併。
結束條件:
取距離閾值t,當d(n)的最小分量超過給定值t時,演算法停止。所得即為聚類結果。
或不設閾值t,一直將全部樣本聚成一類為止,輸出聚類的分級樹。
問題討論:——類間距離計算準則
在演算法描述第一步中提到要計算每個聚類之間的距離,在層次聚類演算法中,計算聚類距離間距的計算方法主要有以下五種:
1)最短距離法:(常用)
如h、k是兩個聚類,則兩類間的最短距離定義為:
dhk = min xh∈h,xk∈k
dhk:h類中所有樣本與k類中所有樣本之間的最小距離。
d(xh,xk):h類中的某個樣本xh和k類中的某個樣本xk之間的歐式距離。
如果k類由i和j兩類合併而成,則:
dhi = min xh∈h,xi∈i
dhj = min xh∈h,xj∈j
得到遞推公式:
2) 最長距離法:
3)中間距離法:
介於最長與最短的距離之間。如果 k 類由 i 類和 j 類合併而成,則 h 和 k 類之間的距離為:
4)重心法:
將每類中包含的樣本數考慮進去。若 i 類中有 n i 個樣本, j 類中有 n j 個樣本,則類與類之間的距離遞推式為:
5)類平均距離法:
定義類間距離的方法不同,分類結果會不太一致。實際問題中常用幾種不同的方法,比較分類結果,從而選擇乙個比較切合實際的分類。
解釋說明見**中注釋
# coding=utf-8
from max_min_cluster import get_distance
def hierarchical_cluster(data, t):
# n個模式樣本自成一類
result = [[adata] for adata in data]
step2(result, t)
return result
def step2(result, t):
# 記錄類間最小距離
min_dis = min_distance(result[0], result[1]) # 初始為1,2類之間的距離
# 即將合併的類
index1 = 0
index2 = 1
# 遍歷,尋找最小類間距離
for i in range(len(result)):
for j in range(i+1, len(result)):
dis_temp = min_distance(result[i], result[j])
if dis_temp < min_dis:
min_dis = dis_temp
# 記錄即將合併的聚類位置下標
index1 = i
index2 = j
# 閾值判斷
if min_dis <= t:
# 合併聚類index1, index2
result[index1].extend(result[index2])
result.pop(index2)
# 迭代計算,直至min_dis>t為止
step2(result, t)
def min_distance(list1, list2):
# 計算兩個聚類之間的最小距離:
# 遍歷兩個聚類的所有元素,計算距離(方法較為笨拙,有待改進)
min_dis = get_distance(list1[0], list2[0])
for i in range(len(list1)):
for j in range(len(list2)):
dis_temp = get_distance(list1[i], list2[j]) # get_distance()函式見另一篇博文《聚類演算法——最大最小距離演算法》
if dis_temp < min_dis:
min_dis = dis_temp
return min_dis
# 測試hierarchical_cluster
# data = [[0, 3, 1, 2, 0], [1, 3, 0, 1, 0], [3, 3, 0, 0, 1], [1, 1, 0, 2, 0],[3, 2, 1, 2, 1], [4, 1, 1, 1, 0]]
# t = math.sqrt(5.5)
# result = hierarchical_cluster(data, t)
# for i in range(len(result)):
# print "----------第" + str(i+1) + "個聚類----------"
# print result[i]
# 結果為:
# ----------第1個聚類----------
# [[0, 3, 1, 2, 0], [1, 3, 0, 1, 0], [1, 1, 0, 2, 0]]
# ----------第2個聚類----------
# [[3, 3, 0, 0, 1]]
# ----------第3個聚類----------
# [[3, 2, 1, 2, 1], [4, 1, 1, 1, 0]]
注:本次**實現中採取的類間距離計算準則為最短距離法,但並未採取文中介紹的遞推公式,而是採取的較為簡單的遍歷方式,資料量較大時,演算法效率較低,讀者有時間的話可以思考嘗試所介紹的遞推方式。
本文簡單的介紹了聚類演算法——層次聚類演算法中凝聚層次聚類的相關內容,以及相應的**實現,如果有錯誤的或者可以改進的地方,歡迎大家指出。
層次聚類演算法(一)
層次聚類 hierarchical clustering 試圖在不同層次上對資料集進行劃分,從而形成樹形的聚類結構,資料集的劃分可採用 自底向上 的聚合策略,也可以採用 自頂向下 的分拆策略。即層次聚類可以是凝聚的也可以是 的。凝聚的層次聚類方法使用自底向上的策略。即剛開始每個點都認為是乙個簇,然後...
層次聚類演算法(二)
上篇博文簡單的講述了層次聚類的基本概念,接下來就是具體的講述凝聚的聚類演算法agnes演算法與 的聚類演算法diana聚類演算法。agnes演算法 演算法描述 輸入 包含n個物件的資料庫,終止條件簇的數目k 輸出 k個簇 1 將每個物件當成乙個初始簇 2 repeat 3 根據兩個簇中最近的資料點找...
層次聚類演算法(三)
上邊博文學習了一下agnes演算法與diana演算法,針對伸縮性差一級不能撤銷先前步驟所做的工作,學習一下birch聚類演算法。birch演算法 balanced iterative reducing and clustering using hierarchies.利用層次結構的平衡迭代規約和聚類...