scipy.optimize.

lsq_linear#

scipy.optimize.lsq_linear(A, b, bounds=(-inf, inf), method='trf', tol=1e-10, lsq_solver=None, lsmr_tol=None, max_iter=None, verbose=0, *, lsmr_maxiter=None)[source]#

求解带变量边界的线性最小二乘问题。

给定 m 乘以 n 的设计矩阵 A 和包含 m 个元素的目标向量 b,lsq_linear 会求解下列优化问题

minimize 0.5 * ||A x - b||**2
subject to lb <= x <= ub

此优化问题为凸优化,因此求出的最小值(如果迭代过程会聚)必定是全局最小值。

参数:
A类似数组、LinearOperator 稀疏矩阵,形状为 (m、n)

设计矩阵。可以是 scipy.sparse.linalg.LinearOperator

b类似数组,形状为 (m,)

目标向量。

bounds类似数组或 Bounds 的 2 元组,可选

参数的下限和上限。默认情况下无上限。有两种方法可用于指定上限

  • Bounds 实例。

  • 类似数组的 2 元组:元组的每个元素必须是长度等于参数个数的数组,或标量(在这种情况下,所有参数的上限被视为相同)。使用带有相应符号的 np.inf 以禁用所有或某些参数的上限。

method‘trf’ 或 ‘bvls’,可选

执行最小化的方式。

  • ‘trf’ :信任区域反射算法,已针对线性最小二乘问题进行调整。它是一种类似于内点的算法,并且所需的迭代次数与变量的个数基本相关。

  • ‘bvls’ :有界变量最小二乘算法。它是一种活动集方法,其所需的迭代次数与变量的个数相当。如果A 是稀疏的或 LinearOperator,则不可使用此方法。

默认值为 ‘trf’。

tol浮点数,可选

容差参数。如果在最后一次迭代时代价函数的相对变化小于tol,算法将终止。此外,还考虑了一阶最优性度量

  • method='trf' 在缩放后将终止,以说明上限的存在,梯度的一致性标准小于tol

  • method='bvls' 在 Karush-Kuhn-Tucker 条件在tol 容差范围内达成时终止。

lsq_solver{None、‘exact’、‘lsmr’},可选

整个迭代过程中求解无界最小二乘问题的方法

  • ‘exact’ :使用密集型 QR 或 SVD 分解方法。如果A 是稀疏的或 LinearOperator,则不可使用此方法。

  • ‘lsmr’:使用 scipy.sparse.linalg.lsmr 迭代程序,仅需要矩阵向量乘积测评。不能用于 method='bvls'

如果为 None(默认),则基于 A 的类型选择求解器。

lsmr_tolNone,浮点数或‘auto’,可选

对于 scipy.sparse.linalg.lsmr 的容差参数‘atol’和‘btol’如果为 None(默认),则将其设置为 1e-2 * tol。如果为‘auto’,则会根据当前迭代的最优性调整容差,这样可以加速优化过程,但并不总可靠。

max_iterNone 或 int,可选

终止前的最大迭代次数。如果为 None(默认),则将其设置为 100(对于 method='trf')或变量数(对于 method='bvls')(不计入‘bvls’初始化的迭代次数)。

verbose{0, 1, 2},可选

算法冗余级别

  • 0:静默工作(默认)。

  • 1:显示终止报告。

  • 2:显示迭代过程。

lsmr_maxiterNone 或 int,可选

如果使用 lsmr 最小二乘求解器(通过设置 lsq_solver='lsmr'),则它的最大迭代次数。如果为 None(默认),则使用 lsmr 的默认值 min(m, n),其中 mn 分别为 A 的行数和列数。如果为 lsq_solver='exact',则不起作用。

返回:
OptimizeResult,其具有以下字段
xndarray,形状 (n,)

找到的解。

cost浮点数

解中目标函数的值。

funndarray,形状 (m,)

解中的残差向量。

optimality浮点数

一阶最优性度量。确切含义取决于 method,请参阅 tol 参数的说明。

active_maskint 的 ndarray,形状 (n,)

