不确定此问题是属于此处还是已经过交叉验证,但由于主要问题是与编程语言相关,我将在此处发布。
输入:
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])
答案 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,)