Python3 - 矩阵与数组之间的计算效率高的相关性

3
我想将一个mxn矩阵的列与一个1xm数组相关联,这应该会给我一个1xn数组。目前我使用以下方法有点笨拙: c = np.corrcoef(X, y)[:-1,-1] 我在这里找到了想要的相关性,最后一列和最后一行/列对应于数组自身的相关性(即r=1.0)。
这很好,但是,我需要在相当大的矩阵上执行此操作,那就太计算密集了,我的电脑就会放弃。
例如,我正在进行此操作的最大矩阵大小为:
48x290400(= X)和48x1(=y),其中我想得到290400个r值。
在Matlab中可以正常工作,但在Python中使用np.corrcoef则不行。有人有解决方案吗?
干杯 丹尼尔
1个回答

3

在转置输入数组后,我们可以使用这篇帖子中的corr2_coeff函数进行计算 -

corr2_coeff(a.T,b.T).ravel()

示例运行 -


In [160]: a = np.random.rand(3, 5)

In [161]: b = np.random.rand(3, 1)

# Proposed in the question
In [162]: np.corrcoef(a.T, b.T)[:-1,-1]
Out[162]: array([-0.0716,  0.1905,  0.9699,  0.7482, -0.1511])

# Proposed in this post
In [163]: corr2_coeff(a.T,b.T).ravel()
Out[163]: array([-0.0716,  0.1905,  0.9699,  0.7482, -0.1511])

运行时测试 -

In [171]: a = np.random.rand(48, 10000)

In [172]: b = np.random.rand(48, 1)

In [173]: %timeit np.corrcoef(a.T, b.T)[:-1,-1]
1 loops, best of 3: 619 ms per loop

In [174]: %timeit corr2_coeff(a.T,b.T).ravel()
1000 loops, best of 3: 1.72 ms per loop

In [176]: 619.0/1.72
Out[176]: 359.8837209302326

这里有一个巨大的360x速度提升!

进一步扩展它 -

In [239]: a = np.random.rand(48, 29040)

In [240]: b = np.random.rand(48, 1)

In [241]: %timeit np.corrcoef(a.T, b.T)[:-1,-1]
1 loops, best of 3: 5.19 s per loop

In [242]: %timeit corr2_coeff(a.T,b.T).ravel()
100 loops, best of 3: 8.09 ms per loop

In [244]: 5190.0/8.09
Out[244]: 641.5327564894932

这个更大的数据集上速度提升了640x+,并且随着我们逐渐接近实际数据集大小,应该会更好地扩展!

1
谢谢提供模拟!是的,我基本上从完全无法运行到在很短时间内得出了相关性。非常有用。 - Daniel Lindh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接