我有一个稀疏矩阵(x)和一个数组(y)。我想计算矩阵和数组中每一列之间的相关性。下面是一个非常简单的方法,但速度很慢。我希望有人能有更快/更好的方法。
import numpy as np
from scipy.sparse import rand as r1
from numpy.random import rand as r2
np.random.seed(1000)
nrow,ncol = 50000,4000
x = r1(nrow, ncol, format='csr', density=.05)
y = (r2(nrow)<=.6).astype(int)
correl = [(n,np.corrcoef(np.asarray(x[:,n].todense()).reshape(-1), y)[0,1]) for n in xrange(ncol)]
print correl[:10]
1条答案
按热度按时间20jt8wwn1#
使用稀疏性,您可以轻松获得〉50倍的加速比:
样本输出:
说明:为了能够利用稀疏性,我们标准化y,它无论如何都是稠密的。然后计算x和y之间的原始相关性。因为此时y已经是零均值,所以x的均值是零。因此,仍然需要除以x的标准差。在这里,我们也可以通过计算原始的二阶矩并减去平方均值来避免通过稠密矩阵。
实施细节:请注意,我已经冒昧地切换到
csc
,它更适合这里(如果需要,在开始时添加x=x.tocsc()
)。我们使用np.add.reduceat
以矢量化的方式沿着“参差不齐”的列执行求和。从稀疏矩阵的csc
表示中选择indices
便于选择对应于x中的非零元素的y的元素。