Pregunta sobre scipy – Derivado direccional positivo para la búsqueda de líneas

9

¿Qué significa el smode of scipy.optimize 'Derivado direccional positivo para la búsqueda de líneas'?

por ejemplo en fmin_slsqphttp://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html

Por favor, dar un enlace a la página de documentación. Sven Marnach

Tu respuesta

5   la respuesta
15

dirección de descenso y luego realizar una búsqueda de líneas en esa dirección. Creo que este mensaje significa que el optimizador llegó a una posición en la que no logró encontrar una dirección en la que el valor de la función objetivo disminuya (lo suficientemente rápido), pero tampoco podría verificar que la posición actual sea la mínima.

1

Una situación en la que recibe este error, es cuando

x0 está fuera del rango válido definido enbounds.y el máximo sin restricciones se alcanza para valores fuerabounds.

Configuraré un problema hipotético de optimización, lo ejecutaré con dos valores iniciales diferentes e imprimiré la salida descipy.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)]

Ahora que la función de pérdida, gradiente, x0 y límites están en su lugar, podemos resolver el problema:

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])

Como @pv. señalado en la respuesta aceptada, el algoritmo no puede verificar que esto es un mínimo:

Creo que este mensaje significa que el optimizador se ubicó en una posición en la que no logró encontrar una dirección en la que el valor de la función objetivo disminuya (lo suficientemente rápido), pero tampoco podría verificar que la posición actual sea la mínima.

5

Para evitar cambiar su función, también puede intentar experimentar con los parámetros ftol y eps. Cambiar ftol a un valor más alto es equivalente a cambiar la función a un valor más pequeño.

mejor adecuado como comentario jjj
Es cierto que Cometí un error al publicar y no sabía cómo corregirlo. danielrd
12

Todavía no sé qué significa, pero cómo resolverlo. Básicamente, la función que está optimizada necesita devolver un valor más pequeño.

F(x):
    ...
    return value / 10000000
La respuesta más general es que la función que se está optimizando está mal escalada. Creo que lo ideal es que la función sobre la que se optimiza debería tender a dar una media en algún punto dentro del rango de 1 a 5. Para mi caso de uso, tuve que multiplicar por 1000. jebob
Sé que esta es una pregunta antigua, pero si está dividiendo la función para ser optimizada porn para persuadir al método a trabajar, ¿qué haces con los valores?x en las soluciones? Windstorm1981
@ Windstorm1981, si solo escala el objetivo, los valores de la soluciónx Debe ser bueno como es. Sin embargo, si también escala los valores de entrada, entonces tiene que invertir la escala al final para obtener la solución real. Para estos problemas, realmente es mejor si todos los valores, tanto las entradas como los objetivos, se escalan para ser orden 1. Se requiere un cierto esfuerzo para implementar esta escala y desescalado al final, pero si el problema de optimización es grande, esto debería ayudar Convergencia mucho. Mike
1

No es una respuesta completa, pero puedes ver el código fuente que genera el smode aquí:

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

Asignaciones demode = 8 (la "Derivada direccional positiva para la búsqueda de líneas" sobre la que está preguntando) se puede encontrar en las líneas 412 y 486. Si puede averiguar por qué están asignadas en el código, tiene su respuesta.

Preguntas relacionadas