层次聚类也叫分层聚类,对数据进行逐层划分,最终形成树状的聚类结构。
数据集的划分可采用 “自顶向下” 的分割策略,也可采用 “自下而上” 的聚合策略。
聚合法-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 层次聚类