在 Python 中使用相关矩阵创建集群

问题描述 投票:0回答:2

all,我有一个21个行业的相关矩阵。现在我想把这 21 个部门分成 4 或 5 个组,将具有相似行为的部门组合在一起。

专家能否告诉我如何在 Python 中执行此操作?提前致谢!

python matrix block correlation
2个回答
21
投票

您可能会探索使用 Pandas

DataFrame.corr
scipy.cluster
层次聚类包

import pandas as pd
import scipy.cluster.hierarchy as spc


df = pd.DataFrame(my_data)
corr = df.corr().values

pdist = spc.distance.pdist(corr)
linkage = spc.linkage(pdist, method='complete')
idx = spc.fcluster(linkage, 0.5 * pdist.max(), 'distance')

0
投票

好吧,@Wes 的回答是建议使用一些好的函数来完成任务,但是他用错了。在阅读了更多文档之后,您似乎需要一个 condensed pairwise distance matrix 然后再将其传递给

spc.linkage
函数,它是距离矩阵的上三角部分,逐行。

它还说

spc.pdist
函数返回该压缩形式的距离矩阵。但是,输入是 NOT 相关矩阵或类似的东西。它需要 observations 并根据指定的指标将它们转化为矩阵本身。

现在,协方差或相关矩阵已经将观察结果汇总到一个矩阵中,这对您来说并不奇怪。它不代表距离,而是代表相关性。在这里我不确定什么是数学上最合理的事情,但我相信你可以通过计算

1.0 - corr
.

将这个相关矩阵变成某种距离矩阵

所以让我们这样做:

pdist_uncondensed = 1.0 - corr
pdist_condensed = np.concatenate([row[i+1:] for i, row in enumerate(pdist_uncondensed)])
linkage = spc.linkage(pdist_condensed, method='complete')
idx = spc.fcluster(linkage, 0.5 * pdist_condensed.max(), 'distance')
© www.soinside.com 2019 - 2024. All rights reserved.