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)[源代码]#

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

给定一个 m×n 的设计矩阵 A 和一个具有 m 个元素的目标向量 b,lsq_linear 求解以下优化问题

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

这个优化问题是凸的,因此保证找到的最小值(如果迭代收敛)是全局最小值。

参数:
A类数组,线性算子的稀疏矩阵,形状 (m, n)

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

b类数组,形状 (m,)

目标向量。

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

参数的下界和上界。默认为无界。有两种方法来指定边界

  • Bounds 类的实例。

  • 类数组的 2 元组:元组的每个元素必须是长度等于参数数量的数组,或标量(在这种情况下,所有参数都采用相同的边界)。使用 np.inf 和适当的符号来禁用全部或某些参数的边界。

method‘trf’ 或 ‘bvls’,可选

执行最小化的方法。

  • ‘trf’:为线性最小二乘问题调整的信任区域反射算法。这是一种类似内点的算法,所需的迭代次数与变量数量的相关性较弱。

  • ‘bvls’:有界变量最小二乘算法。这是一种活动集方法,它需要与变量数量相当的迭代次数。当 A 是稀疏的或线性算子时不能使用。

默认值为 ‘trf’。

tol浮点数,可选

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

  • 如果梯度的一致范数(缩放以考虑边界的存在)小于 tol,则 method='trf' 终止。

  • 如果满足 Karush-Kuhn-Tucker 条件且在 tol 容差范围内,则 method='bvls' 终止。

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

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

  • ‘exact’:使用密集 QR 或 SVD 分解方法。当 A 是稀疏的或线性算子时不能使用。

  • ‘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 或整数,可选

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

verbose{0, 1, 2}, 可选

算法的详细程度

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

  • 1:显示终止报告。

  • 2:显示迭代过程。

lsmr_maxiterNone 或整数,可选

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

返回:
定义了以下字段的 OptimizeResult
xndarray,形状 (n,)

找到的解。

cost浮点数

解处的成本函数值。

funndarray,形状 (m,)

解处的残差向量。

optimality浮点数

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

active_mask整数的 ndarray,形状 (n,)

每个组件都显示对应的约束是否处于活动状态(即,变量是否在边界处)

  • 0:约束未激活。

  • -1:下界处于活动状态。

  • 1:上界处于活动状态。

对于 trf 方法,可能会有些武断,因为它会生成一系列严格可行的迭代,并且 active_mask 是在容差阈值内确定的。

unbounded_sol元组

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

nitint

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

statusint

算法终止的原因

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

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

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

  • 2:成本函数的相对变化小于 tol

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

messagestr

终止原因的文字描述。

successbool

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

另请参阅

nnls

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

least_squares

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

说明

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

方法“trf”运行 [STIR] 中描述的算法的调整版本,用于线性最小二乘问题。迭代本质上与非线性最小二乘算法相同,但由于二次函数模型始终准确,因此我们无需跟踪或修改信任区域的半径。当选定的步长不减小成本函数时,将使用线搜索(回溯)作为安全措施。请在 scipy.optimize.least_squares 中阅读有关该算法的更详细描述。

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

参考文献

[STIR]

M. A. Branch, T. F. Coleman, and Y. Li, “A Subspace, Interior, and Conjugate Gradient Method for Large-Scale Bound-Constrained Minimization Problems,” SIAM Journal on Scientific Computing, Vol. 21, Number 1, pp 1-23, 1999.

[BVLS]

P. B. Start and R. L. Parker, “Bounded-Variable Least-Squares: an Algorithm and Applications”, Computational Statistics, 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 = 2000
>>> n = 1000
...
>>> 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)
The relative change of the cost function is less than `tol`.
Number of iterations 10, initial cost 1.0070e+03, final cost 9.6602e+02,
first-order optimality 2.21e-09.        # may vary