層次聚類也叫分層聚類,對數據進行逐層划分,最終形成樹狀的聚類結構。
數據集的划分可采用 “自頂向下” 的分割策略,也可采用 “自下而上” 的聚合策略。
聚合法-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 層次聚類