大 numpy 矩阵的皮尔逊相关性
Pearson correlation on big numpy matrices
我有一个 24000 * 316 的 numpy 矩阵,每一行代表一个具有 316 个时间点的时间序列,我正在计算这些时间序列的每一对之间的皮尔逊相关性。结果意味着我将有一个 24000 * 24000 numpy 矩阵具有 pearson 值。
我的问题是这需要很长时间。我已经在较小的矩阵 (200 * 200) 上测试了我的管道,它可以工作(尽管仍然很慢)。我想知道它是否预计会这么慢(需要超过一天!!!)。我能做些什么……
如果有帮助,这就是我的代码...没什么特别或困难的..
def SimMat(mat,name):
mrange = mat.shape[0]
print "mrange:", mrange
nTRs = mat.shape[1]
print "nTRs:", nTRs
SimM = numpy.zeros((mrange,mrange))
for i in range(mrange):
SimM[i][i] = 1
for i in range (mrange):
for j in range(i+1, mrange):
pearV = scipy.stats.pearsonr(mat[i], mat[j])
if(pearV[1] <= 0.05):
if(pearV[0] >= 0.5):
print "Pearson value:", pearV[0]
SimM[i][j] = pearV[0]
SimM[j][i] = 0
else:
SimM[i][j] = SimM[j][i] = 0
numpy.savetxt(name, SimM)
return SimM, nTRs
谢谢
实施的主要问题是存储相关系数所需的内存量(至少 4.5GB)。没有理由将已经计算出的系数保存在内存中。对于这样的问题,我喜欢使用 hdf5 来存储中间结果,因为它们可以很好地与 numpy 配合使用。这是一个完整的最小工作示例:
import numpy as np
import h5py
from scipy.stats import pearsonr
# Create the dataset
h5 = h5py.File("data.h5",'w')
h5["test"] = np.random.random(size=(24000,316))
h5.close()
# Compute dot products
h5 = h5py.File("data.h5",'r+')
A = h5["test"][:]
N = A.shape[0]
out = h5.require_dataset("pearson", shape=(N,N), dtype=float)
for i in range(N):
out[i] = [pearsonr(A[i],A[j])[0] for j in range(N)]
测试前 100 行表明这在单核上只需要 8 小时。如果将其并行化,它应该会随着内核数量的增加而线性加速。
我有一个 24000 * 316 的 numpy 矩阵,每一行代表一个具有 316 个时间点的时间序列,我正在计算这些时间序列的每一对之间的皮尔逊相关性。结果意味着我将有一个 24000 * 24000 numpy 矩阵具有 pearson 值。 我的问题是这需要很长时间。我已经在较小的矩阵 (200 * 200) 上测试了我的管道,它可以工作(尽管仍然很慢)。我想知道它是否预计会这么慢(需要超过一天!!!)。我能做些什么…… 如果有帮助,这就是我的代码...没什么特别或困难的..
def SimMat(mat,name):
mrange = mat.shape[0]
print "mrange:", mrange
nTRs = mat.shape[1]
print "nTRs:", nTRs
SimM = numpy.zeros((mrange,mrange))
for i in range(mrange):
SimM[i][i] = 1
for i in range (mrange):
for j in range(i+1, mrange):
pearV = scipy.stats.pearsonr(mat[i], mat[j])
if(pearV[1] <= 0.05):
if(pearV[0] >= 0.5):
print "Pearson value:", pearV[0]
SimM[i][j] = pearV[0]
SimM[j][i] = 0
else:
SimM[i][j] = SimM[j][i] = 0
numpy.savetxt(name, SimM)
return SimM, nTRs
谢谢
实施的主要问题是存储相关系数所需的内存量(至少 4.5GB)。没有理由将已经计算出的系数保存在内存中。对于这样的问题,我喜欢使用 hdf5 来存储中间结果,因为它们可以很好地与 numpy 配合使用。这是一个完整的最小工作示例:
import numpy as np
import h5py
from scipy.stats import pearsonr
# Create the dataset
h5 = h5py.File("data.h5",'w')
h5["test"] = np.random.random(size=(24000,316))
h5.close()
# Compute dot products
h5 = h5py.File("data.h5",'r+')
A = h5["test"][:]
N = A.shape[0]
out = h5.require_dataset("pearson", shape=(N,N), dtype=float)
for i in range(N):
out[i] = [pearsonr(A[i],A[j])[0] for j in range(N)]
测试前 100 行表明这在单核上只需要 8 小时。如果将其并行化,它应该会随着内核数量的增加而线性加速。