根据标题,当第一个参数是函数时,我正在寻找与 MATLAB 的 lsqr()
(可能在 NumPy/SciPy 中)等效的 Python。
简而言之,lsqr
为 x
求解以下问题:
argmin_x || A*x - b ||_2
其中 x
和 b
是向量(可能大小不同),A
是线性运算符。
我相信对于数字输入来说,等效于 numpy.linalg.lstsq()
。
原则上,函数 scipy.optimize.least_squares()
可以用于解决 argmin 问题,但它似乎在内部使用了不同的(并且慢得多)算法,这似乎不适合对相对较大的输入进行优化。
我相信 lsqr()
在内部使用 A*x
和 A'*b
并且不需要对 A
.
那么,有没有 MATLAB 的 lsqr
的等价物(第一个参数是一个函数)?
最佳答案
对于大而稀疏的输入(这将是 lsqr
的用例),Python/SciPy 相当于 MATLAB 的 lsqr
是:
scipy.sparse.linalg.lsqr()
这个函数的第一个参数可以是scipy.sparse.linalg.LinearOperator()
,它是线性运算符的代理,其中 A*x
和 A'*b
( '
是转置运算符)必须作为对应于 matvec
的可调用对象提供和 rmatvec
(分别)。
这最终可以用来计算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)
请注意 MATLAB和 Python lsqr
的文档表示 A'*x
(在 Python 中更准确地说是 A^T x
,但含义相同)是计算出来的,但这不(也不可能)正确。
如果事实上他们都使用 x
作为静音变量(与Ax = b
命名无关),但它们实际上都使用b
.
Python 和 MATLAB 实现之间存在一个重要区别:
- MATLAB:提供了一个函数,需要计算
A*x
或A'*b
取决于afun
的第二个参数(分别为afun(x,'notransp')
或afun(x,'transp')
)。 - Python:两个函数要分开提供,第一个参数是
x
或b
,取决于是否A.matvec()
或A.rmatvec()
(分别)被调用。
(这是基于@AnderBiguri 和 scipy.sparse.linalg.lsqr()
source code 提供的信息丰富的答案)。
关于Python 等效于 MATLAB 的 lsqr(),第一个参数是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48621407/