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
此优化问题是凸的,因此找到的最小值(如果迭代收敛)保证是全局最小值。
- 参数:
- Aarray_like, 稀疏数组或 LinearOperator, 形状 (m, n)
设计矩阵。可以是
scipy.sparse.linalg.LinearOperator。- barray_like, 形状 (m,)
目标向量。
- bounds类数组的 2 元组或
Bounds, 可选 参数的下限和上限。默认为无边界。有两种方法可以指定边界
Bounds类的实例。array_like 的 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(默认),则对于
method='trf'设置为 100,对于method='bvls'设置为变量数量(不包括 ‘bvls’ 初始化的迭代次数)。- verbose{0, 1, 2}, 可选
算法的冗余级别
0:静默工作(默认)。
1:显示终止报告。
2:在迭代期间显示进度。
- lsmr_maxiterNone 或 int,可选
如果使用 lsmr 最小二乘求解器(通过设置
lsq_solver='lsmr'),lsmr 最小二乘求解器的最大迭代次数。如果为 None(默认),则使用 lsmr 的默认值min(m, n),其中m和n分别是 A 的行数和列数。如果lsq_solver='exact'则无效。
- 返回:
- OptimizeResult,包含以下字段
- xndarray, 形状 (n,)
找到的解。
- cost浮点数
解处的成本函数值。
- funndarray, 形状 (m,)
解处的残差向量。
- optimality浮点数
一阶最优性度量。确切含义取决于 method,请参阅 tol 参数的描述。
- active_maskint 的 ndarray, 形状 (n,)
每个分量显示相应的约束是否处于活跃状态(即变量是否在边界上)
0:约束不活跃。
-1:下限活跃。
1:上限活跃。
对于 trf 方法可能有些武断,因为它生成一系列严格可行的迭代,并且 active_mask 在容差阈值内确定。
- unbounded_sol元组
由最小二乘求解器(由 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
终止原因的口头描述。
- success布尔值
如果满足其中一个收敛准则(status > 0),则为 True。
另请参阅
nnls带非负约束的线性最小二乘。
least_squares带变量边界的非线性最小二乘。
附注
算法首先通过
numpy.linalg.lstsq或scipy.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, “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 和 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 random_array >>> from scipy.optimize import lsq_linear >>> rng = np.random.default_rng() ... >>> m = 2000 >>> n = 1000 ... >>> A = random_array((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