scipy.optimizeのsmode'linesearchの正の方向微分'はどういう意味ですか?
たとえば、fmin_slsqphttp ://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html
scipy.optimizeのsmode'linesearchの正の方向微分'はどういう意味ですか?
たとえば、fmin_slsqphttp ://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html
これらの最適化アルゴリズムは通常、降下方向を選択し、その方向へのライン探索を実行することで機能します。このメッセージは、オプティマイザーが目的関数の値が減少する方向を見つけることができなかった(十分に速い)位置に到達したが、現在の位置が最小であることを確認できなかったことを意味すると思います。
それが何を意味するのかはまだわかりませんが、どうやって解決するのか。基本的に、最適化された関数はより小さな値を返す必要があります。
F(x):
...
return value / 10000000
関数の変更を避けるために、ftolパラメーターとepsパラメーターを試してみることもできます。ftolをより高い値に変更することは、関数をより小さな値に変更することと同じです。
このエラーが発生する1つの状況は、次の場合です。
x0
で定義した有効範囲外ですbounds
。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として。受け入れられた回答で指摘されているように、アルゴリズムはこれが最小であることを確認できません。
このメッセージは、オプティマイザーが目的関数の値が減少する方向を見つけることができなかった(十分に速い)位置に到達したが、現在の位置が最小であることを確認できなかったことを意味すると思います。
これは完全な答えではありませんが、smodeを生成するソースコードをここで確認できます。
https://github.com/scipy/scipy/blob/master/scipy/optimize/slsqp/slsqp_optmz.f
(あなたが質問している「ライン探索の正の方向微分」)の割り当てはmode = 8
、412行目と486行目にあります。コードで割り当てられている理由を理解できれば、答えが得られます。