【问题标题】:Scipy.optimize minimize is taking too longScipy.optimize 最小化花费的时间太长
【发布时间】:2016-12-03 13:48:36
【问题描述】:

我正在运行一个包含大约 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.])

任何建议将不胜感激。

【问题讨论】:

  • 您是否尝试增加步长/有限差分导数 epsilon?如果它太小,有时不会/几乎没有进展,但这取决于问题(平滑度是一个重要因素)。您也可以尝试其他优化器。
  • 只需要一次迭代?你应该很高兴,看起来你没有提供梯度,所以求解器做了有限差分。你的函数评估起来似乎很昂贵,并且缺乏可用的梯度使得这个问题不太适合这个求解器。您可能需要查看无导数求解器。
  • 是否还有其他适用于非线性方程的 Python 约束优化库?我没见过。

标签: python optimization scipy minimize


【解决方案1】:

您的容差应设置为您需要的任何容差。将其设置得更高只是告诉优化器更快地停止并且实际上并没有加速它。话虽如此,如果不需要的话,让它去更大的容忍度可能会浪费你的时间。

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

  • 使用不同的优化器
  • 使用不同的梯度查找方法
  • 加速您的目标函数
  • 减少设计变量的数量
  • 选择更好的初始猜测
  • 使用并行处理

梯度法

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

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

目标函数速度

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

设计变量

减少设计变量的数量会线性降低有限差分所需的目标函数调用。您的所有变量是否都发生了显着变化?有些可以固定在设定值吗?你能推导出一些作为其他函数的函数吗?

初步猜测

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

并行化

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

【讨论】:

  • 如何将 AlgoPy 生成的导数合并到最小化函数中?作为我最初的猜测,我最初的猜测非常好,单独计算雅可比似乎是最好的选择。我可能会减少变量的数量,所以我也会研究一下。
  • 这可能是最好的自己的问题,我有一段时间没有使用它,但一般来说,自动微分实际上不会产生符号/编码微分函数,而是通过给定的输入,给你通过解析您的原始函数与这些输入衍生。所以我认为你的梯度函数将是使用目标函数的自动差异代码的包装器。
  • 好的。我已经手动计算了导数并将它们放入一个函数中,该函数在每个点返回雅可比行列......我们将看看它是如何工作的。
【解决方案2】:

这是我要做的:

  • 配置最小化。从您的输出看来,评估函数是瓶颈。检查是不是这样。如果是,那么:
  • 看看您是否可以用纸笔或 CAS 系统计算雅可比。使用它而不是有限差分。
  • 看看是否可以加速函数本身(数学简化、numpy 向量化、cython)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多