Python 使用numpy进行大量回归的有效方法?
我收集了大量(确切地说是26214400)的数据集,我想对这些数据集进行线性回归,即26214400个数据集中的每一个都由Python 使用numpy进行大量回归的有效方法?,python,numpy,regression,Python,Numpy,Regression,我收集了大量(确切地说是26214400)的数据集,我想对这些数据集进行线性回归,即26214400个数据集中的每一个都由nx值和ny值组成,我想找到y=m*x+b。对于任何一组点,我都可以使用sklearn或类似于: A = np.vstack([x, np.ones(len(x))]).T m, b = np.linalg.lstsq(A, y, rcond=None)[0] 有没有一种方法可以设置矩阵,这样我就可以避免通过26214400项进行python循环?或者我必须使用一个循环,并
n
x值和n
y值组成,我想找到y=m*x+b
。对于任何一组点,我都可以使用sklearn
或类似于:
A = np.vstack([x, np.ones(len(x))]).T
m, b = np.linalg.lstsq(A, y, rcond=None)[0]
有没有一种方法可以设置矩阵,这样我就可以避免通过26214400项进行python循环?或者我必须使用一个循环,并且使用像Numba这样的东西会更好吗?我最终选择了
Numba
路线,这在我的笔记本电脑上产生了大约20倍的速度,它使用了我所有的内核,所以我认为CPU越多越好。答案看起来有点像
import numpy as np
from numpy.linalg import lstsq
import numba
@numba.jit(nogil=True, parallel=True)
def fit(XX, yy):
""""Fit a large set of points to a regression"""
assert XX.shape == yy.shape, "Inputs mismatched"
n_pnts, n_samples = XX.shape
scale = np.empty(n_pnts)
offset = np.empty(n_pnts)
for i in numba.prange(n_pnts):
X, y = XX[i], yy[i]
A = np.vstack((np.ones_like(X), X)).T
offset[i], scale[i] = lstsq(A, y)[0]
return offset, scale
运行它:
XX, yy = np.random.randn(2, 1000, 10)
offset, scale = fit(XX, yy)
%timeit offset, scale = fit(XX, yy)
1.87 ms ± 37.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
非JIT版本具有以下时间:
41.7 ms ± 620 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
我最终选择了
numba
路线,这使我的笔记本电脑的速度提高了约20倍,它使用了我所有的内核,所以我认为CPU越多越好。答案看起来有点像
import numpy as np
from numpy.linalg import lstsq
import numba
@numba.jit(nogil=True, parallel=True)
def fit(XX, yy):
""""Fit a large set of points to a regression"""
assert XX.shape == yy.shape, "Inputs mismatched"
n_pnts, n_samples = XX.shape
scale = np.empty(n_pnts)
offset = np.empty(n_pnts)
for i in numba.prange(n_pnts):
X, y = XX[i], yy[i]
A = np.vstack((np.ones_like(X), X)).T
offset[i], scale[i] = lstsq(A, y)[0]
return offset, scale
运行它:
XX, yy = np.random.randn(2, 1000, 10)
offset, scale = fit(XX, yy)
%timeit offset, scale = fit(XX, yy)
1.87 ms ± 37.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
非JIT版本具有以下时间:
41.7 ms ± 620 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
26214400集合中的所有x值都相同吗?@amazon ex,不,不幸的是不是如果内存限制不是问题,我可以想象你可以将由x数据和1组成的矩阵叠加到一个(巨大的)块对角矩阵中,将y数据叠加到一个向量中,然后求解得到的线性方程。现在用一些虚拟数据进行测试,如果有效,我会回来:)26214400集合中的所有x值都相同吗?@amazon ex,不,不幸的是不是如果内存限制不是问题,我会想象你可以将由x数据和1组成的矩阵堆叠成一个(巨大的)块对角矩阵,将y数据转换成一个向量,然后求解得到的线性方程。现在用一些虚拟数据进行测试,如果有效的话,我会回来:)现在有点晚,但是检查,他们有一个
OLS
实现,例如fastats的。线性代数导入OLS
现在有点晚,但是检查,他们有一个OLS
实现,例如fastats的。线性代数导入OLS