scipy.optimize '线搜索的正方向导数'的 smode 是什么意思?
例如在 fmin_slsqp http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html
scipy.optimize '线搜索的正方向导数'的 smode 是什么意思?
例如在 fmin_slsqp http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html
这些优化算法通常通过选择下降方向,然后对该方向执行线搜索来工作。我认为这条消息意味着优化器进入了一个位置,它无法找到目标函数值减小的方向(足够快),但也无法验证当前位置是否为最小值。
我仍然不知道这意味着什么,但如何解决它。基本上,优化后的函数需要返回一个较小的值。
F(x):
...
return value / 10000000
为避免更改您的功能,您还可以尝试使用 ftol 和 eps 参数。将 ftol 更改为更高的值相当于将函数更改为更小的值。
您收到此错误的一种情况是
x0
超出您在 中定义的有效范围bounds
。bounds
。我将设置一个假设的优化问题,使用两个不同的初始值运行它并打印输出scipy.optimize
:
import numpy as np
from scipy import optimize
H = np.array([[2., 0.],
[0., 8.]])
c = np.array([0, -32])
x0 = np.array([0.5, 0.5]) # valid initial value
x1 = np.array([-1, 1.1]) # invalid initial value
def loss(x, sign=1.):
return sign * (0.5 * np.dot(x.T, np.dot(H, x)) + np.dot(c, x))
def jac(x, sign=1.):
return sign * (np.dot(x.T, H) + c)
bounds = [(0, 1), (0, 1)]
现在损失函数、梯度、x0 和边界已经到位,我们可以解决问题:
def solve(start):
res = optimize.minimize(fun=loss,
x0=start,
jac=jac,
bounds=bounds,
method='SLSQP')
return res
solve(x0) # valid initial value
# fun: -27.999999999963507
# jac: array([ 2.90878432e-14, -2.40000000e+01])
# message: 'Optimization terminated successfully.'
# ...
# status: 0
# success: True
# x: array([1.45439216e-14, 1.00000000e+00])
solve(x1) # invalid initial value:
# fun: -29.534653465326528
# jac: array([ -1.16831683, -23.36633663])
# message: 'Positive directional derivative for linesearch'
# ...
# status: 8
# success: False
# x: array([-0.58415842, 1.07920792])
作为@pv。在接受的答案中指出,算法无法验证这是最小值:
我认为这条消息意味着优化器进入了一个位置,它无法找到目标函数值减小的方向(足够快),但也无法验证当前位置是否为最小值。
这不是一个完整的答案,但您可以在此处查看生成 smode 的源代码:
https://github.com/scipy/scipy/blob/master/scipy/optimize/slsqp/slsqp_optmz.f
可以在第 412 行和第 486 行中找到(您所询问的“线搜索的正方向导数”)的分配mode = 8
。如果可以弄清楚为什么在代码中分配它们,那么您已经得到了答案。