scipy.sparse.linalg.

lsmr#

scipy.sparse.linalg.lsmr(A, b, damp=0.0, atol=1e-06, btol=1e-06, conlim=100000000.0, maxiter=None, show=False, x0=None)[源代码]#

用于最小二乘问题的迭代求解器。

lsmr 求解线性方程组 Ax = b。 如果系统不一致,则求解最小二乘问题 min ||b - Ax||_2A 是一个 m 乘以 n 的矩形矩阵,允许所有情况:m = n,m > n 或 m < n。 b 是一个长度为 m 的向量。矩阵 A 可以是稠密的或稀疏的(通常是稀疏的)。

参数:
A{稀疏数组,ndarray,线性算子}

线性系统中的矩阵 A。或者,A 可以是一个线性算子,可以使用例如 scipy.sparse.linalg.LinearOperator 生成 AxA^H x

b类数组,形状 (m,)

线性系统中的向量 b

damp浮点数

正则化最小二乘的阻尼因子。lsmr 求解正则化最小二乘问题

min ||(b) - (  A   )x||
    ||(0)   (damp*I) ||_2

其中 damp 是一个标量。如果 damp 为 None 或 0,则求解系统时不进行正则化。默认值为 0。

atol, btol浮点数,可选

停止容差。lsmr 继续迭代,直到某个后向误差估计值小于某个取决于 atol 和 btol 的量。令 r = b - Ax 为当前近似解 x 的残差向量。如果 Ax = b 似乎是一致的,lsmrnorm(r) <= atol * norm(A) * norm(x) + btol * norm(b) 时终止。否则,lsmrnorm(A^H r) <= atol * norm(A) * norm(r) 时终止。如果两个容差均为 1.0e-6(默认值),则最终的 norm(r) 的精度应约为 6 位。(最终的 x 通常具有较少的正确位数,具体取决于 cond(A) 和 LAMBDA 的大小。)如果 atolbtol 为 None,将使用默认值 1.0e-6。理想情况下,它们应该是 Ab 的条目中相对误差的估计值。例如,如果 A 的条目具有 7 个正确的数字,则设置 atol = 1e-7。这可以防止算法在超出输入数据不确定性的情况下进行不必要的工作。

conlim浮点数,可选

如果对 cond(A) 的估计值超过 conlim,则 lsmr 终止。对于兼容系统 Ax = b,conlim 可以高达 1.0e+12(例如)。对于最小二乘问题,conlim 应小于 1.0e+8。如果 conlim 为 None,则默认值为 1e+8。通过设置 atol = btol = conlim = 0 可以获得最大精度,但此时迭代次数可能会过多。默认值为 1e8。

maxiter整数,可选

如果迭代次数达到 maxiter,则 lsmr 终止。默认值为 maxiter = min(m, n)。对于病态系统,可能需要更大的 maxiter 值。默认值为 False。

show布尔值,可选

如果 show=True,则打印迭代日志。默认值为 False。

x0类数组,形状 (n,),可选

x 的初始猜测,如果为 None,则使用零。默认值为 None。

1.0.0 版本新增。

返回:
x浮点数的 ndarray

返回最小二乘解。

istop整数

istop 给出了停止的原因

istop   = 0 means x=0 is a solution.  If x0 was given, then x=x0 is a
            solution.
        = 1 means x is an approximate solution to A@x = B,
            according to atol and btol.
        = 2 means x approximately solves the least-squares problem
            according to atol.
        = 3 means COND(A) seems to be greater than CONLIM.
        = 4 is the same as 1 with atol = btol = eps (machine
            precision)
        = 5 is the same as 2 with atol = eps.
        = 6 is the same as 3 with CONLIM = 1/eps.
        = 7 means ITN reached maxiter before the other stopping
            conditions were satisfied.
itn整数

使用的迭代次数。

normr浮点数

norm(b-Ax)

normar浮点数

norm(A^H (b - Ax))

norma浮点数

norm(A)

conda浮点数

A 的条件数。

normx浮点数

norm(x)

注释

0.11.0 版本新增。

参考文献

[1]

D. C.-L. Fong 和 M. A. Saunders,“LSMR:稀疏最小二乘问题的迭代算法”,SIAM J. Sci. Comput.,第 33 卷,第 2950-2971 页,2011 年。arXiv:1006.0758

示例

>>> import numpy as np
>>> from scipy.sparse import csc_array
>>> from scipy.sparse.linalg import lsmr
>>> A = csc_array([[1., 0.], [1., 1.], [0., 1.]], dtype=float)

第一个示例的平凡解为 [0, 0]

>>> b = np.array([0., 0., 0.], dtype=float)
>>> x, istop, itn, normr = lsmr(A, b)[:4]
>>> istop
0
>>> x
array([0., 0.])

返回的停止代码 istop=0 表示找到了一个零向量作为解。返回的解 x 确实包含 [0., 0.]。下一个示例有一个非平凡解

>>> b = np.array([1., 0., -1.], dtype=float)
>>> x, istop, itn, normr = lsmr(A, b)[:4]
>>> istop
1
>>> x
array([ 1., -1.])
>>> itn
1
>>> normr
4.440892098500627e-16

istop=1 所示,lsmr 找到了一个符合容差限制的解。给定的解 [1., -1.] 显然可以求解该方程。剩余的返回值包括关于迭代次数(itn=1)和所求解方程的左右两边剩余差的信息。最后一个示例演示了在方程无解的情况下的行为

>>> b = np.array([1., 0.01, -1.], dtype=float)
>>> x, istop, itn, normr = lsmr(A, b)[:4]
>>> istop
2
>>> x
array([ 1.00333333, -0.99666667])
>>> A.dot(x)-b
array([ 0.00333333, -0.00333333,  0.00333333])
>>> normr
0.005773502691896255

istop 表示系统不一致,因此 x 而是相应最小二乘问题的近似解。normr 包含找到的最小距离。