Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo optimizar en Python

Cómo optimizar en Python

Descripción general

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.