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)[source]#
用于最小二乘问题的迭代求解器。
lsmr 求解线性方程组
Ax = b
。如果系统不一致,它将求解最小二乘问题min ||b - Ax||_2
。A
是一个 m 行 n 列的矩形矩阵,所有情况均允许:m = n,m > n 或 m < n。b
是一个长度为 m 的向量。矩阵 A 可以是稠密的或稀疏的(通常是稀疏的)。- 参数:
- A{稀疏矩阵,ndarray,线性算子}
线性系统中的矩阵 A。或者,
A
可以是一个线性算子,它可以使用Ax
和A^H x
,例如scipy.sparse.linalg.LinearOperator
。- barray_like,shape (m,)
线性系统中的向量
b
。- dampfloat
正则化最小二乘的阻尼因子。
lsmr
求解正则化最小二乘问题min ||(b) - ( A )x|| ||(0) (damp*I) ||_2
其中 damp 是一个标量。如果 damp 为 None 或 0,则系统在没有正则化的情况下求解。默认为 0。
- atol, btolfloat,可选
停止容差。
lsmr
继续迭代,直到某个后向误差估计小于依赖于 atol 和 btol 的某个量。令r = b - Ax
为当前近似解x
的残差向量。如果Ax = b
似乎是一致的,lsmr
在norm(r) <= atol * norm(A) * norm(x) + btol * norm(b)
时终止。否则,lsmr
在norm(A^H r) <= atol * norm(A) * norm(r)
时终止。如果两个容差都是 1.0e-6(默认),则最终norm(r)
应该精确到大约 6 位数字。(最终x
通常会有更少的正确位数,具体取决于cond(A)
和 LAMBDA 的大小。)如果 atol 或 btol 为 None,则将使用默认值 1.0e-6。理想情况下,它们应该是A
和b
条目中的相对误差的估计值。例如,如果A
的条目有 7 位正确数字,请设置atol = 1e-7
。这可以防止算法在超出输入数据的误差范围之外进行不必要的计算。- conlimfloat,可选
如果
cond(A)
的估计值超过 conlim,则lsmr
终止。对于兼容系统Ax = b
,conlim 可以大到 1.0e+12(例如)。对于最小二乘问题, conlim 应该小于 1.0e+8。如果 conlim 为 None,则默认值为 1e+8。可以通过设置atol = btol = conlim = 0
来获得最大精度,但迭代次数可能会过大。默认为 1e8。- maxiterint,可选
如果迭代次数达到 maxiter,则
lsmr
终止。默认为maxiter = min(m, n)
。对于病态系统,可能需要更大的 maxiter 值。默认为 False。- showbool,可选
如果
show=True
,则打印迭代日志。默认为 False。- x0array_like,shape (n,),可选
x
的初始猜测,如果为 None,则使用零。默认为 None。在版本 1.0.0 中添加。
- 返回值:
- xndarray of float
返回的最小二乘解。
- istopint
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.
- itnint
使用的迭代次数。
- normrfloat
norm(b-Ax)
- normarfloat
norm(A^H (b - Ax))
- normafloat
norm(A)
- condafloat
A 的条件数。
- normxfloat
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_matrix >>> from scipy.sparse.linalg import lsmr >>> A = csc_matrix([[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 包含找到的最小距离。