Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Quini sb en 5 Septiembre 2016, 05:27 am



Título: Duda python método optimización levenberg marquardt
Publicado por: Quini sb en 5 Septiembre 2016, 05:27 am



Buenas noches.

Tengo una duda en como usar el metodo de optimizacion levenberg marquardt en python

En la libreria scipy vienen varios de estos metodos --> http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html

He probado dos metodos(nelder-mead y basinhopping) y funcionan correctamente con la siguiente sentencia:

Nelder mead ---> res0_10 = optimize.minimize(f0_10, x0, method='Nelder-Mead', options={'disp': True, 'maxiter': 2000})


Basinhopping ---> res0_10 = optimize.basinhopping(f0_10, x0, niter=100, disp=True)


El problema surge cuando uso el Levenberg-Marquardt(copio solo la parte del error, el programa es largo por eso no copio el resto):

def f0_10(x):
m, u, z, s = x
for i in range(alt_max):
if i==alt_min: suma=0
if i > alt_min:
suma = suma + (B(x, i)-b0_10(x, i))**2
return np.sqrt(suma/alt_max)

x0 = np.array([40., 0., 500., 50.])

res0_10 = root(f0_10, x0, jac=True, method='lm')


El programa compila bien, pero ahora de ejecutar, me surge el siguiente error:


Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Quini SB\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.7.4.3348.win-x86_64\lib\lib-tk\Tkinter.py", line 1536, in __call__
return self.func(*args)
File "C:\Users\Quini SB\Desktop\tfg\Steyn - levmar.py", line 384, in askopenfilename
res0_10 = root(f0_10, x0, jac=True, method='lm')
File "C:\Users\Quini SB\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\optimize\_root.py", line 188, in root
sol = _root_leastsq(fun, x0, args=args, jac=jac, **options)
File "C:\Users\Quini SB\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\optimize\_root.py", line 251, in _root_leastsq
factor=factor, diag=diag)
File "C:\Users\Quini SB\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\optimize\minpack.py", line 377, in leastsq
shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
File "C:\Users\Quini SB\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\optimize\minpack.py", line 26, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "C:\Users\Quini SB\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\optimize\optimize.py", line 64, in __call__
self.jac = fg[1]
IndexError: invalid index to scalar variable.







No tengo muy claro a que se debe, soy estudiante y lo necesito para el TFG, pero mi profesor no controla python, asi que probablemente sera una tonteria, pero no soy capaz de solucionarlo

Ante todo, muchas gracias y un saludo

Pd: no veo Subforos de python, si este lenguaje no se trata en este foro disculparme





Título: Re: Duda python método optimización levenberg marquardt
Publicado por: tincopasan en 5 Septiembre 2016, 07:13 am
hay un foro de python en scripting.
Con respecto a tu problema no se nada del módulo que usas y que hace,  pero te diré algunos comentarios:
1- cuando usas
Código
  1. def f0_10(x):
  2.  
¿está dentro de una clase para el uso de tkinter?
2-
Código
  1. x0 = np.array([40., 0., 500., 50.])
si eso es una línea de código me parece muy raro el uso de "." después de cada número
3-
Código
  1. res0_10 = root(f0_10, x0, jac=True, method='lm')
  2.  

root es una función que desconozco, pero da toda la sensación de estar mal declarada en sus parametros.
igual si querés mandame una copia del script completo y sería más fácil revisarlo(además aprendo algo nuevo)


Título: Re: Duda python método optimización levenberg marquardt
Publicado por: Quini sb en 5 Septiembre 2016, 11:44 am
Agradeceria si algun moderador lo mueve a su correspondiente lugar

1 Si

2 Si es linea de codigo, lo hago asi para forzar que sean numeros reales(constumbre de programacion, no se si en este lenguaje son directamente reales, vengo de otro en que por defecto son enteros)

3 El error viene de ahi, cambiando el metodo de optimizacion(solo esa sentencia) funciona correctamente

Te lo envio por mensaje, gracias y un saludo


EDITO: te lo he mandado al correo, pues el mensaje excedia los 100.000 caracteres
No te asustes, es culpa del fichero de prueba para ejecutar el programa jajaja