【问题标题】:Pearson correlation on big numpy matrices大 numpy 矩阵上的皮尔逊相关性
【发布时间】:2015-07-18 12:17:03
【问题描述】:

我有一个 24000 * 316 的 numpy 矩阵,每一行代表一个具有 316 个时间点的时间序列,我正在计算每对这些时间序列之间的 pearson 相关性。结果意味着我将有一个 24000 * 24000 具有 pearson 值的 numpy 矩阵。 我的问题是这需要很长时间。我已经在较小的矩阵(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

谢谢

【问题讨论】:

  • 您应该查看代码示例中的缩进(并编辑您的帖子以修复它!)。这是不对的,它确实会影响您的程序是否会按呈现方式运行。
  • 你打算用那个 24000*24000 矩阵做什么?也许您可以分批工作并汇总部分结果,因此您永远不需要内存或磁盘中的完整 24000*24000 矩阵。
  • @DavidW 感谢您指出这一点。在此处粘贴代码后缩进不正确。但是原始代码有适当的缩进,这意味着它正在工作并且我遇到了性能问题。
  • @WarrenWeckesser 在获得巨大的矩阵后,我将根据某种方法(FDR)对其进行阈值处理,在此过程中我需要同时需要所有 pearson 值,所以我必须保留他们……也许我能想出办法……我得好好想想。谢谢

标签: python performance numpy matrix pearson


【解决方案1】:

实现的主要问题是存储相关系数所需的内存量(至少 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 小时。如果你将它并行化,它应该会随着内核数量的增加而线性加速。

【讨论】:

  • 谢谢!我相信这会让一切变得更快,这也是我需要知道的!
猜你喜欢
  • 2019-08-31
  • 1970-01-01
  • 2016-08-24
  • 2012-11-18
  • 1970-01-01
  • 2011-09-13
  • 2014-11-13
  • 2017-03-17
  • 2018-07-13
相关资源
最近更新 更多