Python中最小二乘法least_squares的调用及参数说明
在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。scipy.optimize.least_squares
是 SciPy
库中用于解决非线性最小二乘问题的函数,调用此函数后便可计算出最优点。
(function) def least_squares(
fun: Any,
x0: Any,
jac: str = '2-point',
bounds: Any = (-np.inf, np.inf),
method: str = 'trf',
ftol: float = 1e-8,
xtol: float = 1e-8,
gtol: float = 1e-8,
x_scale: float = 1,
loss: str = 'linear',
f_scale: float = 1,
diff_step: Any | None = None,
tr_solver: Any | None = None,
tr_options: Any = {},
jac_sparsity: Any | None = None,
max_nfev: Any | None = None,
verbose: int = 0,
args: Any = (),
kwargs: Any = {}
) -> Any
scipy.optimize.least_squares中的参数设置
-
fun
: - 含义:这是一个必须提供的参数,用于计算模型预测值和实际值之间的残差,该函数接收一个参数(待优化的变量向量),并返回一个向量,表示残差结果。这个函数在设置时要确保其准确性和高效性,能够符合自己的需求。
-
x0
: - 初始猜测值,即优化变量的初始值,若是有两个变量,初始值就是两个值。合理的初始值可以加速收敛。对于简单问题,可以根据经验或者问题的特性进行猜测;对于复杂问题,可以通过一些近似方法或者场景环境来得到一个相对合理的初始值。如果初始值选择不当,可能导致算法收敛缓慢甚至不收敛。
-
jac
: - 用于计算雅可比矩阵(Jacobian matrix)的方法。雅可比矩阵是一个函数的一阶偏导数以一定方式排列成的矩阵,其元素是偏导数。jac参数可以是以下几种之一:
2-point
(默认)、3-point
、cs
或一个可调用对象(即用户自定义的函数)。2-point
和3-point
是数值方法,分别使用二点差分法和三点差分法来估计雅可比矩阵;cs
使用复步长差分法,但要求函数能够处理复数输入;可调用对象则直接提供雅可比矩阵的计算。 -
bounds
: - 自变量的边界约束,下界和上界可以是一个数,即对所有参数使用相同的边界,也可以是一个数组,对每个参数使用不同的边界。如果不设置边界,则默认为
(-np.inf, np.inf)
,表示没有边界限制。当变量有实际的物理意义或者范围限制时,可以设置合适的边界。例如,如果变量代表长度,那么它肯定是非负的,可以将下界设置为0。合理的边界设置可以避免算法搜索到不合理的区域,提高优化的可靠性。 -
method
: - 选择优化算法的方法。
trf
(默认值):是一种信赖域反射算法,适用于大多数一般的非线性最小二乘问题,具有较好的稳定性和收敛性。dogbox
:对于具有边界约束的小型问题可能比较有效,但计算量相对较大。lm
是Levenberg-Marquardt
算法,通常用于解决小的无约束问题。 -
ftol, xtol, gtol
- 这些参数分别用于指定优化过程的终止条件。
ftol
是目标函数值变化的相对容忍度;xtol
是独立变量变化的相对容忍度;gtol
是梯度的范数的容忍度。当这些条件满足时,优化过程将停止。较小的值要求更高的精度,但可能导致算法运行时间增加,需要根据实际需求平衡精度和效率。 -
x_scale
- 用于控制变量的缩放。它可以是一个与
x0
相同大小的数组,表示每个变量的不同缩放因子;也可以是一个标量,表示所有变量的相同缩放因子。默认值为1.0,表示不进行缩放。当不同变量的数量级差异较大时,适当设置x_scale
可以改善算法的性能和收敛性。 -
loss
-
损失函数的类型,用于对残差进行加权或处理异常值。可选的损失函数包括
linear
(线性损失函数,默认)、soft_l1
、huber
、cauchy
和arctan
。
在scipy.optimize.least_squares
函数中,loss
参数用于指定损失函数(loss function),该函数决定了如何衡量模型预测值与实际值之间的差异。不同的损失函数适用于不同的场景,下面对linear
、soft_l1
、huber
、cauchy
和arctan
这五种损失函数所适用的不同情况进行介绍:(1). linear(线性损失) 当数据中的噪声分布较为均匀,且对异常值(outliers)的敏感性不高时,线性损失是一个简单的选择。 它直接计算预测值与实际值之差的平方。 (2). soft_l1(软L1损失) 当数据中存在较多异常值,且希望模型对这些异常值具有一定的鲁棒性时,软L1损失是一个较好的选择。它比L1损失更加平滑,减少了在零点附近的梯度突变,从而有助于优化过程的稳定性。 (3). huber(Huber损失) Huber损失结合了L2损失和L1损失的优点,在残差较小时表现为L2损失(平方损失),在残差较大时表现为L1损失(绝对值损失)。 这种特性使得Huber损失对异常值具有更强的鲁棒性,同时保持了L2损失在残差较小时的良好性质。 (4). cauchy(柯西损失) 柯西损失通常用于那些需要对残差进行较为平滑处理的场景。它通过自然对数函数对残差进行变换,从而减少了极端值对损失函数的影响。 (5). arctan(反正切损失) 反正切损失同样是一种平滑的损失函数,它通过对残差进行反正切变换,使得在残差较大时,损失的增长趋于平缓。这种特性有助于减少异常值对模型训练过程的影响。
-
f_scale
- 用于缩放残差的尺度因子,默认值为 1。可以根据残差的数量级进行调整,有助于算法更好地处理不同尺度的问题。
-
diff_step
- 在有限差分计算雅可比矩阵时使用的步长,如果为
None
则根据默认规则确定。当默认步长不合适时,可以手动设置合适的步长,但需要注意步长过大会导致近似误差增加,步长过小会增加计算量。 -
tr_solver, tr_options
tr_solver
是信赖域子问题的求解方法,仅当method
为trf
或dogbox
时有效。tr_options
是传递给信赖域求解器的额外选项参数,以字典形式传递,根据所选择的tr_solver
和具体问题的需求设置相应的选项,例如迭代次数限制等。-
jac_sparsity
- 如果雅可比矩阵是稀疏的,可以提供其稀疏结构信息。
-
max_nfev
- 函数评估的最大次数。如果达到这个次数,最小化算法就会停止,无论是否收敛。默认值是None,表示自动选择一个合适的值,此时会根据
ftol, xtol, gtol
的容忍条件进行停止。 -
verbose
- 控制输出信息的详细程度,值越大输出信息越详细。默认为0,表示不输出任何信息。
-
args, kwargs
- 这两个参数用于将额外的参数传递给
fun
函数。args
是一个元组,包含位置参数;kwargs
是一个字典,包含关键字参数。
scipy.optimize.least_squares中的返回值
x
:- 优化后的变量值,即最小二乘问题的解。例如,如果我们正在优化一个函数来拟合一些数据点,
x
就是使拟合误差最小的参数值。 success
- 一个布尔值,表示优化是否成功收敛。
cost
:- 优化后的残差平方和。这是衡量优化结果好坏的一个指标,值越小表示拟合效果越好。
fun
- 与
cost
相同,但在某些情况下可能包含额外的信息,具体取决于函数实现。 grad
- 目标函数在解向量x处的梯度(如果请求了梯度)。
jac
- 目标函数关于参数的雅可比矩阵(如果请求了雅可比矩阵)。
nfev
:- 目标函数的调用次数。可以用来了解优化过程中计算量的大小,对于优化算法的性能分析和调整有一定的参考价值。
njev
:- 雅可比矩阵评估的次数。类似于
nfev
,对于分析优化过程中雅可比矩阵计算的效率和对整体计算量的影响有帮助。 nhev
- Hessian矩阵的计算次数(如果使用了Hessian矩阵)。
status
:- 优化过程的状态码。不同的状态码表示不同的情况,例如成功收敛、达到最大迭代次数等,可以根据状态码判断优化是否成功以及可能的原因。
message
:- 与状态码对应的详细信息描述。
作者:Limiiiing