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

时间:2016-06-28 08:04:48

标签: python scipy cluster-analysis correlation linkage

我有一个相关系数矩阵(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')

这段代码对吗? 如果此代码错误,我该如何使用相关系数矩阵进行聚类?

1 个答案:

答案 0 :(得分:2)

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

  1. 它并不总是对称的。
  2. 对角线术语并不总是正好1
  3. 这些可以通过使用转置取平均值并用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]