【发布时间】:2018-09-02 19:37:13
【问题描述】:
我在 scipy.minimize 中使用 SLSQP 求解器来求解约束优化问题。求解器经常会尝试违反约束的参数值。当违反这些约束时,目标函数返回nan。这似乎会带来问题,因为我的近似雅可比几乎每次重新计算时都充满了nan。通常情况下,优化会在exit mode 8: Positive directional derivative for linesearch 中终止。我怀疑近似雅可比行列式中的nan 是这个问题的根源。那么我的问题是 scipy.minimize 如何处理 nan 的?它们是良性的,还是应该将它们转换为一个大(甚至无限)的数字?据我所知,Scipy 文档中的任何地方都没有涵盖此信息。
【问题讨论】:
-
您应该假设每个 nan 都在杀死一切。所以:没有nans!唯一有效的 nan 是 API 级别的边界。在 SLSQP 方面,边界处理(恕我直言)也存在差异。在迭代期间将严格保持边界(没有关于边界的不可行解决方案是迭代),而约束则不是这样(它也可以描述边界)。
-
嗯,那么 nans 的处方是什么?他们应该转换为infs吗?还是其他一些较大的有限数?
-
这在很大程度上取决于特定的最小化器和/或问题。对于估计 Hessian 并使用返回高值的二阶导数的最小化器,可能会导致最小化器混淆。然而,对于不使用导数的方法(如 Nelder-Mead 单纯形算法),有时可以在参数超出范围时返回较大的值。
-
你最后做了什么?
标签: python optimization scipy nan minimize