scipy稀疏矩阵的cov2corr()

0 投票
1 回答
31 浏览
提问于 2025-04-12 07:20

我怎么把(很大)稀疏的协方差矩阵变成稀疏的相关矩阵呢?

根据这个代码的说明 statsmodels.stats.moment_helpers.cov2corr(),如果协方差矩阵不太大,我可以逐个元素地把它除以(密集的)标准差的外积,然后再转换回稀疏形式:

import numpy as np
from scipy import sparse

A = np.array([
  [1.0, 0.2, 0.3, 0.0, 0.0],
  [0.2, 2.0, 1.0, 0.0, 0.0],
  [0.3, 1.0, 3.0, 0.0, 0.0],
  [0.0, 0.0, 0.0, 1.0, 0.5],
  [0.0, 0.0, 0.0, 0.5, 4.0]])
cov = sparse.csr_matrix(A)
cor = sparse.csr_matrix(cov / np.outer(np.sqrt(cov.diagonal()), np.sqrt(cov.diagonal())))

cor.toarray()
array([[1.        , 0.14142136, 0.17320508, 0.        , 0.        ],`
      [0.14142136, 1.        , 0.40824829, 0.        , 0.        ],`
      [0.17320508, 0.40824829, 1.        , 0.        , 0.        ],`
      [0.        , 0.        , 0.        , 1.        , 0.25      ],`
      [0.        , 0.        , 0.        , 0.25      , 1.        ]])`

不过,密集的标准差外积是 n X n 的,对于 n = 100K 或更大,这样做会浪费很多内存,即使有很大的内存也可能不够用。

1 个回答

2

回答自己提问的习惯不好,不过这个解决办法真的很简单也很酷,而且不需要逐个元素进行除法。我们只需要用一个稀疏对角矩阵(对角线上是标准差的倒数)来左右乘稀疏协方差矩阵就可以了:

S = sparse.diags(1/np.sqrt(cov.diagonal()))
cor = S @ cov @ S

撰写回答