层次聚类树状图与AgglomerativeClustering结果不一致问题求解
结果不一致的核心原因
两次聚类使用的连接规则(linkage)不统一是问题根源:
- 生成树状图时,你调用scipy的
linkage函数指定的参数为complete(全连接,以两类样本的最大距离作为类间距离) - 调用sklearn的
AgglomerativeClustering时指定的参数为ward(沃德连接,以两类合并后的总方差增量作为合并依据)
两种合并规则逻辑完全不同,得到的聚类结果自然存在差异。
自动化获取与树状图匹配的分类结果
两种方案可选,都不需要手动提取索引:
方案1:统一sklearn的聚类参数与scipy一致
将AgglomerativeClustering的linkage参数修改为和scipy侧相同的complete即可,输出结果就会和树状图分类完全匹配:
from sklearn.cluster import AgglomerativeClustering cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='complete') output = cluster.fit_predict(dataset)
方案2:直接从scipy的linkage矩阵切分聚类
可以直接用scipy自带的fcluster工具,基于你已经生成的linked矩阵切分聚类,结果100%和树状图对应:
from scipy.cluster.hierarchy import fcluster # t指定聚类数量,criterion设为maxclust表示按指定类数切分 output = fcluster(linked, t=2, criterion='maxclust') # 若需要和sklearn一致的0起始标签,执行以下转换即可 # output = output - 1
二者的匹配规则
只要同时满足以下三个条件,scipy层次聚类结果和sklearn的AgglomerativeClustering结果完全一致:
- 距离度量统一:如两侧均使用欧氏距离(euclidean)
- 连接规则统一:两侧
linkage参数完全相同 - 切分类数统一:指定的聚类数量完全一致
你之前生成的树状图如下:
内容的提问来源于stack exchange,提问作者Kyv
相关产品推荐
相关产品推荐

