层次聚类及谱系图 介绍及python实现

1.谱系图介绍

如何看懂谱系图

2.代码实现

数据:test.xlsx在这里插入图片描述

import pandas as pd
import seaborn as sns  #用于画热图的工具包
from scipy.cluster import hierarchy  #用于进行层次聚类,画层次聚类图的工具包
from scipy import cluster
import matplotlib.pyplot as plt
from sklearn import decomposition as skldec #用于主成分分析降维的包

df = pd.read_excel(".../test.xlsx",index_col=0)
#df = df.T    #python默认每行是一个样本,如果数据每列是一个样本的话,转置一下即可

#开始画层次聚类树状图
Z = hierarchy.linkage(df, method ='ward',metric='euclidean')
hierarchy.dendrogram(Z,labels = df.index)

#在某个高度进行剪切
label = cluster.hierarchy.cut_tree(Z,height=0.8)
label = label.reshape(label.size,)

#根据两个最大的主成分进行绘图
pca = skldec.PCA(n_components = 0.95)    #选择方差95%的占比
pca.fit(df)   #主成分分析时每一行是一个输入数据
result = pca.transform(df)  #计算结果
plt.figure()  #新建一张图进行绘制
plt.scatter(result[:, 0], result[:, 1], c=label, edgecolor='k') #绘制两个主成分组成坐标的散点图
for i in range(result[:,0].size):
    plt.text(result[i,0],result[i,1],df.index[i])     #在每个点边上绘制数据名称
x_label = 'PC1(%s%%)' % round((pca.explained_variance_ratio_[0]*100.0),2)   #x轴标签字符串
y_label = 'PC1(%s%%)' % round((pca.explained_variance_ratio_[1]*100.0),2)   #y轴标签字符串
plt.xlabel(x_label)    #绘制x轴标签
plt.ylabel(y_label)    #绘制y轴标签

#层次聚类的热图和聚类图
sns.clustermap(df,method ='ward',metric='euclidean')
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.参数介绍

scipy.cluster.hierarchy.linkage(y, method='single',metric='euclidean',optimal_ordering=False)

y:需要进行层次聚类的数据,这里即可用使用开始读取的数据变量df
method:层次聚类选用的方法,下面罗列了七种方法,比如:

  • single方法代表将两个组合数据点中距离最近的两个数据点间的距离作为这两个组合数据点的距离
    这种方法容易受到极端值的影响。两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。
    两个簇之间的距离公式:
    在这里插入图片描述

  • complete方法与Single Linkage相反,将两个组合数据点中距离最远的两个数据点间的距离作为这两个组合数据点的距离。
    Complete Linkage的问题也与Single Linkage相反,两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合在一起。
    两个簇之间的距离公式:
    在这里插入图片描述

  • average方法代表是计算两个组合数据点中的每个数据点与其他所有数据点的距离。将所有距离的均值作为两个组合数据点间的距离。这种方法计算量比较大,但结果比前两种方法更合理。两个簇之间的距离公式:
    在这里插入图片描述

  • weighted 即两个簇之间的距离公式:
    在这里插入图片描述

  • centroid 即两个簇之间的距离公式:
    在这里插入图片描述

  • median 同centroid

  • ward 即两个簇之间的距离公式:
    在这里插入图片描述

metric:距离计算的方法,即上面方法中的dist()函数具体的计算方式,具体方式可以见这个页面
The distance metric to use. The distance function can be ‘braycurtis’, ‘canberra’, ‘chebyshev’, ‘cityblock’, ‘correlation’, ‘cosine’, ‘dice’, ‘euclidean’, ‘hamming’, ‘jaccard’, ‘jensenshannon’, ‘kulsinski’, ‘kulczynski1’, ‘mahalanobis’, ‘matching’, ‘minkowski’, ‘rogerstanimoto’, ‘russellrao’, ‘seuclidean’, ‘sokalmichener’, ‘sokalsneath’, ‘sqeuclidean’, ‘yule’.

————————————————
版权声明:代码实现及参数介绍部分 经CSDN博主「冬之晓东」的原创文章 修改完成。
原文链接:https://blog.csdn.net/qq_19528953/article/details/79133889

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值