如何使用相关系数矩阵进行聚类?

Posted

技术标签:

【中文标题】如何使用相关系数矩阵进行聚类?【英文标题】:How to do clustering using the matrix of correlation coefficients? 【发布时间】:2016-10-30 10:37:26 【问题描述】:

我有一个相关系数矩阵 (n*n)。

我可以在 SciPy 中使用链接和 fcluster 函数吗?

联动函数需要n * m矩阵(根据教程),但我想使用n*n矩阵。

我的代码是

corre = mp_N.corr()    # mp_N is raw data (m*n matrix)  
Z = linkage(corre, method='average')  # 'corre' is correlation coefficient matrix
fcluster(Z,2,'distance')

这段代码对吗? 如果这段代码有误,如何用相关系数矩阵进行聚类?

【问题讨论】:

没有示例数据、预期结果和返回结果,没有人可以判断您的代码是否正确。请创建一个Minimal, Complete, and Verifiable example。此外,您还可以在 scikit-learn 包中找到更多集群库和示例。 【参考方案1】:

使用相关矩阵对数据进行聚类是一个合理的想法,但必须先对相关性进行预处理。首先,numpy.corrcoef 返回的相关矩阵受机器算法误差的影响:

    它并不总是对称的。 对角线项并不总是 1

这些可以通过对转置取平均值,并用 1 填充对角线来解决:

import numpy as np
data = np.random.randint(0, 10, size=(20, 10))   # 20 variables with 10 observations each
corr = np.corrcoef(data)                         # 20 by 20 correlation matrix
corr = (corr + corr.T)/2                         # made symmetric
np.fill_diagonal(corr, 1)                        # put 1 on the diagonal

其次,任何聚类方法的输入,例如linkage,都需要衡量对象的相异度。相关性衡量相似性。所以需要进行转换,使得0相关映射为大数,1相关映射为0。

This blog post 讨论了这种数据转换的几种方式,并推荐了dissimilarity = 1 - abs(correlation)。这个想法是,强负相关也表明对象是相关的,就像正相关一样。下面是例子的延续:

from scipy.cluster.hierarchy import linkage, fcluster
from scipy.spatial.distance import squareform

dissimilarity = 1 - np.abs(corr)
hierarchy = linkage(squareform(dissimilarity), method='average')
labels = fcluster(hierarchy, 0.5, criterion='distance')

请注意,我们不会将完整的距离矩阵输入linkage,它需要先用squareform 压缩。

使用什么确切的聚类方法和阈值取决于您的问题的上下文,没有通用规则。通常,0.5 是用于相关性的合理阈值,所以我这样做了。使用我的 20 组随机数,我最终得到了 7 个簇:编码为 labels

[7, 7, 7, 1, 4, 4, 2, 7, 5, 7, 2, 5, 6, 3, 6, 1, 5, 1, 4, 2] 

【讨论】:

不错的答案!您提到的距离(相异性)和相关性(相似性)对我来说很重要。 squareform() 是相关的稠密矩阵形式和压缩向量形式之间转换的关键。在使相关性成为距离方面,让我补充一点,scipy 使用1 - corr,它与1 - abs(corr) 有不同的考虑。我不确定该使用哪一个,所以我决定遵循 scipy 的方式。 您的博文链接已过期。 我建议squareform(corr, checks=False, force='tovector')不要检查对角线元素(因为它们被丢弃)并强制转换方向。 labels 做什么来排序和绘制相关矩阵?

以上是关于如何使用相关系数矩阵进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章

如何为热图聚类 numpy 系数数组

MATLAB如何求相关系数

主成分分析法计算过程中,相关系数矩阵用matlab求出特征值后,如何确定给出的特征值跟各个指标的对应关系

协方差矩阵与相关系数矩阵

协方差矩阵与相关系数矩阵

如何利用matlab求相关系数?