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

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

给定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,)

目标矢量。

boundsARRAY_LIKE的2元组,可选

自变量的上下界。默认为无边界。每个数组必须具有形状(n,)或标量,在后一种情况下,所有变量的界限都相同。使用 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’},可选

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

  • ‘精确’:使用密集QR或SVD分解方法。在以下情况下不能使用 A 是稀疏或LinearOperator。

  • “lsmr”:使用 scipy.sparse.linalg.lsmr 迭代过程,只需要矩阵向量乘积求值。不能与一起使用 method='bvls'

如果为无(默认),则根据类型选择求解程序 A

lsmr_tolNone、Float或‘auto’,可选

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

max_iterNONE或INT,可选

终止前的最大迭代次数。如果为None(默认值),则将其设置为100 method='trf' 或设置为 method='bvls' (不计算“bvls”初始化的迭代次数)。

verbose{0,1,2},可选

算法的详细程度:

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

  • 1:显示终止报告。

  • 2:显示迭代过程中的进度。

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

找到解决方案。

cost浮动

解决方案的成本函数的值。

funndarray,形状(m,)

解的残差向量。

optimality浮动

一阶最优性测度。确切的意思取决于 method ,请参阅 tol 参数。

active_mask整数的ndarray,Shape(n,)

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

  • 0:约束未处于活动状态。

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

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

可能有些武断,因为 trf 方法,因为它生成严格可行的迭代序列,并且active_ask被确定在容差阈值内。

nit集成

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

status集成

算法终止原因:

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

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

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

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

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

message应力

终止原因的口头描述。

success布尔尔

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

参见

nnls

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

least_squares

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

注意事项

该算法首先通过以下方法计算无约束最小二乘解 numpy.linalg.lstsqscipy.sparse.linalg.lsmr 取决于 lsq_solver 。如果此解决方案位于边界内,则将其作为最优解决方案返回。

方法“trf”运行中描述的算法的改编 [STIR] 对于线性最小二乘问题。迭代次数本质上与非线性最小二乘算法相同,但由于二次函数模型总是精确的,我们不需要跟踪或修改信任域的半径。当选择的步骤没有降低成本函数时,线搜索(回溯)被用作安全网。有关该算法的更详细说明,请参阅 scipy.optimize.least_squares

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

参考文献

STIR

M.A.Branch,T.F.Coleman,和Y.Li,“A子空间、内部和共轭梯度法求解大规模边界约束最小化问题”,SIAM Journal on Science Computing,第21卷,第1期,第1-23页,1999年。

BVLS

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

示例

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

>>> 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.