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

Python 计算大型相关矩阵的高效内存方法?,python,numpy,matrix,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) 然而,这最终占用了大量内存,我得到了一个内存错误,大约使用了64G

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

一个矩阵是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的内存,它可能会占用更多的内存。有没有一种有效的内存计算方法

不幸的是,
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,:])

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

您想要实现什么?您的问题有100200个变量,因此相关矩阵将为100200 x 100200。您是否只对第一组变量和第二组变量之间的相关性感兴趣(这将使结果为200 x 100000)?据我所知,返回的完整矩阵的形式为:
xx | xy yx | yy
,因此我只想要
yx
xy
,即
yx.T
,谢谢,这是闪电般的速度,几乎不占用任何内存。