【发布时间】: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