聚類演算法 層次聚類演算法

2021-12-30 05:29:59 字數 4355 閱讀 6802

層次聚類演算法 (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.利用層次結構的平衡迭代規約和聚類...