Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy进行大量回归的有效方法?_Python_Numpy_Regression - Fatal编程技术网

Python 使用numpy进行大量回归的有效方法?

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循环?或者我必须使用一个循环,并

我收集了大量(确切地说是26214400)的数据集,我想对这些数据集进行线性回归,即26214400个数据集中的每一个都由
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