【问题标题】:Dealing with SciPy fmin_bfgs precision loss处理 SciPy fmin_bfgs 精度损失
【发布时间】:2017-02-12 15:52:39
【问题描述】:

我目前正在尝试以数值方式解决最小化问题,并尝试使用 SciPy 中提供的优化库。

我的函数和导数有点复杂,这里就不介绍了,但是它们是基于以下函数,最小化也不起作用:

def func(x):
    return np.log(1 + np.abs(x))
def grad(x):
    return np.sign(x) / (1.0 + np.abs(x))

当调用 fmin_bfgs 函数(并将下降方法初始化为 x=10)时,我收到以下消息:

Warning: Desired error not necessarily achieved due to precision loss.
     Current function value: 2.397895
     Iterations: 0
     Function evaluations: 24
     Gradient evaluations: 22

并且输出等于 10(即初始点)。我想这个错误可能是由两个问题引起的:

  • 目标函数不是凸函数:但是我检查了其他非凸函数,该方法给了我正确的结果。

  • 由于对数,目标函数在远离最小值时“非常平坦”。

我的假设是真的吗?还是问题来自其他? 无论错误是什么,我能做些什么来纠正这个错误?特别是,我可以使用任何其他可用的最小化方法吗?

提前致谢。

【问题讨论】:

  • 您可以将np.abs(x) 替换为诸如here 所讨论的可微近似值。比如func返回np.log(1 + np.sqrt(x**2 + 10**-10))时优化没有问题
  • 确实!谢谢你的建议!我做了一些验证,似乎错误来自绝对值在 0 处的不可导性。

标签: python scipy mathematical-optimization


【解决方案1】:

abs(x) 总是有点危险,因为它是不可微的。大多数求解者期望问题是顺利的。请注意,我们可以从您的目标函数中删除log,然后删除1,因此我们只剩下最小化abs(x)。这通常可以通过以下方式做得更好。

min abs(x)代替

min t
-t <= x <= t

当然,这需要一个能够求解(线性)受限 NLP 的求解器。

【讨论】:

  • 我知道,不幸的是我别无选择,只能处理绝对值。此外,我不能将您的简化应用于我的实际目标函数。我在问题中提供的功能只是一个示例,可以在不提供实际功能的情况下使我的问题可重现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2020-07-28
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多