我目前正试图在数值上解决最小化问题,并尝试使用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(即初始点)。我想这个错误可能是由两个问题引起的:
目标函数不是凸的:但我检查了其他非凸函数,方法给了我正确的结果。
目标函数由于日志而远离最小值时“非常平坦”。
我的假设是真的吗?或问题来自其他任何问题? 无论错误是什么,我该怎么做才能纠正这个错误?特别是,我可以使用其他任何可用的最小化方法吗?
提前致谢。
答案 0 :(得分:1)
abs(x)
总是有点危险,因为它是不可微分的。大多数求解者都希望问题顺利进行。请注意,我们可以从您的目标函数中删除log
,然后删除1
,这样我们就可以使abs(x)
最小化。通常,这可以通过以下方式更好地完成。
而不是min abs(x)
使用
min t
-t <= x <= t
当然,这需要一个能够解决(线性)约束NLP的求解器。