在Python scipy/numpy中进行相关性的层次聚类?
我想知道如何在 scipy
/numpy
中对一个相关性矩阵进行层次聚类。我有一个100行9列的矩阵,我想根据这9个条件下每个条目的相关性进行层次聚类。我想用1减去皮尔逊相关系数作为聚类的距离。假设我有一个 numpy
数组 X
,它包含这个100 x 9的矩阵,我该怎么做呢?
我试过使用 hcluster,参考了这个例子:
Y=pdist(X, 'seuclidean')
Z=linkage(Y, 'single')
dendrogram(Z, color_threshold=0)
但是,pdist
不是我想要的,因为它是欧几里得距离。有没有其他的想法呢?
谢谢。
2 个回答
0
我觉得使用seaborn的clustermap来进行层次聚类并可视化这个过程很有帮助。这个clustermap底层是用scipy来做聚类的,而我在计算距离时使用了“相关性”作为标准:
import seaborn as sns
from scipy.cluster.hierarchy import dendrogram
from scipy.spatial.distance import pdist, squareform
D = squareform(pdist(X.T, 'correlation'))
h = sns.clustermap(D, cmap='Reds')
你还可以得到相应的连接矩阵,并绘制出树状图。
Z = h.dendrogram_col.linkage
dendrogram(Z, color_threshold=0)
14
只需把指标改成 correlation
,这样第一行就变成:
Y=pdist(X, 'correlation')
不过,我觉得这段代码可以简化成:
Z=linkage(X, 'single', 'correlation')
dendrogram(Z, color_threshold=0)
因为链接功能会自动处理 pdist 给你。