计算矩阵的 Matthew 相关系数需要很长时间

Posted

技术标签:

【中文标题】计算矩阵的 Matthew 相关系数需要很长时间【英文标题】:Calculating Matthew correlation coefficient for a matrix takes too long 【发布时间】:2019-02-21 12:20:53 【问题描述】:

我想计算两个矩阵 A 和 B 的 Matthew 相关系数。循环 A 的列,并计算该列和矩阵 B 的所有 2000 行的 MCC,然后取最大索引。代码是:

import numpy as np
import pandas as pd
from sklearn.metrics import matthews_corrcoef as mcc

A = pd.read_csv('A.csv', squeeze=True)
B = pd.read_csv('B.csv', squeeze=True)

ind = 
for col in A:
   ind[col] = np.argmax(list(mcc(B.iloc[i], A[col]) for i in range(2000)))
   print(ind[col])

我的问题是它需要很长时间(每列一秒钟)。我在 R 中看到几乎相同的代码运行得更快(比如 5 秒)。怎么会这样?我可以改进我的 Python 代码吗?


R 代码:

A <- as.matrix(read.csv(file='A.csv'))
B <- t(as.matrix(read.csv(file='B.csv', check.names = FALSE)))
library('mccr')
C <- rep(NA, ncol(A))
for (query in 1:ncol(A)) 
    mcc <- sapply(1:ncol(B), function(i) 
           mccr(A[, query], B[, i]))
    C[query] <- which.max(mcc)

【问题讨论】:

您可能应该使用 numpy 为两组向量实现它。该公式对于矩阵的并行化非常简单 (en.wikipedia.org/wiki/Matthews_correlation_coefficient) 我不认为 mcc() 是瓶颈。即使你只是做点积 (dot()) 也需要很多时间。你是什​​么意思并行化?使用 Tensorflow 什么的?为什么 R 可以开箱即用地快速完成? 我只是说使用循环总是比矩阵运算慢得多。在这里,您可以通过以矩阵方式计算相关性来避免 2000x2000 循环 所以您建议使用矩阵而不是标量重写 MCC 代码?有人做过吗? 【参考方案1】:

也许在 python 中使用 numpy 和 dot 产品试试这个

def compute_mcc(true_labels, pred_labels):
    """Compute matthew's correlation coefficient.

    :param true_labels: 2D integer array (features x samples)
    :param pred_labels: 2D integer array (features x samples)
    :return: mcc (samples1 x samples2)
    """
    # prep inputs for confusion matrix calculations
    pred_labels_1 = pred_labels == 1; pred_labels_0 = pred_labels == 0
    true_labels_1 = true_labels == 1; true_labels_0 = true_labels == 0
    
    # dot product of binary matrices
    confusion_dot = lambda a,b: np.dot(a.T.astype(int), b.astype(int)).T
    TP = confusion_dot(pred_labels_1, true_labels_1)
    TN = confusion_dot(pred_labels_0, true_labels_0)
    FP = confusion_dot(pred_labels_1, true_labels_0)
    FN = confusion_dot(pred_labels_0, true_labels_1)

    mcc = (TP * TN) - (FP * FN)
    denom = np.sqrt((TP + FP) * (TP + FN) * (TN + FP) * (TN + FN))
    
    # avoid dividing by 0
    denom[denom == 0] = 1

    return mcc / denom

【讨论】:

以上是关于计算矩阵的 Matthew 相关系数需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

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

Python遥感图像处理应用篇(二十四):Python绘制遥感图像各波段热力图(相关系数矩阵)

Python遥感图像处理应用篇(二十四):Python绘制遥感图像各波段热力图(相关系数矩阵)

Python遥感图像处理应用篇(二十四):Python绘制遥感图像各波段热力图(相关系数矩阵)

Python遥感图像处理应用篇(二十七):Python绘制遥感图像各波段热力图(相关系数矩阵)(续)

Python遥感图像处理应用篇(二十七):Python绘制遥感图像各波段热力图(相关系数矩阵)(续)