【问题标题】:Python Memory error on scipy stats. Scipy linalg lstsq <> manual betascipy 统计数据上的 Python 内存错误。 Scipy linalg lstsq <> 手动测试版
【发布时间】:2016-10-21 03:19:37
【问题描述】:

不确定这个问题是属于这里还是交叉验证,但由于主要问题与编程语言相关,我将其发布在这里。

输入:

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

X= 一维数组 (30,)

期望的输出:

B= 1D array (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

然而,两种对 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])

【问题讨论】:

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


    【解决方案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,)
    

    【讨论】:

    • 感谢您的建议。不知何故,我在使用这个和我的方法时得到了不同的结果。我在上面的问题中添加了详细信息。
    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多