Cómo optimizar en Python
El subpaquete de optimización de Scipy proporciona implementaciones de algoritmos de optimización comúnmente utilizados. Podemos llamar directamente a estas funciones para completar nuestro problema de optimización. La característica más típica de las funciones optimizadas es que el algoritmo utilizado se puede ver en el nombre de la función. La siguiente es una descripción general de las funciones del paquete de optimización:
1. Optimización no lineal
fmin: algoritmo simple de Nelder-Mead
fmin_powell: mejorado. Método de Powell
fmin_bfgs - método de Newton similar
fmin_cg - método de gradiente conjugado no lineal****
fmin_ncg - Newton de búsqueda lineal *** *- Método de gradiente conjugado
leastsq - método de mínimos cuadrados
2. Problema de función multivariada restringida
fmin_l_bfgs_b - usando el algoritmo L-BFGS-B
p>
fmin_tnc ---- Información de gradiente
fmin_cobyla ---- Aproximación lineal
fmin_slsqp ---- Método de mínimos cuadrados secuenciales
nnls ---- resolver || Ax - b ||_2 para xgt; =0
3 Optimización global
Recocido---- el algoritmo de recocido simulado
bruto - método de fuerza bruta
4. Función escalar
fminbound
brent
dorado
p >bbracket
5. Ajuste
curve_fit: ajuste mediante el método de mínimos cuadrados no lineal
6. Función escalar con raíz
ajuste_curva. Hallazgo de raíces de funciones escalares
brentq --Brent clásico (1973)
brenth --variante del clásico Brent (1980) ridder --Ridder es el nombre de la persona que propuso esto algoritmo
bisección --método de bisección
newton --método de Newton
punto_fijo
7. Encontrar raíces para funciones multidimensionales
fsolve --- Generalizado
broyden1 --- Primera aproximación de Jacob de Broyden.
broyden2 --- Segunda aproximación de Jacob de Broyden newton_krylov --- Aproximación de Krylov de Anti-Jacob anderson --- Mezcla de Anderson extendida
mezcla emocionante --- Mezcla lineal de aproximación de Jacobs diagonal ajustada --- Aproximación escalar de Jacobs diagbroyden --- Aproximación diagonal de Broyden Jacobs 8. Función de utilidad
line_search --Buscar valor alfa que satisfaga a Wolfe fuerte
check_grad -- Verifique la corrección de la función de gradiente mediante comparación con la aproximación de diferencias finitas directas II. Optimización práctica no lineal
Forma completa de llamar a fmin Sí:
fmin(func, x0, args=(), xtol=0.0001, ftol=. 0.0001, maxiter=Ninguno, maxfun=Ninguno, full_output=0, disp=1, retall=0, callback=Ninguno), pero comúnmente usamos los dos primeros parámetros.
Describe las funciones y valores iniciales del problema de optimización. Los dos últimos parámetros son fáciles de entender. Si tiene acceso a ellos, haga su propia investigación. A continuación se muestra un estudio del problema más sencillo para ver cómo se utiliza esta función: f(x)=x**2-4*x 8, sabemos que su valor mínimo es 4, tomado de x=2.
de scipy.optimize import fmin #Introducir el paquete de optimización def myfunc(x):
return x**2-4*x 8 #Definir función
x0 = [1.3] #Adivina un valor inicial
xopt = fmin(myfunc, x0) #Resolver
imprimir xopt #Imprimir el resultado
Después de ejecutar , dar El resultado es:
La optimización finalizó con éxito.
Valor de función actual: 4.000000
Iteraciones: 16
Evaluación de función: 32
[ 2.00001953]
El programa calcula con precisión el valor mínimo, aunque el punto del valor mínimo no es estrictamente 2. Esto debería deberse a un error de codificación de la máquina binaria.
Excepto que fmin_ncg debe proporcionar información de gradiente, los métodos de llamada de varias otras funciones son básicamente los mismos y completamente similares. Comparemos:
de scipy.optimize import fmin, fmin_powell, fmin_bfgs, fmin_cgdef myfunc(x):
return x**2-4*x 8
x0 = [1.3]
xopt1 = fmin(mifunc, x0)
imprimir xopt1
imprimir
xopt2 = fmin_powell(mifunc , x0)
imprimir xopt2
imprimir
imprimir
xopt3 = fmin_bfgs(myfunc, x0)
imprimir xopt3
imprimir
xopt4 = fmin_cg(myfunc, x0)
imprimir xopt4
El resultado dado es:
La optimización finalizó exitosamente.
Valor de función actual: 4.000000
Iteraciones: 16
Evaluación de función: 32
[ 2.00001953]
La optimización finalizó exitosamente.
Valor de función actual: 4.000000
Iteraciones: 2
Evaluación de función: 53
1.99999999997
Optimización exitosa terminación.
Valor de función actual: 4.000000
Iteraciones: 2
Evaluación de función: 12
Evaluación de gradiente: 4
[ 2.00000001]
La optimización finalizó exitosamente.
Valor de función actual: 4.000000
Iteraciones: 2
Evaluación de función: 15
Evaluación de gradiente: 5
[ 2.]
Según la información proporcionada, podemos juzgar intuitivamente la ejecución del algoritmo. Lea y estudie las matemáticas de cada algoritmo por su cuenta. Personalmente, creo que no es necesario descubrir la derivación y los teoremas si no estás haciendo matemáticas puras. Sin embargo, es importante comprender los pros y los contras de cada algoritmo y sus capacidades.
Al usarlo, también puede utilizar varios algoritmos para ver qué tan efectivo es cada algoritmo. Al mismo tiempo, también puede verificar el fallo de los algoritmos entre sí.
Después de importar fmin desde scipy.optimize, puede usar ayuda (fmin) para ver la información de ayuda de fmin. No hay ejemplos en la ayuda, pero se proporciona una descripción del significado de cada parámetro, que es la referencia más valiosa al llamar a funciones.
Si tienes la afición de estudiar el código fuente o si necesitas mejorar un algoritmo implementado, es posible que desees consultar el código fuente de cada algoritmo en optimización. Está justo aquí: /scipy/scipy/blob/master/scipy/optimize/optimize.py. Si eres inteligente, debes haber notado que siguiendo este enlace paso a paso, encontrarás casi todo el código fuente de scipy.