Pregunta

Me enfrento a un problema en el 'leastsq' scipy rutina de optimización, si ejecuto el siguiente programa que dice

    raise errors[info][1], errors[info][0]
TypeError: Improper input parameters.

y, a veces index out of range for an array ...

from scipy import *
import numpy
from scipy import optimize
from numpy import asarray
from math import *

def func(apar):
  apar = numpy.asarray(apar)
  x = apar[0]
  y = apar[1]
  eqn = abs(x-y)
  return eqn

Init = numpy.asarray([20.0, 10.0])
x = optimize.leastsq(func, Init, full_output=0, col_deriv=0, factor=100, diag=None, warning=True)
print 'optimized parameters: ',x
print '******* The End ******'

No sé cuál es el problema con mi func optimize.leastsq () llamada, por favor, ayúdame

¿Fue útil?

Solución

leastsq trabaja con vectores de modo que la función residual, func, necesita volver un vector de longitud al menos dos. Así que si se reemplaza con return eqn return [eqn, 0.], tu ejemplo funcionará. Ejecutarlo da:

optimized parameters:  (array([10., 10.]), 2)

que es una de las muchas respuestas correctas para el mínimo de la diferencia absoluta.

Si desea reducir al mínimo una función escalar, fmin es el camino a seguir, optimize.fmin(func, Init).

El problema aquí es que estas dos funciones, a pesar de que tienen el mismo aspecto durante escalares están dirigidos a diferentes objetivos. leastsq encuentra el error de mínimos cuadrados, generalmente a partir de un conjunto de curvas idealizadas, y es sólo una manera de hacer un "mejor ajuste". Por otro lado fmin encuentra el valor mínimo de una función escalar.

Es evidente que el suyo es un ejemplo de juguete, para que ninguno de estos realmente tiene sentido, por lo que el camino que tomes dependerá de lo que su objetivo final es.

Otros consejos

Desde desea minimizar una función escalar sencilla (func() devuelve un solo valor, no una lista de valores), scipy.optimize.leastsq() debe ser sustituida por una llamada a una de las funciones fmin (con los argumentos adecuados):

x = optimize.fmin(func, Init)

funciona correctamente!

De hecho, leastsq() minimiza la suma de los cuadrados de una lista de valores. No parece que trabajar en un (lista que contiene a) solo valor, como en el ejemplo (a pesar de que podría, en teoría).

Con sólo mirar las menos docs cuadrados , podría ser que su func función se define de forma incorrecta. Estás asumiendo que siempre recibe un conjunto de al menos 2 de longitud, pero la función Optimize es increíblemente vago acerca de la longitud de la matriz que va a recibir. Usted puede tratar de escribir para detectar cualquier apar es, para ver lo que en realidad estás recibiendo.

Si estás usando algo así como ipython o el intérprete de Python, que debería estar recibiendo seguimientos de pila que le muestran exactamente qué línea se está produciendo el error, así que empezar por ahí. Si no puede averiguarlo a partir de ahí, la publicación de la traza de la pila probablemente ayudarnos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top