Matlab反斜杠(mldivide)与带有矩形矩阵的numpy lstsq

thr*_*use 5 python matlab numpy scipy

我试图在Python中复制我们通常使用Matlab进行的分析。某个步骤涉及使用反斜杠\(mldivide)运算符求解2个矩形矩阵的最小二乘问题(求解Ax = b中的x)。

我注意到在某些情况下,Matlab产生的结果与完全不同np.linalg.lstsq。如果我的矩阵A秩不足,那么A\b会给我一个警告,但也会给我一个答案,其中某些列设置为全零。

A = reshape(1:35,5,7);
b = [0.5, 0.4, 0.3, 0.2, 0.1]'

A\b
Warning: Rank deficient, rank = 2, tol =  1.147983e-13. 

ans =

    -0.1200
     0
     0
     0
     0
     0
     0.0200
Run Code Online (Sandbox Code Playgroud)

经过大量的挖掘,我了解到反斜杠运算符根据输入进行的操作非常不同A。我在这里找到了很好的描述:如何实现Matlab的mldivide(又称反斜杠运算符“ \”)。我也发现了一个与我自己类似的问题,但是存在平方矩阵:Numpy vs mldivide,“ \” matlab运算符。我的情况涉及矩形矩阵,所以有点不同。

当A为矩形时,\使用QR因式分解,我可以重现相同的解决方案,如下所示:

[Q,R]  = qr(A);
R \ (Q'*b)
ans =

    -0.1200
     0
     0
     0
     0
     0
     0.0200
Run Code Online (Sandbox Code Playgroud)

我知道这是第二次\被称为(for R\(Q'*b)),它使用反向替换来执行此操作。有人可以提供Matlab或python代码来执行此步骤吗?我已经找到了一些反替换的例子,但是它们似乎都是用于平方矩阵的。

我意识到我的任意示例都不是很现实,排名不足是一个问题,但是我的首要任务是尽可能地复制Matlab代码,以确认分析中的其他步骤已正确复制。

第二个问题是,是否有理由相信mldivideover 给出的答案lstsq?我知道这lstsq给出了最小的2范数解,这似乎是合适的,所以这在质量上与Matlab提供的有什么不同?