Performance numpy lstsq——内存和运行时性能

Performance numpy lstsq——内存和运行时性能,performance,memory,numpy,linear-algebra,Performance,Memory,Numpy,Linear Algebra,我需要解(在最小二乘意义上)一大组(50000)线性系统。每个这样的“系统”都是Ax=B,其中A是N×K矩阵,x是K×1向量,B(显然)是N×1向量。(在我的例子中,N是50000,K是~10) numpy.linalg.lstsq似乎是一个明显的选择,但由于文档中没有包含实现细节,我想知道内存和运行时性能: lstsq的运行时性能和内存要求是什么 它会计算A,A^T,乘以它们,然后求逆,还是直接计算A的伪逆 有没有办法直接计算结果的每个X[i],从而节省内存?它会使用它吗 将结果描述为包括奇异

我需要解(在最小二乘意义上)一大组(50000)线性系统。每个这样的“系统”都是
Ax=B
,其中
A
是N×K矩阵,
x
是K×1向量,B(显然)是N×1向量。(在我的例子中,N是50000,K是~10)

numpy.linalg.lstsq似乎是一个明显的选择,但由于文档中没有包含实现细节,我想知道内存和运行时性能:

lstsq的运行时性能和内存要求是什么

  • 它会计算A,A^T,乘以它们,然后求逆,还是直接计算A的伪逆
  • 有没有办法直接计算结果的每个X[i],从而节省内存?它会使用它吗
  • 将结果描述为包括奇异值和秩;强烈暗示它正在使用SVD

    在我的笔记本电脑上进行的快速测试表明,在分配阵列A和B之后,内存根本没有增加(系统监视器报告)

    In [7]: A = np.random.randn(100000, 10)
    
    In [8]: B = np.random.randn(100000)
    
    In [9]: np.linalg.lstsq(A, B)
    Out[9]: 
    (array([ 0.00240061,  0.0017896 ,  0.00619928,  0.00010278, -0.00411501,
             0.00028532,  0.0003893 , -0.00042893,  0.00178326, -0.00444068]),
     array([ 99695.18278372]),
     10,
     array([ 318.37776275,  318.16578799,  317.82872616,  317.21981114,
             316.80987468,  315.63798002,  315.46574698,  314.73120345,
             313.99948001,  313.61503118]))
    
    将结果描述为包括奇异值和秩;强烈暗示它正在使用SVD

    在我的笔记本电脑上进行的快速测试表明,在分配阵列A和B之后,内存根本没有增加(系统监视器报告)

    In [7]: A = np.random.randn(100000, 10)
    
    In [8]: B = np.random.randn(100000)
    
    In [9]: np.linalg.lstsq(A, B)
    Out[9]: 
    (array([ 0.00240061,  0.0017896 ,  0.00619928,  0.00010278, -0.00411501,
             0.00028532,  0.0003893 , -0.00042893,  0.00178326, -0.00444068]),
     array([ 99695.18278372]),
     10,
     array([ 318.37776275,  318.16578799,  317.82872616,  317.21981114,
             316.80987468,  315.63798002,  315.46574698,  314.73120345,
             313.99948001,  313.61503118]))
    

    我本打算写一些类似的东西,但你比我快,值得我+1。在我运行的实验中,我的内存消耗并没有增加一位,即使是对于更大的输入。我无法解释,如果有人能解释,我会很高兴的。运行时间在N中似乎是线性的(如果我保持k不变)。我用几十种输入大小来测量这个。最后,查看linalg.py的源代码,它似乎使用了lapack的dgelsd(至少在我的机器上以及我安装它的方式上是这样),根据文档,它使用的是SVD。如何在线性时间和零内存的情况下计算奇异值分解?:-)他们对这里所需的工作空间有一个公式:我只是想写一些类似的东西,但你比我强,值得我+1。在我运行的实验中,我的内存消耗并没有增加一位,即使是对于更大的输入。我无法解释,如果有人能解释,我会很高兴的。运行时间在N中似乎是线性的(如果我保持k不变)。我用几十种输入大小来测量这个。最后,查看linalg.py的源代码,它似乎使用了lapack的dgelsd(至少在我的机器上以及我安装它的方式上是这样),根据文档,它使用的是SVD。如何在线性时间和零内存的情况下计算奇异值分解?:-)对于此处所需的工作空间,他们有一个公式: