層次聚類


層次聚類也叫分層聚類,對數據進行逐層划分,最終形成樹狀的聚類結構。

數據集的划分可采用 “自頂向下” 的分割策略,也可采用 “自下而上” 的聚合策略。

 

聚合法-AGNES 算法

采用自下而上的聚合策略,初始每個樣本為一個簇,然后每步找到距離最近的兩個簇,並將它們融合,依次進行下去,直到所有樣本在一個簇,或者到達指定類別數。

 

最短距離可以有多種定義

最小距離:兩個簇中距離最近的樣本之間的距離;用最小距離的層次聚類被稱為 單鏈接

最大距離:兩個簇中距離最遠的樣本之間的距離;用最大距離的層次聚類被稱為 全鏈接

平均距離:兩個簇中所有樣本的距離的平均值;用平均距離的層次聚類被稱為 均鏈接

 

還有其他的距離計算方式,匯總如下

 

具體算法如下

 

分割法-DIANA 算法

采用自上而下的分割策略,初始所有樣本為一個簇,每步將一個簇分成兩個簇,使得這兩個簇盡可能遠離,遞歸的分割下去,直到每個樣本為一個簇或者到達指定類別數。

 

道理非常簡單,實現類似聚合法,具體不再贅述

 

層次聚類的優缺點

優點:距離定義簡單;可以不預先設定類別數;可以發現類別間的層次關系;可以生成非球形簇

缺點:計算量大;對異常值敏感;很可能聚類成鏈狀

 

python - API

方法1

from sklearn.cluster import AgglomerativeClustering
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
              [4, 2], [4, 4], [4, 0]])
clustering = AgglomerativeClustering().fit(X)

print clustering.labels_        # [1 1 1 0 0 0]

 

方法2

from scipy.cluster.hierarchy import dendrogram, linkage,fcluster
from matplotlib import pyplot as plt
X = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
# X = [[1,2],[3,2],[4,4],[1,2],[1,3]]
Z = linkage(X, 'ward')
f = fcluster(Z,4,'distance')
fig = plt.figure(figsize=(5, 3))
dn = dendrogram(Z)
plt.show()

 

總結

層次聚類多用於 軌跡 或者 GPS 數據。

 

 

參考資料:

https://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html  sklearn 層次聚類

https://blog.csdn.net/tan_handsome/article/details/79371076    scipy 層次聚類


免責聲明!

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



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