我有一个由21个行业组成的相关矩阵,现在我想把这21个行业分成4到5组,把行为相似的行业归在一起。Maven们能告诉我如何在Python中做到这一点吗?提前感谢!
t9eec4r01#
您可以探索Pandas DataFrame.corr和scipy.cluster Hierarchical Clustering包的使用
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')
xmakbtuz2#
好吧,@Wes的回答是建议使用一些好的函数来完成任务,但是他使用了错误的函数。在阅读了一些文档之后,似乎你需要一个*压缩 * 成对距离矩阵,然后将其传递给spc.linkage函数,这是距离矩阵的上三角部分,逐行。它还说spc.pdist函数返回一个压缩形式的距离矩阵。然而,输入不是相关矩阵或类似的东西。它需要 * 观察 *,并将它们转换为给定度量的矩阵本身。现在,协方差矩阵或相关矩阵已经将观察结果总结为一个矩阵,这对你来说并不奇怪。它代表的不是距离,而是相关性。这里我不确定在数学上最合理的做法是什么,但我相信你可以通过计算1.0 - corr将这个相关矩阵转换为某种距离矩阵。让我们这样做:
spc.linkage
spc.pdist
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')
2条答案
按热度按时间t9eec4r01#
您可以探索Pandas
DataFrame.corr
和scipy.cluster
Hierarchical Clustering包的使用xmakbtuz2#
好吧,@Wes的回答是建议使用一些好的函数来完成任务,但是他使用了错误的函数。在阅读了一些文档之后,似乎你需要一个*压缩 * 成对距离矩阵,然后将其传递给
spc.linkage
函数,这是距离矩阵的上三角部分,逐行。它还说
spc.pdist
函数返回一个压缩形式的距离矩阵。然而,输入不是相关矩阵或类似的东西。它需要 * 观察 *,并将它们转换为给定度量的矩阵本身。现在,协方差矩阵或相关矩阵已经将观察结果总结为一个矩阵,这对你来说并不奇怪。它代表的不是距离,而是相关性。这里我不确定在数学上最合理的做法是什么,但我相信你可以通过计算
1.0 - corr
将这个相关矩阵转换为某种距离矩阵。让我们这样做: