scipy.optimize.fmin_bfgs: “Erro desejado não necessariamente alcançado devido à perda de precisão”

8

Estou recebendo o aviso no assunto da postagem ao tentar otimizar uma função no Python com a função scipy.optimize.fmin_bfgs . A saída completa:

Aviso: Erro desejado não necessariamente alcançado devido à perda de precisão

     Current function value: nan
     Iterations: 1
     Function evaluations: 18
     Gradient evaluations: 3

Não é um erro fatal, estou recebendo respostas, mas elas estão longe do ideal que eu procuro.

Existem erros típicos de "noob" que podem gerar esse erro? Comecei a trabalhar com este pacote apenas ontem; como é, nem sei por onde começar a procurar. Qualquer ajuda é apreciada!

ACEG
fonte

Respostas:

9

É útil em situações como essa dar uma olhada no código fonte . Isso é fácil porque tudo scipyé de código aberto!

Como você pode ver ao ler o código-fonte, a mensagem de aviso é impressa quando warnflag==2. Isso é definido em outro lugar no código quando a linesearchfunção retorna None (falha).

Então, por que a pesquisa de linhas falha? O objetivo de um algoritmo de otimização é encontrar os mínimos de alguma função objetiva por meio de um conjunto sucessivo de iterações. A pesquisa de linha, neste caso, está tentando encontrar um tamanho de etapa em que as aproximações no BFGS ainda sejam válidas. Quando o Hessian de sua função ou seu gradiente é mal comportado de alguma maneira, o tamanho da etapa entre colchetes pode ser calculado como zero, mesmo que o gradiente seja diferente de zero.

Acho que minha sugestão é ir à literatura (Nocedal e Wright têm uma boa discussão sobre pesquisa de linha e o método BFGS) ou à sua função e garantir que ela seja bem-comportada na região que você está pesquisando.

Aron Ahmadia
fonte
Obrigado, eu já tinha verificado o código fonte. Infelizmente, o problema é a minha falta de conhecimento teórico do BFGS :-) Consegui usar o BFGS com êxito com uma implementação não vetorizada, então acho que minhas matrizes não estão se comportando conforme o esperado. Essa pode ser uma direção para descobrir o problema.
ACEG
Se você indicar a função real que está tentando minimizar e a região em que está pesquisando, poderemos fornecer mais algumas dicas sobre como proceder.
Aron Ahmadia
1
Obrigado, resolvi o problema enquanto isso. O erro não tinha (como costuma acontecer) absolutamente nada a ver com os resultados problemáticos. Meu palpite estava certo, eu estava passando matrizes onde o método esperava matrizes transpostas. Agora ainda recebo o aviso inicial, mas há muitas mais iterações e recebo bons valores.
ACEG
Fazer a ligação é ligação podre ... atualização e incluem bits relevantes na própria resposta
Innisfree
link podre corrigido.
Aron Ahmadia 04/04/19