scipy MATLAB的lsqr()的Python等效函数,第一个参数为函数

tyky79it  于 2022-11-10  发布在  Matlab
关注(0)|答案(2)|浏览(241)

根据标题,我正在寻找一个Python等价物的MATLAB的lsqr()(可能在NumPy / SciPy)时,第一个参数是一个函数。
简单地说,lsqr在数值上解决了x的以下问题:

argmin_x || A*x - b ||_2

其中xb是向量(可能具有不同的大小),并且A是线性算子。
我相信,对于数字输入,等效值为numpy.linalg.lstsq()
函数scipy.optimize.least_squares()原则上可以用来解决argmin问题,但是它内部似乎使用了一种不同的(并且慢得多的)算法,这似乎不适合对相对较大的输入进行优化。
我相信lsqr()在内部使用A*xA'*b,并且不需要A的显式rappresentation。
那么,有没有一个与MATLAB的lsqr(第一个参数是函数)等价的函数呢?

qmelpv7a

qmelpv7a1#

对于大量稀疏的输入(无论如何都是lsqr的用例),MATLAB的lsqr的Python / SciPy等价物是:

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)

请注意,lsqrMATLAB和Python文档都表明A'*x(在Python中更准确地说是A^T x,但含义相同),但这不是(也不可能)正确。如果事实上它们都使用x作为静音变量(与Ax = b命名无关),但它们实际上都使用b
Python和MATLAB实现之间存在一个重要差异:

*MATLAB:提供了一个函数,该函数需要根据afun的第二个参数计算A*xA'*b(分别为afun(x,'notransp')afun(x,'transp'))。
*Python:这两个函数是分开提供的,第一个参数是xb,这取决于调用的是A.matvec()还是A.rmatvec()(分别)。

(This是基于@AnderBiguri和scipy.sparse.linalg.lsqr()源代码提供的信息丰富的答案)。

ymzxtsji

ymzxtsji2#

显然是在python的lsqrA can also be a LinearOperator中,这就是你要找的。
函数本身是scipy.sparse.linalg.LinearOperator,文档本身有关于如何使用它的很好的示例。
实际上,您只需创建2个函数(我们将其命名为Ax()Atb()),并将A创建为:
A = LinearOperator((m,n), matvec=Ax, rmatvec=Atb)
其中m,n是矩阵大小。

相关问题