在Python中使用相关矩阵创建聚类

pdkcd3nj  于 2023-04-19  发布在  Python
关注(0)|答案(2)|浏览(131)

我有一个由21个行业组成的相关矩阵,现在我想把这21个行业分成4到5组,把行为相似的行业归在一起。
Maven们能告诉我如何在Python中做到这一点吗?提前感谢!

t9eec4r0

t9eec4r01#

您可以探索Pandas DataFrame.corrscipy.cluster Hierarchical Clustering包的使用

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')
xmakbtuz

xmakbtuz2#

好吧,@Wes的回答是建议使用一些好的函数来完成任务,但是他使用了错误的函数。在阅读了一些文档之后,似乎你需要一个*压缩 * 成对距离矩阵,然后将其传递给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')

相关问题