每个组件显示相应的约束是否有效(即,变量是否达到限制)

  • 0:约束无效。

  • -1:下界有效。

  • 1:有活动上界。

对于trf方法来说,这可能有点任意,因为它会生成一个严格可行的迭代序列,并且active_mask是在容差阈值内确定的。

unbounded_soltuple

由最小二乘求解器返回的无界最小二乘解元组(使用lsq_solver选项设置)。如果未设置lsq_solver或将其设置为'exact',则元组将包含一个形状为(n,)的ndarray,其中包含无界解、一个具有平方残差和的ndarray、一个具有A秩的int,以及一个具有A奇异值的ndarray(有关更多信息,请参见NumPy的linalg.lstsq)。如果lsq_solver设置为'lsmr',则元组将包含一个形状为(n,)的ndarray,其中包含无界解、一个带有退出代码的int、一个带有迭代次数的int,以及五个带有不同范数的浮点数和A的条件数(有关更多信息,请参见SciPy的sparse.linalg.lsmr)。此输出对于确定最小二乘求解器的收敛性非常有用,特别是迭代求解器'lsmr'。无界最小二乘问题旨在最小化0.5 * ||A x - b||**2

nitint

迭代次数。如果无约束解是最优的,则为零。

statusint

算法终止原因

  • -1:算法无法在上一次迭代中取得进展。

  • 0:已超过最大迭代次数。

  • 1:一阶最优度量小于tol

  • 2:代价函数的相对变化小于tol

  • 3:无约束解是最优的。

messagestr

终止原因的文字描述。

successbool

如果满足其中一个收敛标准,则为True(status > 0)。

另请参阅

nnls

具有非负性约束的线性最小二乘。

least_squares

具有变量界限的非线性最小二乘。

备注

算法首先通过 numpy.linalg.lstsqscipy.sparse.linalg.lsmr,根据 lsq_solver 计算无约束的最小二乘解。如果该解在边界内,则将其作为最优解返回。

方法“trf”运行对 [STIR] 中描述的算法的算法的改编,用于线性最小二乘问题。迭代本质上与非线性最小二乘算法相同,但由于二次函数模型始终准确,因此我们不需要跟踪或修改置信域的半径。当选定步长不降低成本函数时,使用线搜索(后退)作为安全网。在 scipy.optimize.least_squares 中阅读该算法的更详细描述。

方法“bvls”运行 [BVLS] 中描述的算法的 Python 实现。算法维护活动的变量和自由的变量集,在每次迭代中,从活动集选择一个新变量移动到自由集中,然后对自由变量求解无约束的最小二乘问题。该算法最终保证能够给出准确的解,但对于具有 n 个变量的问题可能需要多达 n 次迭代。此外,还实施了一个特别的初始化过程,该过程确定最初将哪些变量设置为自由变量或活动变量。它需要一些迭代次数才能开始实际的 BVLS,但可以显着减少后续迭代次数。

参考

[STIR]

M. A. Branch、T. F. Coleman 和 Y. Li,“大规模边界约束最小化问题的子空间、内部和共轭梯度方法”《SIAM 科学计算杂志》,第 21 卷,第 1 期,第 1-23 页,1999 年。

[BVLS]

P. B. Start 和 R. L. Parker,“有界变量最小二乘:一种算法及应用”《计算统计》,10,129-141,1995 年。

示例

在此示例中,解决了具有大型稀疏矩阵和变量边界的某个问题。

>>> import numpy as np
>>> from scipy.sparse import rand
>>> from scipy.optimize import lsq_linear
>>> rng = np.random.default_rng()
...
>>> m = 20000
>>> n = 10000
...
>>> A = rand(m, n, density=1e-4, random_state=rng)
>>> b = rng.standard_normal(m)
...
>>> lb = rng.standard_normal(n)
>>> ub = lb + 1
...
>>> res = lsq_linear(A, b, bounds=(lb, ub), lsmr_tol='auto', verbose=1)
# may vary
The relative change of the cost function is less than `tol`.
Number of iterations 16, initial cost 1.5039e+04, final cost 1.1112e+04,
first-order optimality 4.66e-08.