linesearch的正方向导数

时间:2012-06-22 11:58:24

标签: scipy

scipy.optimize'linesearch的正方向导数'的含义是什么意思?

例如在fmin_slsqp中 http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html

5 个答案:

答案 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)

收到此错误的一种情况是何时

  1. x0超出了您在bounds中定义的有效范围。
  2. ,对于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。在接受的答案中指出,该算法无法验证这是最小值:

  

我认为此消息意味着优化器无法找到目标函数值减小(足够快)的方向,但也无法验证当前位置是否最小。