4

24000 * 316 numpy マトリックスがあり、各行は 316 時点の時系列を表し、これらの時系列の各ペア間のピアソン相関を計算しています。結果として、ピアソン値を持つ 24000 * 24000 numpy 行列が得られることを意味します。私の問題は、これには非常に長い時間がかかることです。小さな行列 (200 * 200) でパイプラインをテストしましたが、動作します (まだ遅いですが)。これほど遅いと予想されるかどうか疑問に思っています(1日以上かかります!!!)。そして、それについて私ができること...これが私のコードであるのに役立つなら...特別なことや難しいことは何もありません..

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

1 に答える 1

4

実装の主な問題は、相関係数を格納するために必要なメモリの量 (少なくとも4.5 GB) です。すでに計算された係数をメモリに保持する理由はありません。このような問題では、numpy とうまく連携するので、hdf5 を使用して中間結果を保存するのが好きです。完全で最小限の作業例を次に示します。

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 時間しかかからないことがわかります。並列化した場合、コア数に比例して高速化されるはずです。

于 2015-05-07T19:34:31.617 に答える