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

时间:2016-07-09 22:05:01

标签: python matlab numpy scipy linear

我试图在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

经过多次挖掘,我了解到反斜杠操作符根据输入A做了很多不同的事情。我在这里找到了一个很好的描述:How to implement Matlab's mldivide (a.k.a. the backslash operator "\")。我也发现了类似的问题,但是使用方形矩阵:Numpy vs mldivide,"\" matlab operator。我的情况涉及矩形矩阵,所以它有点不同。

当A为矩形时,\使用QR分解,我可以像这样重现相同的解决方案:

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

    -0.1200
     0
     0
     0
     0
     0
     0.0200

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

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

第二个问题是,是否有理由信任mldividelstsq给出的答案?我知道lstsq提供了最小的2范数解决方案,这似乎是合适的,那么它与Matlab提供的内容有何本质区别?

0 个答案:

没有答案