Tengo un algoritmo de visión por computadora que quiero sintonizar usando scipy.optimize.minimize. En este momento, solo quiero ajustar dos parámetros, pero la cantidad de parámetros eventualmente podría aumentar, por lo que me gustaría utilizar una técnica que pueda realizar búsquedas graduales de gran dimensión. La implementación de Nelder-Mead en SciPy parecía una buena opción.Tamaño de paso entero en scipy optimize minimize
Tengo todo el código configurado, pero parece que la función de minimizar realmente quiere usar valores de punto flotante con un tamaño de paso inferior a uno. El conjunto actual de parámetros son ambos enteros y uno tiene un tamaño de paso de uno y otro tiene un tamaño de paso de dos (es decir, el valor debe ser impar, si no es lo que estoy tratando de optimizar, lo convertirá en un número impar). Aproximadamente un parámetro es un tamaño de ventana en píxeles y el otro parámetro es un umbral (un valor de 0-255).
Por lo que vale, estoy usando una compilación nueva de scipy del repositorio git. ¿Alguien sabe cómo decirle a scipy que use un tamaño de paso específico para cada parámetro? ¿Hay alguna manera de que pueda rodar mi propia función de gradiente? ¿Hay alguna bandera falsa que me pueda ayudar? Soy consciente de que esto podría hacerse con un simple barrido de parámetros, pero finalmente me gustaría aplicar este código a conjuntos de parámetros mucho más grandes.
El código en sí es muy simple:
import numpy as np
from scipy.optimize import minimize
from ScannerUtil import straightenImg
import bson
def doSingleIteration(parameters):
# do some machine vision magic
# return the difference between my value and the truth value
parameters = np.array([11,10])
res = minimize(doSingleIteration, parameters, method='Nelder-Mead',options={'xtol': 1e-2, 'disp': True,'ftol':1.0,}) #not sure if these params do anything
print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
print res
Esto es lo que mi salida se parece. Como puede ver, estamos repitiendo muchas carreras y no estamos llegando a ninguna parte en la minimización.
*+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.] <-- Output from scipy minimize
{'block_size': 11, 'degree': 10} <-- input to my algorithm rounded and made int
+++++++++++++++++++++++++++++++++++++++++
120 <-- output of the function I am trying to minimize
+++++++++++++++++++++++++++++++++++++++++
[ 11.55 10. ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.5]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.55 9.5 ]
{'block_size': 11, 'degree': 9}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.1375 10.25 ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.275 10. ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.25]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.275 9.75 ]
{'block_size': 11, 'degree': 9}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
~~~
SNIP
~~~
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.0078125]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
Optimization terminated successfully.
Current function value: 120.000000
Iterations: 7
Function evaluations: 27
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
status: 0
nfev: 27
success: True
fun: 120.0
x: array([ 11., 10.])
message: 'Optimization terminated successfully.'
nit: 7*
Según los documentos, el método de Nelder-Mead de SciPy utiliza el algoritmo de programación lineal Simplex. Se basa en el uso de puntos/pasos no integrales para optimizar la función.No estoy familiarizado con SciPy en general, por lo que puede haber una opción de configuración para que haga lo que quiera. También es posible que desee buscar en la programación entera (http://en.wikipedia.org/wiki/Integer_programming) ya que eso suena como lo que está tratando de lograr. –
@EricG en realidad, creo que es solo una confusión de nombres, el "Simplex" de Nelder-Mead funciona con la estructura geométrica de un Simplex. No tiene nada que ver con el algoritmo Simplex de la programación lineal, y esta es una optimización no lineal de todos modos. – seberg
Debido a problemas como este, el ajuste de parámetros para los algoritmos ML generalmente se realiza solo con una grilla de búsqueda (a menudo en una grilla logarítmica, pero para sus parámetros que no parece necesario). Puede hacer una búsqueda gruesa de la cuadrícula para encontrar primero una buena región y luego una búsqueda de grilla más fina en dicha región. – Dougal