16

scipy.optimize '线搜索的正方向导数'的 smode 是什么意思?

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

4

5 回答 5

24

这些优化算法通常通过选择下降方向,然后对该方向执行线搜索来工作。我认为这条消息意味着优化器进入了一个位置,它无法找到目标函数值减小的方向(足够快),但也无法验证当前位置是否为最小值。

于 2012-06-24T11:41:41.973 回答
17

我仍然不知道这意味着什么,但如何解决它。基本上,优化后的函数需要返回一个较小的值。

F(x):
    ...
    return value / 10000000
于 2016-04-18T03:29:15.673 回答
6

为避免更改您的功能,您还可以尝试使用 ftol 和 eps 参数。将 ftol 更改为更高的值相当于将函数更改为更小的值。

于 2017-06-12T13:11:15.187 回答
5

您收到此错误的一种情况是

  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。在接受的答案中指出,算法无法验证这是最小值:

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

于 2018-08-22T11:12:08.407 回答
1

这不是一个完整的答案,但您可以在此处查看生成 smode 的源代码:

https://github.com/scipy/scipy/blob/master/scipy/optimize/slsqp/slsqp_optmz.f

可以在第 412 行和第 486 行中找到(您所询问的“线搜索的正方向导数”)的分配mode = 8。如果可以弄清楚为什么在代码中分配它们,那么您已经得到了答案。

于 2012-06-22T13:41:39.447 回答