SciPy - Otimizar
o scipy.optimize packagefornece vários algoritmos de otimização comumente usados. Este módulo contém os seguintes aspectos -
Minimização irrestrita e restrita de funções escalares multivariadas (minimize ()) usando uma variedade de algoritmos (por exemplo, BFGS, Nelder-Mead simplex, Newton Conjugate Gradient, COBYLA ou SLSQP)
Rotinas de otimização global (força bruta) (por exemplo, anneal (), basinhopping ())
Minimização de mínimos quadrados (leastsq ()) e algoritmos de ajuste de curva (curve_fit ())
Minimizadores de funções escalares univariadas (minimize_scalar ()) e localizadores de raiz (newton ())
Solucionadores de sistemas de equações multivariados (root ()) usando uma variedade de algoritmos (por exemplo, híbrido de Powell, Levenberg-Marquardt ou métodos de grande escala, como Newton-Krylov)
Minimização irrestrita e restrita de funções escalares multivariadas
o minimize() function fornece uma interface comum para algoritmos de minimização irrestrita e restrita para funções escalares multivariadas em scipy.optimize. Para demonstrar a função de minimização, considere o problema de minimizar a função de Rosenbrock das variáveis NN -
$$ f (x) = \ sum_ {i = 1} ^ {N-1} \: 100 (x_i - x_ {i-1} ^ {2}) $$
O valor mínimo desta função é 0, que é obtido quando xi = 1.
Algoritmo Nelder-Mead Simplex
No exemplo a seguir, a rotina minimize () é usada com o Nelder-Mead simplex algorithm (method = 'Nelder-Mead')(selecionado através do parâmetro do método). Vamos considerar o seguinte exemplo.
import numpy as np
from scipy.optimize import minimize
def rosen(x):
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead')
print(res.x)
O programa acima irá gerar a seguinte saída.
[7.93700741e+54 -5.41692163e+53 6.28769150e+53 1.38050484e+55 -4.14751333e+54]
O algoritmo simplex é provavelmente a maneira mais simples de minimizar uma função bem comportada. Requer apenas avaliações de função e é uma boa escolha para problemas simples de minimização. No entanto, como ele não usa avaliações de gradiente, pode demorar mais para encontrar o mínimo.
Outro algoritmo de otimização que precisa apenas de chamadas de função para encontrar o mínimo é o Powell‘s method, que está disponível definindo method = 'powell' na função minimize ().
Mínimos quadrados
Resolva um problema não linear de mínimos quadrados com limites nas variáveis. Dados os resíduos f (x) (uma função real m-dimensional de n variáveis reais) e a função de perda rho (s) (uma função escalar), least_squares encontra um mínimo local da função de custo F (x). Vamos considerar o seguinte exemplo.
Neste exemplo, encontramos um mínimo da função Rosenbrock sem limites nas variáveis independentes.
#Rosenbrock Function
def fun_rosenbrock(x):
return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
from scipy.optimize import least_squares
input = np.array([2, 2])
res = least_squares(fun_rosenbrock, input)
print res
Observe que fornecemos apenas o vetor dos resíduos. O algoritmo constrói a função de custo como uma soma dos quadrados dos resíduos, o que dá a função de Rosenbrock. O mínimo exato está em x = [1.0,1.0].
O programa acima irá gerar a seguinte saída.
active_mask: array([ 0., 0.])
cost: 9.8669242910846867e-30
fun: array([ 4.44089210e-15, 1.11022302e-16])
grad: array([ -8.89288649e-14, 4.44089210e-14])
jac: array([[-20.00000015,10.],[ -1.,0.]])
message: '`gtol` termination condition is satisfied.'
nfev: 3
njev: 3
optimality: 8.8928864934219529e-14
status: 1
success: True
x: array([ 1., 1.])
Descoberta de raiz
Vamos entender como encontrar raiz ajuda no SciPy.
Funções escalares
Se alguém tiver uma equação de variável única, existem quatro algoritmos de localização de raiz diferentes, que podem ser tentados. Cada um desses algoritmos requer os pontos finais de um intervalo no qual uma raiz é esperada (porque a função muda de sinal). Em geral,brentq é a melhor escolha, mas os outros métodos podem ser úteis em certas circunstâncias ou para fins acadêmicos.
Resolução de ponto fixo
Um problema intimamente relacionado a encontrar os zeros de uma função é o problema de encontrar um ponto fixo de uma função. Um ponto fixo de uma função é o ponto em que a avaliação da função retorna o ponto: g (x) = x. Claramente, o ponto fixo deggé a raiz de f (x) = g (x) −x. Equivalentemente, a raiz deffé o ponto_fixado de g (x) = f (x) + x. A rotina fixed_point fornece um método iterativo simples usando oAitkens sequence acceleration estimar o ponto fixo de gg, se um ponto de partida for fornecido.
Conjuntos de equações
Encontrar a raiz de um conjunto de equações não lineares pode ser alcançado usando o root() function. Vários métodos estão disponíveis, entre os quaishybr (o padrão) e lm, respectivamente, usam o hybrid method of Powell e a Levenberg-Marquardt method do MINPACK.
O exemplo a seguir considera a equação transcendental de variável única.
x2 + 2cos(x) = 0
Uma raiz pode ser encontrada da seguinte maneira -
import numpy as np
from scipy.optimize import root
def func(x):
return x*2 + 2 * np.cos(x)
sol = root(func, 0.3)
print sol
O programa acima irá gerar a seguinte saída.
fjac: array([[-1.]])
fun: array([ 2.22044605e-16])
message: 'The solution converged.'
nfev: 10
qtf: array([ -2.77644574e-12])
r: array([-3.34722409])
status: 1
success: True
x: array([-0.73908513])