python进行层次聚类和k-means聚类
最近使用MDTraj对分子动力学轨迹进行聚类分析,接触到了python中的聚类实现,故将CSDN上一篇关于聚类的博客搬运至此,以作备忘: # scipy cluster库简介 scipy.cluster是scipy下的一个做聚类的package, 共包含了两类聚类方法: 1. 矢量量化(scipy.cluster.vq:支持vector quantization 和 k-means 聚类方法 2. 层次聚类(scipy.cluster.hierarchy:支持hierarchical clustering 和 agglomerative clustering(凝聚聚类)
聚类方法实现:k-means和hierarchical clustering.
1 | ###cluster.py |
可以看出层次聚类的结果和k-means还是有区别的.
补充:一些函数的用法
linkage(y, method='single', metric='euclidean')
共包含3个参数: y是距离矩阵,由pdist得到;method是指计算类间距离的方法,比较常用的有3种: (1)single:最近邻,把类与类间距离最近的作为类间距 (2)complete:最远邻,把类与类间距离最远的作为类间距 (3)average:平均距离,类与类间所有pairs距离的平均 其他的method还有如weighted,centroid等等,具体可以参考linkage
fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)
第一个参数Z是linkage得到的矩阵,记录了层次聚类的层次信息; t是一个聚类的阈值-“The threshold to apply when forming flat clusters”,在实际中,感觉这个阈值的选取还是蛮重要的.另外,scipy提供了多种实施阈值的方法(criterion): > inconsistent : If a cluster node and all its descendants have an inconsistent value less than or equal to t then all its leaf descendants belong to the same flat cluster. When no non-singleton cluster meets this criterion, every node is assigned to its own cluster. (Default) distance : Forms flat clusters so that the original observations in each flat cluster have no greater a cophenetic distance than t. ……
其他的参数我用的是默认的,具体可以参考fcluster
kmeans(obs, k_or_guess, iter=20, thresh=1e-05, check_finite=True)
输入obs是数据矩阵,行代表数据数目,列代表特征维度; k_or_guess表示聚类数目;iter表示循环次数,最终返回损失最小的那一次的聚类中心; 输出有两个,第一个是聚类中心(codebook),第二个是损失distortion,即聚类后各数据点到其聚类中心的距离的加和. 参考页面kmeans
vq(obs, code_book, check_finite=True)
根据聚类中心将所有数据进行分类.obs为数据,code_book则是kmeans产生的聚类中心. 输出同样有两个:第一个是各个数据属于哪一类的label,第二个和kmeans的第二个输出是一样的,都是distortion 参考页面vq
Source: - CSDN 博客