Python 等效于 MATLAB 的 lsqr(),第一个参数是一个函数

标签 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 问题,但它似乎在内部使用了不同的(并且慢得多)算法,这似乎不适合对相对较大的输入进行优化。

我相信 lsqr() 在内部使用 A*xA'*b 并且不需要对 A.

那么,有没有 MATLAB 的 lsqr 的等价物(第一个参数是一个函数)?

最佳答案

对于大而稀疏的输入(这将是 lsqr 的用例),Python/SciPy 相当于 MATLAB 的 lsqr是:

scipy.sparse.linalg.lsqr()

这个函数的第一个参数可以是scipy.sparse.linalg.LinearOperator() ,它是线性运算符的代理,其中 A*xA'*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)

请注意 MATLABPython lsqr 的文档表示 A'*x (在 Python 中更准确地说是 A^T x,但含义相同)是计算出来的,但这不(也不可能)正确。 如果事实上他们都使用 x作为静音变量(与Ax = b命名无关),但它们实际上都使用b .

Python 和 MATLAB 实现之间存在一个重要区别:

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

(这是基于@AnderBiguri 和 scipy.sparse.linalg.lsqr() source code 提供的信息丰富的答案)。

关于Python 等效于 MATLAB 的 lsqr(),第一个参数是一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48621407/

相关文章:

python - 根据索引从 numpy 数组中获取子数组

c++ - 这条 Matlab 线是什么意思?

c++ - libsvm : C++ vs. MATLAB : What's With The Different Accuracies?

python - 无法将 numpy 数组 reshape 为 RGB 图像

python - 如何将字典列表转换为数据框?

python - 为 Linux 命令编写 Python 脚本

python - 对 django tastypie 资源的 PUT 请求不起作用

python - 为什么 flask 测试会产生两个测试实例?

algorithm - 为什么我得到一个充满 NaN 的权重矩阵?

python - numpy 数组中多个单元格 block 的相邻单元格