内存有效的计算大型相关矩阵的方法?

时间:2017-01-08 21:46:56

标签: python numpy matrix

我有两个矩阵,其中变量是列,并且两个矩阵具有相同数量的样本。

一个矩阵是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)

然而,最终会占用大量内存,我在使用大约64GB的内存时会出现内存错误,并且最终可能会占用更多内存。有记忆效率的计算方法吗?

1 个答案:

答案 0 :(得分:3)

不幸的是,covcorrcoef函数不允许直接计算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,:])

您需要方差来归一化协方差矩阵。否则,只需要前四行。