scipy稀疏矩阵的cov2corr()
我怎么把(很大)稀疏的协方差矩阵变成稀疏的相关矩阵呢?
根据这个代码的说明 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