A otimização envolve encontrar as entradas para uma função objetiva que resultam na saída mínima ou máxima da função.
A biblioteca Python de código aberto para computação científica chamada SciPy fornece um conjunto de algoritmos de otimização. Muitos dos algoritmos são usados como um bloco de construção em outros algoritmos, mais notavelmente algoritmos de aprendizado de máquina na biblioteca scikit-learn.
Esses algoritmos de otimização pode ser usado diretamente de maneira independente para otimizar uma função. Mais notavelmente, algoritmos para pesquisa local e algoritmos para pesquisa global, os dois principais tipos de otimização que você pode encontrar em um projeto de aprendizado de máquina.
Neste tutorial, você descobrirá algoritmos de otimização fornecidos pela biblioteca SciPy.
Depois de concluir este tutorial, você saberá:
- A biblioteca SciPy fornece um conjunto de algoritmos de otimização diferentes para finalidades diferentes.
- Os algoritmos de otimização de busca local disponíveis no SciPy.
- Os algoritmos de otimização de pesquisa global disponíveis no SciPy.
Vamos começar.

Otimização de funções com SciPy
Foto de Manoel Lemos, alguns direitos reservados.
Visão geral do tutorial
Este tutorial é dividido em três partes; eles estão:
- Otimização com SciPy
- Pesquisa local com SciPy
- Pesquisa Global com SciPy
Otimização com SciPy
A biblioteca de código aberto Python SciPy para computação científica fornece um conjunto de técnicas de otimização.
Muitos dos algoritmos são usados como blocos de construção para outros algoritmos na biblioteca SciPy, bem como bibliotecas de aprendizado de máquina, como o scikit-learn.
Antes de revisarmos as técnicas específicas, vamos examinar os tipos de algoritmos fornecidos pela biblioteca.
Eles estão:
- Otimização Escalar: Otimização de uma função única variável convexa.
- Pesquisa Local: Otimização de uma função de variável múltipla unimodal.
- Pesquisa Global: Otimização de uma função de múltiplas variáveis multimodais.
- Mínimos quadrados: Resolver problemas de mínimos quadrados lineares e não lineares.
- Ajuste de curva: Ajusta uma curva a uma amostra de dados.
- Root Finding: Encontre a raiz (entrada que dá uma saída de zero) de uma função.
- Programação linear: Otimização linear sujeita a restrições.
Todos os algoritmos assumem que a função objetivo que está sendo otimizada é uma função de minimização. Se sua função estiver maximizando, ela pode ser convertida em minimização adicionando um sinal negativo aos valores retornados de sua função objetivo.
Além da lista acima, a biblioteca também fornece funções utilitárias usadas por alguns dos algoritmos, bem como o problema de teste de Rosenbrock.
Para uma boa visão geral dos recursos da biblioteca SciPy para otimização, consulte:
Agora que temos uma ideia de alto nível dos tipos de técnicas de otimização suportadas pela biblioteca, vamos examinar mais de perto dois grupos de algoritmos que provavelmente usaremos no aprendizado de máquina aplicado. Eles são a pesquisa local e a pesquisa global.
Pesquisa local com SciPy
Pesquisa local, ou otimização de função local, refere-se a algoritmos que buscam a entrada para uma função que resulta na saída mínima ou máxima, onde a função ou região restrita sendo pesquisada é considerada como tendo um único ótimo, por exemplo, unimodal.
A função que está sendo otimizada pode ou não ser convexa e pode ter uma ou mais variáveis de entrada.
Uma otimização de busca local pode ser aplicada diretamente para otimizar uma função se a função for considerada ou conhecida como unimodal; caso contrário, o algoritmo de pesquisa local pode ser aplicado para ajustar o resultado de um algoritmo de pesquisa global.
A biblioteca SciPy fornece pesquisa local por meio da função minimize ().
O minimizar() function toma como entrada o nome da função objetivo que está sendo minimizada e o ponto inicial a partir do qual iniciar a pesquisa e retorna um OptimizeResult que resume o sucesso ou fracasso da pesquisa e os detalhes da solução se encontrada.
... # minimizar uma função objetivo resultado = minimizar(objetivo, ponto) |
Informações adicionais sobre a função objetivo podem ser fornecidas se conhecidas, como os limites nas variáveis de entrada, uma função para calcular a primeira derivada da função (gradiente ou matriz Jacobiana), uma função para calcular a segunda derivada da função (Hessiana matriz) e quaisquer restrições nas entradas.
É importante ressaltar que a função fornece o “método”Argumento que permite especificar a otimização específica usada na pesquisa local.
Um conjunto de algoritmos de pesquisa local populares está disponível, como:
O exemplo abaixo demonstra como resolver uma função convexa bidimensional usando o algoritmo de busca local L-BFGS-B.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# l-bfgs-b otimização local do algoritmo de uma função convexa a partir de scipy.otimizar importar minimizar a partir de entorpecido.acaso importar rand
# função objetiva def objetivo(x): Retorna x[0]**2.0 + x[1]**2.0
# define intervalo para entrada r_min, r_max = -5.0, 5.0 # define o ponto de partida como uma amostra aleatória do domínio pt = r_min + rand(2) * (r_max - r_min) # realizar a pesquisa do algoritmo l-bfgs-b resultado = minimizar(objetivo, pt, método='L-BFGS-B') # resuma o resultado imprimir('Status:% s' % resultado['message']) imprimir('Avaliações totais:% d' % resultado['nfev']) # avaliar solução solução = resultado['x'] avaliação = objetivo(solução) imprimir('Solução: f (% s) =% .5f' % (solução, avaliação)) |
A execução do exemplo realiza a otimização e relata o sucesso ou falha da pesquisa, o número de avaliações de função realizadas e a entrada que resultou no ótimo da função.
Status: b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT _ <= _ PGTOL ' Avaliações totais: 9 Solução: f ([3.38059583e-07 3.70089258e-07]) = 0,00000 |
Agora que estamos familiarizados com o uso de um algoritmo de pesquisa local com SciPy, vamos dar uma olhada na pesquisa global.
Pesquisa Global com SciPy
A busca global ou otimização de função global se refere a algoritmos que buscam a entrada para uma função que resulta na saída mínima ou máxima, onde a função ou região restrita sendo pesquisada é considerada como tendo múltiplos ótimos locais, por exemplo, multimodal.
A função que está sendo otimizada é normalmente não linear, não convexa e pode ter uma ou mais de uma variável de entrada.
Os algoritmos de pesquisa global são normalmente estocásticos, o que significa que eles fazem uso da aleatoriedade no processo de pesquisa e podem ou não gerenciar uma população de soluções candidatas como parte da pesquisa.
A biblioteca SciPy fornece vários algoritmos de otimização global estocástica, cada um por meio de funções diferentes. Eles estão:
A biblioteca também fornece a função shgo () para otimização de sequência e brute () para otimização de pesquisa de grade.
Cada algoritmo retorna um objeto OptimizeResult que resume o sucesso ou falha da pesquisa e os detalhes da solução, se encontrada.
O exemplo abaixo demonstra como resolver uma função multimodal bidimensional usando recozimento simulado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# otimização global de recozimento simulado para uma função objetivo multimodal a partir de scipy.otimizar importar dual_anelamento
# função objetiva def objetivo(v): x, y = v Retorna (x **2 + y - 11)**2 + (x + y **2 -7)**2
# define intervalo para entrada r_min, r_max = -5.0, 5.0 # define os limites da pesquisa limites = [[r_min, r_max], [r_min, r_max]] # realizar a pesquisa simulada de recozimento resultado = dual_annealing(objetivo, limites) # resuma o resultado imprimir('Status:% s' % resultado['message']) imprimir('Avaliações totais:% d' % resultado['nfev']) # avaliar solução solução = resultado['x'] avaliação = objetivo(solução) imprimir('Solução: f (% s) =% .5f' % (solução, avaliação)) |
Executar o exemplo executa a otimização e relata o sucesso ou falha da pesquisa, o número de avaliações de função realizadas e a entrada que resultou no ótimo da função.
Status : ['Maximum number of iteration reached'] Avaliações totais: 4028 Solução: f ([-3.77931027 -3.283186 ]) = 0,00000 |
Leitura Adicional
Esta seção fornece mais recursos sobre o tópico se você deseja se aprofundar.
APIs
Artigos
Resumo
Neste tutorial, você descobriu algoritmos de otimização fornecidos pela biblioteca SciPy.
Especificamente, você aprendeu:
- A biblioteca SciPy fornece um conjunto de algoritmos de otimização diferentes para finalidades diferentes.
- Os algoritmos de otimização de busca local disponíveis no SciPy.
- Os algoritmos de otimização de pesquisa global disponíveis no SciPy.
Você tem alguma pergunta?
Tire suas dúvidas nos comentários abaixo e farei o possível para responder.