【发布时间】:2019-08-28 14:07:23
【问题描述】:
我有一个优化问题,我想使用scipy.optimize.minimize 包,即不预见任何约束或界限的方法之一,例如'nelder-mead'、'powell'、'cg'、'bfgs ', newton-cg', 'dogleg', 'trust-ncg' - 见:minimize exception about bounds and constraints。
我想通过在我的成本函数周围添加一个包装器来自己引入界限:
这个包装器被优化器调用并将参数传递给我想要优化的成本函数。成本函数将一个值返回给包装器。
如果优化器使用超出参数允许范围的参数调用包装器,包装器随后会在成本函数的结果中添加一些额外的“惩罚”,并传递惩罚和结果的总和将成本函数返回给优化器。
我的问题是:
如果我有一个像这样的二元惩罚函数(仅显示边界的上限),优化是否会正常工作(这意味着:它会以更高的概率找到我的成本函数的绝对最小值):
if parameter > upperBound:
penalty = 1.e6
else:
penalty = 0.0
或者使用更平滑的惩罚函数(模拟 Lipschitz 连续函数之类的东西)更好,比如 e. G。移位平方函数:
if parameter > upperBound:
penalty = VERY_HIGH_NUMBER * (parameter - upperBound)**2
else:
penalty = 0.0
如果使用更平滑的惩罚函数更好,对于这类函数是否有任何“最佳实践”(例如使用 sigmoid 函数或平方函数等)?
【问题讨论】:
-
为什么算法(子集)选择这样?为什么使用 bfgs (无边界),但不使用支持边界的 lbfgs (以比您建议的更合理的方式)?为什么不区分无梯度(nelder-mead,powell?)和基于梯度的方法?二元惩罚将使所有基于梯度的求解器的假设无效(通常:两次可微)。平滑的方法更好(但 HIGH-NUMBER 可能会引入数值问题),但细节取决于所选的求解器,并且 绝对最小值 只能通过凸选择曲面来保证(同时不会使可微性无效)。
-
感谢您的评论。您是对的,可以进一步区分不同的方法。我的观察是,一些未绑定的求解器在我的成本函数上工作得非常好,因此我想知道一个通用的解决方案会是什么样子,也为它们使用边界。
标签: python scipy mathematical-optimization