Pergunta sobre scipy – Derivativo direcional positivo para pesquisa de linhas

9

O que o smode de scipy.optimize 'derivada direcional positiva para linhas de pesquisa' significa?

por exemplo, em fmin_slsqphttp://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html

Por favor, dê um link para a página de documentação. Sven Marnach

Sua resposta

5   a resposta
15

reção de descida e, em seguida, realizando uma pesquisa de linha nessa direção. Acho que essa mensagem significa que o otimizador entrou em uma posição em que não conseguiu encontrar uma direção onde o valor da função objetivo diminui (rápido o suficiente), mas também não pôde verificar se a posição atual é mínima.

12

mas como resolvê-lo. Basicamente, a função que é otimizada precisa retornar um valor menor.

F(x):
    ...
    return value / 10000000
A resposta mais geral é que a função que está sendo otimizada é mal dimensionada. Acho que o ideal é que a função que está sendo otimizada deva dar uma média em algum lugar no intervalo de 1 a 5. Para o meu usecase, eu tive que multiplicar por 1000. jebob
@ Windstorm1981, se você dimensionar apenas o objetivo, os valores da soluçãox deve ser bom como é. Se, no entanto, você também dimensionou os valores de entrada, será necessário inverter o dimensionamento no final para obter a solução real. Para esses problemas, é realmente melhor se todos os valores, entradas e objetivos, forem escalonados para a ordem 1. É necessário algum esforço para implementar esse dimensionamento e desfibramento no final, mas se o problema de otimização for grande, isso deve ajudar muito convergência. Mike
Eu sei que esta é uma questão antiga, mas se você está dividindo a função a ser otimizada porn para persuadir o método a funcionar, o que você faz com os valoresx nas soluções? Windstorm1981
1

mas você pode ver o código fonte que gera o smode aqui:

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

Atribuições demode = 8 (a "derivada direcional positiva para linhas de pesquisa" sobre a qual você está perguntando) pode ser encontrada nas linhas 412 e 486. Se puder descobrir por que elas estão atribuídas no código, você terá sua resposta.

1

x0 está fora do intervalo válido que você definiubounds.e o máximo irrestrito é atingido para valores forabounds.

Vou configurar um problema hipotético de otimização, executá-lo com dois valores iniciais diferentes e imprimir a saída 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)]

Agora que a função de perda, gradiente, x0 e limites estão no lugar, podemos resolver o 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. apontado na resposta aceita, o algoritmo não pode verificar se isso é um mínimo:

Acho que essa mensagem significa que o otimizador entrou em uma posição em que não conseguiu encontrar uma direção onde o valor da função objetivo diminui (rápido o suficiente), mas também não pôde verificar se a posição atual é mínima.

5

você também pode experimentar os parâmetros ftol e eps. Alterar o ftol para um valor mais alto é equivalente a alterar a função para um valor menor.

mais adequado como comentário jjj
Verdade isso. Eu cometi um erro ao postar e não sabia como corrigi-lo. danielrd

Perguntas relacionadas