16

scipy.optimizeのsmode'linesearchの正の方向微分'はどういう意味ですか?

たとえば、fmin_slsqphttp ://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つの状況は、次の場合です。

  1. x0で定義した有効範囲外ですbounds
  2. の外側の値では、制約のない最大値が達成されますbounds

架空の最適化問題を設定し、2つの異なる初期値で実行して、次の出力を出力します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

(あなたが質問している「ライン探索の正の方向微分」)の割り当てはmode = 8、412行目と486行目にあります。コードで割り当てられている理由を理解できれば、答えが得られます。

于 2012-06-22T13:41:39.447 に答える