左矩阵除法和Numpy求解

18

我正在尝试将包含 \ 运算符的Matlab(Octave)代码转换为Python。示例代码:

B = [2;4]
b = [4;4]
B \ b

这个方法有效,并产生1.2作为答案。使用此网页:

http://mathesaurus.sourceforge.net/matlab-numpy.html

我将其翻译为:

import numpy as np
import numpy.linalg as lin
B = np.array([[2],[4]])
b = np.array([[4],[4]])
print lin.solve(B,b)

这给了我一个错误:

numpy.linalg.linalg.LinAlgError: Array must be square

为什么Matlab在B不是方阵的情况下可以使用\符号?

有解决方法吗?

3个回答

20

MathWorks文档中关于左除矩阵的定义:

如果A是一个m×n的矩阵,其中m≠n且B是一个有m个分量的列向量或者包含若干个这样列向量的矩阵,那么X = A\B是最小二乘意义下解决超定或欠定方程组AX = B的解。换句话说,X使得范数(A*X - B)最小,其中AX - B是向量。

在numpy中相应的函数是np.linalg.lstsq

In [15]: B = np.array([[2],[4]])

In [16]: b = np.array([[4],[4]])

In [18]: x,resid,rank,s = np.linalg.lstsq(B,b)

In [19]: x
Out[19]: array([[ 1.2]])

14

当使用 \ 运算符时,Matlab 实际上会执行许多不同的操作,具体取决于所涉及矩阵的形状(请参见此处获取更多详细信息)。在您的示例中,Matlab 返回的是最小二乘解,而不是像在方阵中那样直接解决线性方程。若要在 numpy 中获得相同的行为,请执行下列操作:

import numpy as np
import numpy.linalg as lin
B = np.array([[2],[4]])
b = np.array([[4],[4]])
print np.linalg.lstsq(B,b)[0]

这应该会给你与Matlab相同的解决方案。


3

你可以形成左逆:

import numpy as np
import numpy.linalg as lin
B = np.array([[2],[4]])
b = np.array([[4],[4]])

B_linv = lin.solve(B.T.dot(B), B.T)
c = B_linv.dot(b)
print('c\n', c)

结果:

c
 [[ 1.2]]

实际上,我们可以简单地运行求解器一次,而不需要形成逆矩阵,如下所示:
c = lin.solve(B.T.dot(B), B.T.dot(b))
print('c\n', c)

结果:

c
 [[ 1.2]]

....如之前所述

为什么?因为:

我们有:

enter image description here

乘以B.T得到:

enter image description here

现在,B.T.dot(B)是方阵,完全秩,具有逆矩阵。因此,我们可以乘以B.T.dot(B)的逆矩阵,或使用上面的求解器来得到c


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接