根据标题,我正在寻找一个Python等价物的MATLAB的lsqr()
(可能在NumPy / SciPy)时,第一个参数是一个函数。
简单地说,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
的显式rappresentation。
那么,有没有一个与MATLAB的lsqr
(第一个参数是函数)等价的函数呢?
2条答案
按热度按时间qmelpv7a1#
对于大量稀疏的输入(无论如何都是
lsqr
的用例),MATLAB的lsqr
的Python / SciPy等价物是:此函数的第一个参数可以是
scipy.sparse.linalg.LinearOperator()
,它是线性运算符的代理,其中必须提供A*x
和A'*b
('
是转置运算符)作为(分别)对应于matvec
和rmatvec
的可调用对象。这最终可用于计算
lsqr
,其中A
是未知的。例如:
请注意,
lsqr
的MATLAB和Python文档都表明A'*x
(在Python中更准确地说是A^T x
,但含义相同),但这不是(也不可能)正确。如果事实上它们都使用x
作为静音变量(与Ax = b
命名无关),但它们实际上都使用b
。Python和MATLAB实现之间存在一个重要差异:
*MATLAB:提供了一个函数,该函数需要根据
afun
的第二个参数计算A*x
或A'*b
(分别为afun(x,'notransp')
或afun(x,'transp')
)。*Python:这两个函数是分开提供的,第一个参数是
x
或b
,这取决于调用的是A.matvec()
还是A.rmatvec()
(分别)。(This是基于@AnderBiguri和
scipy.sparse.linalg.lsqr()
源代码提供的信息丰富的答案)。ymzxtsji2#
显然是在python的
lsqr
A can also be aLinearOperator
中,这就是你要找的。函数本身是scipy.sparse.linalg.LinearOperator,文档本身有关于如何使用它的很好的示例。
实际上,您只需创建2个函数(我们将其命名为
Ax()
和Atb()
),并将A
创建为:A = LinearOperator((m,n), matvec=Ax, rmatvec=Atb)
其中
m,n
是矩阵大小。