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

4

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

一个矩阵是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的内存时,我会收到内存错误的提示,而且可能会占用更多的内存。是否有一种内存效率更高的计算方法?


你想要达到什么目的?你的问题有100200个变量,因此相关矩阵将是100200 x 100200。你只对第一组和第二组变量之间的相关性感兴趣吗(这将使结果为200 x 100000)? - Roland W
据我所知,返回的完整矩阵形式如下: yx | yy所以我只想要 yxxy,这将是 yx.T - UberStuper
1个回答

4

很遗憾,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,:])

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

1
谢谢,这非常快速且几乎不占用内存。 - UberStuper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接