scipy.optimize'linesearch的正方向导数'的含义是什么意思?
例如在fmin_slsqp中 http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html
答案 0 :(得分:15)
这些优化算法通常通过选择下降方向,然后对该方向执行线搜索来工作。我认为这个消息意味着优化器进入了一个位置,它无法找到目标函数值减小的方向(足够快),但也无法验证当前位置是否为最小值。
答案 1 :(得分:13)
我仍然不知道它意味着什么,但如何解决它。基本上,优化的函数需要返回一个较小的值。
F(x):
...
return value / 10000000
答案 2 :(得分:5)
为避免更改功能,您还可以尝试使用ftol和eps参数进行试验。将ftol更改为更高的值相当于将函数更改为更小的值。
答案 3 :(得分:1)
这不是一个完整的答案,但你可以在这里看到生成smode的源代码:
https://github.com/scipy/scipy/blob/master/scipy/optimize/slsqp/slsqp_optmz.f
mode = 8
的分配(你要问的“linesearch的正向导数”)可以在第412和486行找到。如果可以找出为什么在代码中分配它们,你就得到了答案。
答案 4 :(得分:1)
收到此错误的一种情况是何时
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。在接受的答案中指出,该算法无法验证这是最小值:
我认为此消息意味着优化器无法找到目标函数值减小(足够快)的方向,但也无法验证当前位置是否最小。