在Python scipy/numpy中进行相关性的层次聚类?

13 投票
2 回答
13985 浏览
提问于 2025-04-15 23:09

我想知道如何在 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 给你。

撰写回答