我使用 scipy.optimize.minimize 对目标函数进行无限制优化,该函数接收几个参数并基于这些参数运行复杂的数值模拟。这种模拟并不总是收敛,在这种情况下,我使目标函数返回 inf,在某些情况下,在其他情况下返回 NaN。
我认为这种黑客行为将阻止最小化在一组导致模拟发散的参数附近的任何地方收敛。相反,我遇到了一种情况,即模拟甚至不会针对起始参数集收敛,但优化并没有失败,而是以 0 次迭代“成功”终止。它似乎并不关心返回 inf 的目标函数。
有没有办法告诉 scipy.optimize.minimize 失败,例如通过提出某种异常。虽然在这种情况下,很明显优化没有成功终止 - 因为 0 次迭代并且我知道最佳结果 - 在某些时候我想要运行我不知道解决方案的问题,并且我需要依靠最小化来告诉我是否有问题。如果返回大量 nan 和 infs 不会“破坏”算法,我想我将不得不通过暴力来完成。
这是几乎迭代的示例。
该函数(两个变量的函数)总共被调用 4 次:
1)在起点 -> 模拟发散,f(x) = inf
2)在向右 1e-5 的点(梯度近似)-> 模拟发散,f(x) = inf
3)在 1e-5 高一点(梯度近似)-> 模拟收敛,f(x) = 某个有限值
4)再次在起点 -> 模拟发散,f(x) = inf
我能想到的你有两个选择:
- 选择约束优化
- 每当数值模拟不收敛时,修改目标函数以使其发散。基本上,这意味着返回一个大值,与“正常”值相比较大,这取决于您手头的问题。
minimize
然后会尝试优化另一个方向
然而我有点惊讶的是minimize
不明白inf
作为一个大值,并且不会尝试从另一个方向寻找解决方案。难道只有当你的目标函数返回时它才以 0 次迭代返回nan
?您可以尝试通过打印之前的值来调试问题return
目标函数中的陈述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)