Question

Je fais face à un problème dans scipy « leastsq » routine d'optimisation, si j'exécute le programme suivant il est dit

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

et parfois 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 ******'

Je ne sais pas quel est le problème avec mon appel func optimize.leastsq (), s'il vous plaît aidez-moi

Était-ce utile?

La solution

leastsq fonctionne avec des vecteurs de sorte que la fonction résiduelle, func, a besoin de retourner un vecteur de longueur d'au moins deux. Donc, si vous remplacez return eqn avec return [eqn, 0.], votre exemple fonctionnera. Son exécution donne:

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

qui est l'une des nombreuses bonnes réponses pour le minimum de la différence absolue.

Si vous voulez minimiser une fonction scalaire, fmin est le chemin à parcourir, optimize.fmin(func, Init).

La question ici est que ces deux fonctions, mais ils regardent la même chose pour un scalaires sont destinés à des objectifs différents. leastsq trouve la moindre erreur quadratique, généralement à partir d'un ensemble de courbes idéalisées, et est juste une façon de faire un « meilleur ajustement ». D'autre part fmin trouve la valeur minimale d'une fonction scalaire.

Il est évident que le vôtre est un exemple de jouet, pour lequel aucune de ces vraiment un sens, donc de quelle façon vous allez dépendra de ce que votre objectif final est.

Autres conseils

Puisque vous voulez minimiser une fonction simple scalaire (func() retourne une valeur unique, pas une liste de valeurs), scipy.optimize.leastsq() doit être remplacé par un appel à l'une des fonctions de fmin (avec les arguments appropriés):

x = optimize.fmin(func, Init)

fonctionne correctement!

En fait, leastsq() minimise la somme des carrés d'une liste de valeurs. Il ne semble pas travailler sur une (liste contenant a) valeur unique, comme dans votre exemple (même si elle pourrait, en théorie).

Il suffit de regarder les moindres carrés docs , il se pourrait que votre func de fonction est définie de manière incorrecte. Vous supposez que vous recevez toujours un tableau d'au moins une longueur de 2, mais la fonction est incroyablement vague optimize de la longueur du tableau que vous recevrez. Vous pourriez essayer d'écrire à l'écran tout apar est, pour voir ce que vous êtes en train de faire.

Si vous utilisez quelque chose comme ipython ou le shell python, vous devez être obtenir des traces de pile qui vous montrent exactement quelle ligne l'erreur se produit, donc commencer par là. Si vous ne pouvez pas le comprendre à partir de là, l'affichage de la trace de la pile nous aiderait probablement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top