Estou tentando implementar o algoritmo Nelder-Mead para otimizar uma função. A página da Wikipedia sobre Nelder-Mead é surpreendentemente clara sobre todo o algoritmo, exceto por seu critério de parada. Lá, infelizmente, diz:
Verifique a convergência [esclarecimentos necessários] .
Eu mesmo tentei e testei alguns critérios:
Pare se onde é pequeno e onde é o ésimo vértice do simplex, ordenado de baixo ( ) para alto ( ) valores da função. Em outras palavras, quando o valor máximo do simplex é quase igual ao valor mínimo. Descobri que isso não funcionava corretamente, pois isso não garante o que a função faz dentro do simplex. Exemplo, considere a função: Isso é trivial para otimizar, mas digamos que fazemos isso com NM e deixemos nossos dois pontos simplex serem e£ x i i f ( x 1 ), f ( x N + 1 ) f ( x ) = x 2 x 1 = - 1 x 2 = 1
. O algoritmo convergiria aqui sem encontrar o ideal.A segunda opção envolve a avaliação do centróide do simplex: stop if . Isso pressupõe que, se o ponto mais baixo do simplex e o centróide tiverem valores semelhantes, o simplex é suficientemente pequeno para chamar convergência.
Essa é uma maneira adequada de verificar a convergência? Ou existe uma maneira estabelecida de verificar isso? Não consegui encontrar nenhuma fonte sobre isso, pois a maioria dos hits da pesquisa se concentra na complexidade do algoritmo.
Respostas:
A descrição desse "algoritmo simplex em declive" nas versões originais das Receitas Numéricas é particularmente lúcida e útil. Por isso, citarei partes relevantes. Aqui está o plano de fundo:
Agora, para o problema em questão, encerrando o algoritmo. Observe a generalidade da conta: os autores fornecem conselhos intuitivos e úteis para encerrar qualquer otimizador multidimensional e, em seguida, mostram especificamente como ele se aplica a esse algoritmo específico. O primeiro parágrafo responde à pergunta diante de nós:
[Páginas 290-292.]
O código que acompanham este texto, em Numerical Recipes esclarece o significado de "fraccionadamente menor": a diferença entre os valores de e (tanto valores do argumento ou valores da função) é "fraccionadamente menor" do que um limiar quandoy T > 0x y T>0
com .f(x,y)=(|x|+|y|)/2
O lado esquerdo de às vezes é conhecido como "diferença absoluta relativa". Em alguns campos, é expresso como uma porcentagem, onde é chamado de "erro percentual relativo". Consulte o artigo da Wikipedia sobre Mudança e diferença relativa para obter mais opções e terminologia.(1)
Referência
William H. Press et al. , Receitas Numéricas: A Arte da Computação Científica. Cambridge University Press (1986). Visite http://numerical.recipes/ para obter as edições mais recentes.
fonte
Não é uma resposta completa, mas é muito longa para um comentário e pode colocá-lo no caminho certo.
Este tópico é tratado brevemente na página 171 de "Métodos numéricos compactos para computadores" 2nd Ed., Por John C. Nash. E passa a ser a referência citada para a rotina Nelder-Mead implementada na
optim()
função de R. Citando a parte relevante:Vou interromper para esclarecer que É a função que está sendo minimizada, são os pontos que definem o simplex dimensional; o ponto com o valor mais alto da função é e o ponto com o valor mais baixo da função é . Nash continua:S(.) b n+1 n bH bL
Uma rápida olhada na fonte
optim()
indica que ela usa a diferença entre os valores de função mais alto e mais baixo (dos pontos que definem o simplex) para determinar a convergência:if (VH <= VL + convtol || VL <= abstol) break;
OndeVH
está o valor alto eVL
o valor baixo. Isso vem com a ressalva de que dei uma olhada muito rápida na fonte e provavelmente estou perdendo alguma coisa.Agora, sua opção (1) parece ser a segunda abordagem defendida por Nash. Ele também discute o problema que você encontrou:
As referências originais às quais Nash se refere aqui são:
Nelder JA, Mead R. 1965. Um método simplex para minimização de funções. The Computer Journal 7: 308-313.
O'Neill R. 1971. Algoritmo AS 47: Minimização de funções usando um procedimento simplex. Estatística Aplicada 20: 338-345.
fonte
Um homem de palha: rastreie apenas o canto mais baixo com a regra de parada "paciência" :
O monitoramento de todos os cantos é definitivamente útil na verificação de escala de coordenadas razoável, restrições e NM simplex inicial. Se o rastreamento de todos os cantos pode melhorar a combinação den+1
continua a ser visto - casos de teste reais são bem-vindos.
(Uma
Stopiter
classe real tem muitas condições de parada, além depatience
; a mais simples é a hora do relógio de parede.)Veja também:
NLopt : muitos algoritmos, incluindo Nelder-Mead, fáceis de comparar. Veja especialmente as notas sobre Comparando algoritmos
Downhill : parando a paciência com
min_improvement
fonte