Scipy.optimize最小化花费的时间太长

时间:2016-07-29 00:26:15

标签: python optimization scipy minimize

我正在运行约1500个变量的约束优化问题,并且运行时间超过30分钟....

如果我将公差降低到1,最小化将在大约五分钟内完成,但这似乎不是加快速度的好方法。

from scipy.optimize import minimize

results = minimize(objFun, initialVals, method='SLSQP', bounds = bnds, constraints=cons, tol = toler)

print(results)

fun: -868.72033130318198
jac: array([ 0.,  0.,  0., ...,  0.,  0.,  0.])
message: 'Optimization terminated successfully.'
nfev: 1459
nit: 1
njev: 1
status: 0
success: True
x: array([ 0.,  0.,  0., ...,  1.,  1.,  1.])

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:8)

您的公差应设置为您需要的公差。将其设置得更高只会告诉优化器更快停止并且实际上不会加速它。话虽这么说,如果不需要它可能会浪费你的时间。

减少所需时间的可能方法如下:

  • 使用其他优化工具
  • 使用不同的渐变查找方法
  • 加快目标功能
  • 减少设计变量的数量
  • 选择更好的初始猜测
  • 使用并行处理

渐变方法

当您使用有限差分时,您需要(1 +设计变量的数量)评估您的目标函数以获得总灵敏度。

正如ev-br所说,如果你能找到jacobian的解析解,那就不需要了。基于这个事实,你有1500个设计变量。我猜这并不容易,但如果你的目标函数允许,自动区分可能是一种选择。我有一些你可以看到的AlgoPy经验。

目标函数速度

由于目标函数评估数量很多,这可能是最简单的方法。再一次,请参阅ev-br的回答,例如使用cython进行编译,以及一般降低复杂性。您可以尝试使用timeit运行部分代码,以查看更改是否有益。

设计变量

减少设计变量的数量会线性降低有限差分所需的目标函数调用。您的所有变量都会发生显着变化有些可以固定在设定值?你能从其他人那里得到一些吗?

初始猜测

根据您的问题,您可以选择一个更好的起点,这意味着您的优化器“更接近”最终解决方案。根据您的问题,您也可以从之前的结果中重新启动优化。

并行化

有限差分评估不必按顺序进行,因此您可以编写自己的有限差分函数,然后使用multiprocessing类并行运行调用。其有效性取决于您的系统和可用内核数量。

答案 1 :(得分:2)

这就是我要做的事情:

  • 描述最小化。从您的输出看,评估功能似乎是瓶颈。检查是否是这样。如果是,那么:
  • 看看你是否可以用纸和笔或CAS系统计算雅可比。使用它而不是有限差异。
  • 看看你是否可以加速功能本身(数学简化,numpy矢量化,cython)