Scipy.optimize最小化操作花费了太长时间

2024-05-31 23:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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.])

如有任何建议,将不胜感激。


Tags: 方法fromimport时间scipyarrayresultsmethod
2条回答

你的容忍度应该设定为你需要的任何容忍度。把它调高只会让乐观者更快地停下来,实际上并没有加快速度。也就是说,如果不需要的话,让它去一个更大的收费站可能是浪费你的时间。

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

  • 使用不同的乐观主义者
  • 使用不同的梯度查找方法
  • 加速你的目标函数
  • 减少设计变量的数量
  • 选择一个更好的初始猜测
  • 使用并行处理

梯度法

在使用有限差分法时,需要对目标函数进行(1+设计变量数)计算,以获得总灵敏度。

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

目标函数速度

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

设计变量

线性地减少设计变量的数量会降低有限差分所需的目标函数调用。你所有的变量都有显著的变化吗?有些能固定在一个设定值吗?你能从别人那里得到一些吗?

最初的猜测

根据你的问题,你可以选择一个更好的起点,这意味着你的乐观主义者离最终解决方案“更近”。根据您的问题,您还可以从以前的结果中“重新启动”您的优化。

并行化

不必按顺序执行有限差分计算,这样就可以编写自己的有限差分函数,然后使用multiprocessing类并行运行调用。其有效性取决于您的系统和可用的内核数。

我要做的是:

  • 描述最小化。从您的输出来看,评估函数似乎是瓶颈。看看是不是。如果是,那么:
  • 看看你能不能用纸和铅笔或CAS系统计算雅可比矩阵。用它代替有限差分。
  • 看看你能不能加速函数本身(数学简化,numpy矢量化,cython)

相关问题 更多 >