【发布时间】: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 代码?有人做过吗?
标签: python r python-3.x scikit-learn sklearn-pandas