2017-01-08 4 views
3

У меня есть две матрицы, где переменными являются столбцы, и обе матрицы имеют одинаковое количество выборок.Память эффективные способы вычисления больших корреляционных матриц?

Одна матрица 800 на 200, а другой 800 по 100000. Я хочу, чтобы вычислить матрицу корреляции между столбцами этих матриц, поэтому я попытался это:

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) 

Однако это заканчивается беря большой объем памяти, я получаю ошибку памяти при использовании около 64 ГБ используемой памяти, и это может закончиться тем, что заняло больше места. Есть ли эффективный способ памяти для вычисления этого?

+0

Что вы пытаетесь достичь? Ваша проблема имеет 100200 переменных, поэтому матрица корреляции будет 100200 x 100200. Вас интересует только соотношение между первым и вторым набором переменных (что приведет к результату 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,:]) 

Вам нужна дисперсия нормализовать ковариационную матрицу. Кроме того, нужны только первые четыре строки.

+0

Спасибо, это было молниеносно и почти не занимало памяти. – UberStuper

Смежные вопросы