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.lstsq
或scipy.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.