我试图在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代码,以确认分析中的其他步骤是否正确复制。
第二个问题是,是否有理由信任mldivide
对lstsq
给出的答案?我知道lstsq
提供了最小的2范数解决方案,这似乎是合适的,那么它与Matlab提供的内容有何本质区别?