scipy统计数据中的Python内存错误。 Scipy linalg lstsq<>手动测试版

时间:2016-10-21 03:19:38

标签: numpy multidimensional-array scipy out-of-memory linear-regression

不确定此问题是属于此处还是已经过交叉验证,但由于主要问题是与编程语言相关,我将在此处发布。

输入:

Y =大2D numpy数组(300000,30)

X = 1D数组(30,)

期望的输出:

B = 1D数组(300000,)每个元素的回归系数回归Y的每一行(长度为30的元素)对X

所以B[0] = scipy.stats.linregress(X,Y[0])[0]

我先试了这个:

B = scipy.stats.linregress(X,Y)[0] 

希望它会根据Y的形状播放X.接下来我自己播放X以匹配Y的形状。但是在这两种情况下,我都遇到了这个错误:

    File "C:\...\scipy\stats\stats.py", line 3011, in linregress
        ssxm, ssxym, ssyxm, ssym = np.cov(x, y, bias=1).flat
    File "C:\...\numpy\lib\function_base.py", line 1766, in cov
        return (dot(X, X.T.conj()) / fact).squeeze()
  MemoryError

我使用手动方法来计算beta,并且在Sascha的建议下面也使用了scipy.linalg.lstsq如下

B = lstsq(Y.T, X)[0] # first estimate of beta
Y1=Y-Y.mean(1)[:,None]
X1=X-X.mean()
B1= np.dot(Y1,X1)/np.dot(X1,X1) # second estimate of beta

然而,β的两个估计值非常不同:

>>> B1
Out[10]: array([0.135623, 0.028919, -0.106278, ..., -0.467340, -0.549543, -0.498500])
>>> B
Out[11]: array([0.000014, -0.000073, -0.000058, ..., 0.000002, -0.000000, 0.000001])

1 个答案:

答案 0 :(得分:1)

Scipy的linregress将输出定义回归线的斜率+截距。

如果你想自然地访问这些系数,scipy的lstsq可能更合适,这是一个等价的公式。

当然你需要用正确的尺寸喂它(你的数据还没有准备好;需要预处理;交换暗淡)。

代码

import numpy as np
from scipy.linalg import lstsq
Y = np.random.random((300000,30))
X = np.random.random(30)
x, res, rank, s = lstsq(Y.T, X)  # Y transposed!
print(x)
print(x.shape)

输出

[  1.73122781e-05   2.70274135e-05   9.80840639e-06 ...,  -1.84597771e-05
   5.25035470e-07   2.41275026e-05]
(300000,)