告诉scipy.optimize.minimize失败

时间:2014-05-14 16:01:16

标签: python scipy mathematical-optimization minimize

我正在使用scipy.optimize.minimize来无限制地优化目标函数,该目标函数接收几个参数并基于这些参数运行复杂的数值模拟。这个模拟并不总是收敛,在这种情况下,我使目标函数返回inf,在某些情况下,在其他NaN。

我认为这种黑客攻击可以防止最小化聚集在一组参数附近,使模拟发生分歧。相反,我遇到了一种情况,即模拟甚至不会收敛起始参数集,但是不是失败,优化会在0次迭代时“成功”终止。它似乎并不关心返回inf的目标函数。

有没有办法告诉scipy.optimize.minimize失败,例如通过提出某种例外。虽然在这种情况下很明显,优化没有成功终止 - 因为0迭代和我知道最佳结果的事实 - 在某些时候我想运行我不知道解决方案的问题,我需要依靠最小化告诉我是不是打了风扇。如果返回大量的nans和infs并没有“破坏”算法,我想我将不得不通过暴力破解。


以下是几乎迭代的样子。 函数 - 两个变量的函数 - 被称为4次:
1)在起点 - >模拟发散,f(x)= inf
2)在右边1e-5点(梯度近似) - >模拟发散,f(x)= inf
3)在1e-5点(grad.appr。) - >模拟收敛,f(x)=某个有限值
4)在起点再次 - >模拟发散,f(x)= inf

1 个答案:

答案 0 :(得分:1)

我有两个我能想到的选择:

  • 选择约束优化
  • 修改目标函数,以便在数值模拟不收敛时发散。基本上这意味着返回一个较大的值,与“正常”值相比较大,这取决于您手头的问题。 minimize然后将尝试优化向另一个方向前进

但我有点惊讶minimize不理解inf作为一个大值,并且不会试图寻找另一个方向的解决方案。可能只有当你的目标函数返回nan时才会返回0次迭代吗?您可以尝试通过在目标函数中的return语句之前打印值来调试问题。

相关问题