如何将(大)稀疏协方差矩阵转换为稀疏相关矩阵?
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 及以上,即使使用大 RAM,如果可能的话,这也是浪费。
回答我自己的问题是个坏习惯,但解决方案非常简单和酷,没有按元素划分。需要将稀疏协方差矩阵从左到右乘以对角线上具有逆标准差的稀疏对角矩阵:
S = sparse.diags(1/np.sqrt(cov.diagonal()))
cor = S @ cov @ S