我需要求解(在最小二乘意义上)一大组(50,000)线性系统。每个这样的"系统"都是Ax=B
的,A
是一个N×K矩阵,x
是一个k×1向量,B(显然)是一个N×1向量。(在我的例子中,N 是 50,000,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]))