当 scipy.optimize.minimize 可能用于相同的事情时,为啥 scipy.optimize.least_squares 存在?

Posted

技术标签:

【中文标题】当 scipy.optimize.minimize 可能用于相同的事情时,为啥 scipy.optimize.least_squares 存在?【英文标题】:Why does scipy.optimize.least_squares exist when scipy.optimize.minimize could potentially be used for the same things?当 scipy.optimize.minimize 可能用于相同的事情时,为什么 scipy.optimize.least_squares 存在? 【发布时间】:2018-08-19 02:08:21 【问题描述】:

我试图理解为什么scipy.optimize.least_squares 存在于scipy 中。此功能可用于执行模型拟合。但是,可以使用scipy.optimize.minimize 来做同样的事情。唯一的区别是scipy.optimize.least_squares 在内部计算卡方,而如果要使用scipy.optimize.minimize,他/她将不得不在用户想要最小化的函数中手动计算卡方。此外,scipy.optimize.least_squares 不能被视为 scipy.optimize.minimize 的包装器,因为它支持的三种方法(trfdogboxlm)根本不被 scipy.optimize.minimize 支持。

所以我的问题是:

scipy.optimize.minimize 可以达到相同的结果时,为什么还存在scipy.optimize.least_squares? 为什么scipy.optimize.minimize 不支持trfdogboxlm 方法?

谢谢。

【问题讨论】:

从历史上看,scipy 是一组过于专业化或“先进”而无法适应 numpy 的工具。一旦将工具放入这样的包中,就很难删除(以防有人仍在使用它)。为什么这样的问题只能通过深入研究代码历史、github 问题和开发者讨论(以及前 github 时代的历史片段)来回答。 但是,查看least_squares 文档,我发现它是不久前在 0.17 中新增的。所以可能有很多关于它的讨论。例如:github.com/scipy/scipy/issues/5020 和 github.com/scipy/scipy/pull/5019 您也可以使用minimize 来求解线性规划的实例,但这很愚蠢(与使用 LP 求解器相比;更专业)。对于一个非常常见的问题,它只是一个更专业的功能。为什么要在这里使用minimize(哪个确切的问题,哪个求解器以及哪种 jac/hess 计算)? (在某些情况下 l-bfgs-b 可能会变得有趣) 方便。最小二乘法非常常见,① 有一个名为 least_squares 的方法很方便,② 有一个 开箱即用 专门用于常见任务的方法很方便(我的意思是,没有关键字参数,没有考虑......瞄准,开火,BOOM) 【参考方案1】:

scipy.optimize.least_squares 中的算法利用最小化问题的最小二乘结构来更好地收敛(或使用的导数的低阶)。

类似于高斯-牛顿算法和牛顿法的区别,见Wikipedia或this question。

特别是,Gauss-Newton 仅使用 Jacobian(一阶导数),而 Newton 方法还使用 Hessian(二阶导数),计算成本很高。

【讨论】:

以上是关于当 scipy.optimize.minimize 可能用于相同的事情时,为啥 scipy.optimize.least_squares 存在?的主要内容,如果未能解决你的问题,请参考以下文章

使用 scipy.optimize.minimize 提前停止损失函数

`scipy.optimize.minimize` 中的 Jacobian 和 Hessian 输入

scipy.optimize.minimize 选择无视约束的参数

为啥 scipy.optimize.minimize (默认)在不使用 Skyfield 的情况下报告成功?

打印选择的 scipy.optimize.minimize 方法

将 scipy.optimize.minimize 限制为整数值