我使用scipy.optimize.minimize对一个目标函数进行无限制优化,该目标函数接收几个参数并基于这些参数运行复杂的数值模拟。这种模拟并不总是收敛的,在这种情况下,我使目标函数返回inf,在某些情况下,在另一些情况下。
我认为这种方法可以防止最小化收敛到一组参数附近的任何地方,从而使模拟发散。相反,我遇到了这样一种情况:模拟甚至不会收敛到起始参数集,但是优化不是失败,而是以0次迭代“成功”结束。它似乎并不关心返回inf的目标函数。
有没有办法告诉scipy.optimize.minimize失败,例如引发某种异常。虽然在这种情况下,很明显优化没有成功终止-因为0次迭代和事实上,我知道最佳结果-在某个点上,我想运行的问题,我不知道的解决方案,我需要依靠最小化告诉我,如果大便击中风扇。如果返回大量的nans和infs不会“破坏”算法,我想我将不得不用暴力来完成它。
下面是一个几乎迭代的例子。
这个函数是由两个变量组成的函数,总共被调用了4次:
1)起点->模拟发散,f(x)=inf
2)在1E-5到右边(梯度近似)->模拟发散,F(x)= INF
3)在高于1e-5点(梯度。近似值->模拟收敛,f(x)=一些有限值
4)在起始点再次->模拟发散,f(x)=inf

最佳答案

你有两个选择:
选择约束优化
修改目标函数,使其在数值模拟不收敛时发散。基本上这意味着返回一个较大的值,与“正常”值相比较大,这取决于您手头的问题。minimize然后将尝试优化朝另一个方向前进
然而,我有点惊讶于minimize没有将inf理解为一个大值,也没有试图从另一个方向寻找解决方案。是否只有当目标函数返回nan时,它才以0次迭代返回?您可以尝试通过打印目标函数中return语句前面的值来调试该问题。

关于python - 告诉scipy.optimize.minimize失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23659698/

10-10 17:14