2017-01-08 12 views
3

私は変数が列であり、両方の行列が同じ数のサンプルを持つ2つの行列を持っています。大きな相関行列を計算するメモリ効率的な方法は?

一つの行列は200 800であり、他方が、私はこれを試してみたので、これらの行列の列間の相関行列を計算したい100000 800です:

import numpy as np 

def matcor(x, y): 
    xc = x.shape[1] 
    return np.corrcoef(x, y, rowvar=False)[xc:, :xc] 

xy_cor = matcor(X, Y) 

しかし、これが終わります大量のメモリを使用すると、使用されるメモリが約64GBになるとメモリエラーが発生し、それ以上のメモリを占有する可能性があります。これを計算するメモリ効率的な方法はありますか?

+0

達成しようとしていることは何ですか?あなたの問題には100200個の変数があるので、相関行列は100200 x 100200になります。最初の変数と2番目の変数の間の相関のみに興味がありますか?結果は200 x 100000になりますか? –

+0

私の理解から、返される完全な行列の形式は次のとおりです。 '' 'xx | xy yx | yy '' ' だから' yx'や 'xy'だけが' yx.T 'になります。 – UberStuper

答えて

3

残念ながら、covおよびcorrcoef関数では、xy相関のみの直接計算はできません。問題は明らかに大きすぎて取り組むことができないので、フルマトリクスを計算して後でスライスを抽出することはできません。これは現在行っている処理です。代わりに、手でxy一部を計算:

samples = x.shape[0] 
centered_x = x - np.sum(x, axis=0, keepdims=True)/samples 
centered_y = y - np.sum(y, axis=0, keepdims=True)/samples 
cov_xy = 1./(samples - 1) * np.dot(centered_x.T, centered_y) 
var_x = 1./(samples - 1) * np.sum(centered_x**2, axis=0) 
var_y = 1./(samples - 1) * np.sum(centered_y**2, axis=0) 
corrcoef_xy = cov_xy/np.sqrt(var_x[:, None] * var_y[None,:]) 

あなたは共分散行列を正規化するために分散する必要があります。そうでなければ、最初の4行だけが必要になります。

+0

ありがとう、これは高速で覚えていて、ほとんどメモリを消費しませんでした。 – UberStuper

関連する問題