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 : 数组类或
Bounds
的 2-tuple,可选数组类对象的2元组或 参数的下限和上限。默认为无界限。有两种方式指定界限:
Bounds
类的实例。2-tuple of array_like: 元组的每个元素必须是长度等于参数数量的数组,或者是标量(在这种情况下,边界对所有参数都相同)。使用
np.inf
并带有适当的符号来禁用所有或某些参数的边界。
- 方法‘trf’ 或 ‘bvls’, 可选
执行最小化的方法。
‘trf’ : 适用于线性最小二乘问题的信赖域反射算法。这是一种类似内点法的方法,所需的迭代次数与变量数量的相关性较弱。
‘bvls’ : 有界变量最小二乘算法。这是一种活动集方法,需要与变量数量相当的迭代次数。当 A 是稀疏矩阵或 LinearOperator 时不能使用。
默认是 ‘trf’。
- tolfloat, 可选
容差参数。如果在最后一次迭代中成本函数的相对变化小于 tol,则算法终止。此外,还考虑了一阶最优性度量:
method='trf'
在梯度的均匀范数(考虑到边界的缩放)小于 tol 时终止。method='bvls'
如果在 tol 容差范围内满足 Karush-Kuhn-Tucker 条件,则终止。
- lsq_solver{None, ‘exact’, ‘lsmr’}, 可选
在迭代过程中解决无界最小二乘问题的方法:
‘exact’ : 使用密集的QR或SVD分解方法。当 A 是稀疏矩阵或线性算子时不能使用。
‘lsmr’ : 使用
scipy.sparse.linalg.lsmr
迭代过程,该过程仅需要矩阵-向量乘积的评估。不能与method='bvls'
一起使用。
如果为 None(默认),求解器将根据 A 的类型选择。
- lsmr_tolNone, float 或 ‘auto’,可选
容差参数 ‘atol’ 和 ‘btol’ 用于
scipy.sparse.linalg.lsmr
。如果为 None(默认),则设置为1e-2 * tol
。如果为 ‘auto’,则容差将根据当前迭代的优化程度进行调整,这可以加快优化过程,但并不总是可靠。- max_iterNone 或 int,可选
终止前的最大迭代次数。如果为 None(默认),则对于
method='trf'
设置为 100,对于method='bvls'
设置为变量数量(不包括 ‘bvls’ 初始化的迭代次数)。- 详细{0, 1, 2}, 可选
算法详细程度的级别:
0 : 静默工作(默认)。
1 : 显示终止报告。
2 : 在迭代过程中显示进度。
- lsmr_maxiterNone 或 int,可选
如果使用 lsmr 最小二乘求解器(通过设置
lsq_solver='lsmr'
),最大迭代次数。如果为 None(默认),则使用 lsmr 的默认值min(m, n)
,其中m
和n
分别是 A 的行数和列数。如果lsq_solver='exact'
,则无效。
- 返回:
- 具有以下字段定义的
OptimizeResult
: - xndarray, 形状 (n,)
找到解决方案。
- 成本浮动
解处的成本函数值。
- 有趣ndarray, 形状 (m,)
解处的残差向量。
- 最优性浮动
一阶最优性度量。确切含义取决于 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
。- nit整数
迭代次数。如果无约束解是最优的,则为零。
- 状态整数
算法终止的原因:
-1 : 算法在上一次迭代中未能取得进展。
0 : 迭代次数超过最大值。
1 : 一阶最优性度量小于 tol。
2 : 成本函数的相对变化小于 tol。
3 : 无约束解是最优的。
- 消息str
终止原因的口头描述。
- 成功布尔
如果满足其中一个收敛标准则为真(status > 0)。
- 具有以下字段定义的
参见
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, 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 = 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.