Essa é uma questão mais geral, um tanto independente dos dados, então não tenho MWE.
Muitas vezes tenho funções fn(.)
que implementam algoritmos que não são diferenciáveis, mas que desejo otimizar. Eu costumo usar optim(.)
com seu método padrão, que funciona bem para mim em termos de velocidade e resultados.
No entanto, agora tenho um problema que exige que eu defina limites em um dos vários parâmetros de fn
. Pelo que entendi, optim(method="L-BFGS-B",...)
me permite definir limites para os parâmetros, mas também requer um gradiente. Como fn(.)
não é uma função matemática, mas um algoritmo, suspeito que ela não tenha um gradiente que eu pudesse derivar por meio da diferenciação. Isso me leva a perguntar se existe uma maneira de realizar a otimização restrita em R de uma forma que não exija que eu forneça um gradiente.
Eu olhei para algumas fontes, por exemplo, os textos de John C. Nash sobre este tópico, mas até onde eu os entendo, eles dizem respeito principalmente a funções diferenciáveis onde gradientes podem ser fornecidos.
Resumindo os comentários até agora (que são todas as coisas que eu mesmo teria dito):
method="L-BFGS-B"
sem fornecer gradientes explícitos (o gr
argumento é opcional); nesse caso, R calculará aproximações para a derivada por diferenciação finita (@ G.Grothendieck). É a solução mais simples, porque funciona "fora da caixa": você pode tentar e ver se funciona para você. Contudo:
L-BFGS-B
é provavelmente o mais meticuloso dos métodos fornecidos por optim()
( por exemplo, não pode lidar com o caso em que um conjunto de parâmetros de teste avalia para NA
)b
for um parâmetro que deve ser positivo, você pode usar log_b
como um parâmetro (e transformá-lo via b <- exp(log_b)
em sua função objetivo). (@SamMason) Mas:
dfoptim
tem alguns, usei o nloptr
pacote (e seu otimizador BOBYQA ) extensivamente, também minqa
tem alguns. Essa é a solução que eu recomendaria.Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras