Mínimos quadrados não lineares de um lado com restrições lineares

8

Estou tentando resolver um problema de mínimos quadrados não lineares de um lado com restrições lineares, ou seja, o problema:

minxi=1mri(x) s.t Axb

Onde

ri(x)=fi(x)2 se fi(x)>0 e ri(x)=0 mais.

Em palavras, isso pode ser considerado um problema de mínimos quadrados, onde apenas os resíduos positivos ( f 's) são incluídos. Não posso enfatizar o suficiente para que este não seja um caso de ajuste de dados. Estou ciente do que aconteceria se usado na maioria dos casos de ajuste de dados, onde o resultado seria apenas uma função que está "acima" de todas as observações. O aplicativo é para resolver um problema de otimização muito específico que normalmente é resolvido na norma minmax ( minx||f(x)|| ). Em todos os casos práticos, a solução não atinge zero, ou seja, ||f(x)||0 devido ao comportamento das funções f .

As funções f são não lineares e temos acesso a suas derivadas, de modo que podemos calcular analiticamente o jacobiano sem muitos problemas adicionais.

Com algum sucesso, aplicamos um algoritmo de Levenberg-Marquardt em que a função objetivo é formulada como acima, ou seja, os f 's abaixo de 0 são removidos da soma e com as linhas correspondentes do J jacobiano Jdefinidas como zero (ou seja, J_ {i ,: } = 0Ji,:=0 se fi(x)<=0 Isso é bastante bruto, mas funciona bem, infelizmente não conseguimos incorporar as restrições lineares.

Estamos cientes de vários métodos que resolvem o problema NLLSQ apenas com restrições vinculadas, mas esses métodos obviamente não resolvem nosso problema. Encontramos apenas um NLLSQ com restrições lineares, chamado DQED, e o usamos com sucessos limitados (estamos descontentes com o número de avaliações de iterações / funções) modificando nossa função objetivo, como fizemos com Levenberg Marquardt.

O que estou procurando

Quaisquer sugestões de métodos que resolvam o problema de mínimos quadrados não lineares com restrições lineares. Além disso, sugestões sobre como modificar algoritmos para incorporar o fato de incluir apenas os resíduos positivos são bem-vindas. Finalmente, qualquer dica ou sugestão é bem-vinda, embora eu deva enfatizar novamente que a formulação do problema não está errada, embora eu perceba que não é a mais adequada para otimização devido à falta de diferenciabilidade de quando .ri(x)ri(x)=0

OscarB
fonte
Quando você escreve , você quer dizerou? Eu estou adivinhando o último? f(x)maxx|f(x)|maxi|fi(x)|
David Ketcheson
O último, sim. Obrigado por perguntar, desculpe não ter ficado claro.
OscarB 02/02/12

Respostas:

2

Muitas das minhas respostas a esta pergunta também se aplicam aqui; apenas ignore a parte PDE e finja que estou falando de um problema de otimização não-linear comum.

Em geral, como você tem funções contínuas, é possível usar métodos de pesquisa direta, embora a convergência desses métodos possa ser mais lenta que os métodos correspondentes que usam informações derivadas de ordem superior (que, nesse caso, você não possui). Você também pode tentar analisar solucionadores de otimização não suaves, como aqueles que usam métodos de pacote configurável. O principal nome no campo é Frank Clarke, que desenvolveu grande parte da teoria por trás da otimização não suave; Não sei muito sobre esse corpo de literatura.

Meu palpite é que, devido às não diferenciações do seu objetivo, o uso de métodos que pressupõem informações derivadas de primeira ou segunda ordem está causando problemas com a convergência.

Geoff Oxberry
fonte
Obrigado, tentarei uma otimização não suave. Ainda espero encontrar alguém que também tenha olhado para esse problema - ficaria surpreso se eu fosse o único que se aprofundou nisso. Então, estou deixando a questão em aberto um pouco.
OscarB
0

(Anos depois), como você sabe, os otimizadores de Levenberg-Marquardt pegam um vetor inteiro de funções e fazem a soma e o quadrado dentro. Assim, verá apenas , que é o que você deseja, certo?[fi]
levmar( max( [fi...], 0 )]
fi>0

Restrições lineares têm a mesma propriedade que o seu , que apenas os termos positivos importam. Assim, você pode simplesmente calcular o lote: (com multiplicado por 1000 ou 1000000.) É claro que os tem que olhar para os sinais de e , mas isso é fácil Também eu gostaria de acrescentar um termo. manter de vaguear fora para o infinito.lini(x)Aixbi0fi
levmar( max( [fi... lini...], 0 )]
liniJacobiansi(x)filinixx

(Tanto Scipy least_squares quanto ceres fazem restrições de caixa, mas não vejo nenhuma maneira de mapear regiões para caixas.)Axb

denis
fonte