处理SciPy fmin_bfgs精度损失

时间:2016-10-04 12:59:31

标签: python scipy mathematical-optimization

我目前正试图在数值上解决最小化问题,并尝试使用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(即初始点)。我想这个错误可能是由两个问题引起的:

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

  • 目标函数由于日志而远离最小值时“非常平坦”。

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

abs(x)总是有点危险,因为它是不可微分的。大多数求解者都希望问题顺利进行。请注意,我们可以从您的目标函数中删除log,然后删除1,这样我们就可以使abs(x)最小化。通常,这可以通过以下方式更好地完成。

而不是min abs(x)使用

min t
-t <= x <= t

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