我有两个矩阵,其中变量是列,并且两个矩阵具有相同数量的样本。
一个矩阵是 800 x 200,另一个是 800 x 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,:])
您需要方差来归一化协方差矩阵。否则,只需要前四行。