gpt4 book ai didi

python - 数组与稀疏矩阵的相关性

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:17 24 4
gpt4 key购买 nike

我有一个稀疏矩阵 (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]

最佳答案

使用稀疏性,您可以轻松获得 >50 倍的加速:

import numpy as np
from scipy.sparse import rand as r1
from numpy.random import rand as r2
from time import time

np.random.seed(1000)

nrow,ncol = 5000,4000
x = r1(nrow, ncol, format='csc', density=.05)
y = (r2(nrow)<=.6).astype(int)

t = []
t.append(time())
correl = [np.corrcoef(np.asarray(x[:,n].todense()).reshape(-1), y)[0,1] for n in xrange(ncol)]

t.append(time())

yy = y - y.mean()
xm = x.mean(axis=0).A.ravel()
ys = yy / np.sqrt(np.dot(yy, yy))
xs = np.sqrt(np.add.reduceat(x.data**2, x.indptr[:-1]) - nrow*xm*xm)

correl2 = np.add.reduceat(x.data * ys[x.indices], x.indptr[:-1]) / xs

t.append(time())

print 'results equal --', np.allclose(correl, correl2)
print 'run time (sec) -- OP: {}, new: {}'.format(*np.diff(t))

示例输出:

results equal -- True
run time (sec) -- OP: 1.38134884834, new: 0.0178880691528

说明:为了能够利用稀疏性,我们标准化了 y,它无论如何都是稠密的。然后计算 x 和 y 之间的原始相关性。因为此时 y 已经是零均值,所以 x 的均值是固定的。因此,它仍然除以 x 的标准差。在这里,我们也可以通过计算原始二阶矩并减去均方根来避免遍历密集矩阵。

实现细节:请注意,我冒昧地切换到更适合这里的csc。我们使用 np.add.reduceat 以矢量化方式对“参差不齐”的列进行求和。 indices来自于稀疏矩阵的csc表示,便于选取x中非零元素对应的y的元素。

关于python - 数组与稀疏矩阵的相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48197097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com