根据标题,当第一个参数是函数时,我正在寻找与MATLAB的lsqr()
(可能在NumPy / SciPy中)相当的Python。
简而言之,lsqr
以x
数字解决了以下问题:
argmin_x || A*x - b ||_2
其中x
和b
是向量(可能大小不同),A
是线性运算符。
我相信对于数字输入,等价物是numpy.linalg.lstsq()
。
原则上,函数scipy.optimize.least_squares()
可用于解决argmin问题,但似乎它在内部使用了一种不同的(并且速度更慢)算法,这似乎不适合在相对较大的输入上进行优化。 / p>
我认为lsqr()
内部使用A*x
和A'*b
,并且不需要明确表达A
。
那么,是否有相当于MATLAB的lsqr
(第一个参数是一个函数)?
答案 0 :(得分:2)
对于大型和稀疏输入(无论如何都是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)
请注意,lsqr
的{{3}}和MATLAB个文档都表示A'*x
(在Python的情况下更准确A^T x
,但含义相同计算,但这不是(也不可能)正确。
Python和MATLAB实现之间存在重要差异:
afun
的第一个参数似乎是x
,与afun(x,'notransp')
或afun(x,'transp')
的调用无关,b
1}}必须以不同的方式获得。x
或b
,具体取决于是否分别调用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
是矩阵大小。