【python】利用scipy进行层次聚类
参考博客:
https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/
层次聚类理论知识
类从多减少的过程。
1、定义样本间的距离,类与类之间的距离
2、将每个样本当作一类,计算距离最近的两类,合并为新类
3、一点一点做,直到所有成为一类。
基本步骤:
1、数据变换:
中心化:demean
标准化:deStd
极差标准化:deMean / 极差
极差正规化:de min / 极差
对数变换
2、计算样品两两间距离
3、合并距离最小的两类,重新计算类与类之间的距离
4、画谱系聚类图
5、决定分类的个数以及各个类的成员。
类与类之间的距离不同定义:
1、最短距离法:两两之间最短距离
2、最长距离法
3、中间距离法
4、重心法:可能导致合并后下一次距离比前一次要短
5、类平均法:两两之间平方距离的平均值
6、离差平方和法:WARD
性质:
1、单调性:只有中间距离法和重心法不符合。
2、浓缩与扩张:太浓缩的方法不灵敏,太扩张的方法在样本比较多的时候容易失真
类个数的确定:
1、给定临界值、
2、根据散点图判断
3、根据统计量判断:
R2、半偏R2、伪F、伪T
来看代码:
from scipy.cluster.hierarchy import dendrogram, linkage Z = linkage(X, "single", "correlation") dendrogram(Z, labels=X.index, color_threshold=0) plt.show()
首先使用linkage函数生成距离矩阵。
method参数为距离定义:
single : 最短距离法
complete: 最长距离法
average: 类平均法, 与通常定义差一个sq, sqrt
centroid: 重心法
weighted: 中间距离法
ward: WARD法
使用fcluster函数确定最终的分组情况: