Python相当于MATLAB的lsqr(),第一个参数是一个函数

时间:2018-02-05 11:17:22

标签: python matlab numpy scipy mathematical-optimization

根据标题,当第一个参数是函数时,我正在寻找与MATLAB的lsqr()(可能在NumPy / SciPy中)相当的Python。

简而言之,lsqrx数字解决了以下问题:

argmin_x || A*x - b ||_2

其中xb是向量(可能大小不同),A是线性运算符。

我相信对于数字输入,等价物是numpy.linalg.lstsq()

原则上,函数scipy.optimize.least_squares()可用于解决argmin问题,但似乎它在内部使用了一种不同的(并且速度更慢)算法,这似乎不适合在相对较大的输入上进行优化。 / p>

我认为lsqr()内部使用A*xA'*b,并且不需要明确表达A

那么,是否有相当于MATLAB的lsqr(第一个参数是一个函数)?

2 个答案:

答案 0 :(得分:2)

对于大型和稀疏输入(无论如何都是lsqr的用例),Python / SciPy相当于MATLAB的lsqr

scipy.sparse.linalg.lsqr()

此函数的第一个参数可以是scipy.sparse.linalg.LinearOperator(),它是线性运算符的代理,其中A*xA'*b'是转置运算符)必须是作为对应于matvecrmatvec(分别)的可调用提供。

这最终可用于计算lsqr,其中A未明确知晓。

例如:

def Ax(x):
    """Returns A*x"""
    ...

def Atb(b):
    """Returns A'*b"""
    ...

A = scipy.sparse.linalg.LinearOperator((m,n), matvec=Ax, rmatvec=Atb)
result = scipy.sparse.linalg.lsqr(A, b)

请注意,lsqr的{​​{3}}和MATLAB个文档都表示A'*x(在Python的情况下更准确A^T x,但含义相同计算,但这不是(也不可能)正确。

Python和MATLAB实现之间存在重要差异:

  • MATLAB afun的第一个参数似乎是x,与afun(x,'notransp')afun(x,'transp')的调用无关,b 1}}必须以不同的方式获得。
  • Python :第一个参数是xb,具体取决于是否分别调用A.matvec()A.rmatvec()

(这是基于@AnderBiguri和scipy.sparse.linalg.lsqr() Python提供的非常丰富的答案。)

答案 1 :(得分:1)

显然在python的lsqr A can also be a LinearOperator中,这就是你要找的东西。

函数本身是scipy.sparse.linalg.LinearOperator,文档本身就如何使用它有很好的例子。

基本上,您只需创建2个函数(让我们称之为Ax()Atb())并创建A

A = LinearOperator((m,n), matvec=Ax, rmatvec=Atb)

其中m,n是矩阵大小。