Frage

ich vor einem Problem in scipy ‚leastsq‘ Optimierungsroutine, wenn ich das folgende Programm ausführen sagt es

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

und manchmal 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 ******'

Ich weiß nicht, was das Problem mit meiner func optimize.leastsq ist () -Aufruf, bitte helfen Sie mir

War es hilfreich?

Lösung

leastsq arbeitet mit Vektoren, so dass die Restfunktion, func, braucht einen Vektor der Länge mindestens zwei zurückzukehren. Also, wenn Sie return eqn mit return [eqn, 0.] ersetzen, wird Ihr Beispiel arbeiten. Laufen sie gibt:

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

, welche eine der vielen richtigen Antworten für das Minimum der absoluten Differenz ist.

Wenn Sie eine skalare Funktion minimieren wollen, fmin ist der Weg zu gehen, optimize.fmin(func, Init).

hier Das Problem ist, dass diese beiden Funktionen, obwohl sie das gleiche für einen Skalar aussehen werden auf unterschiedliche Zielen ausgerichtet. leastsq findet die kleinsten quadratischen Fehler, in der Regel aus einer Reihe von idealisierten Kurven und ist nur ein Weg, um einen „best fit“ zu tun. Auf der anderen Seite fmin findet den Minimalwert einer Skalarfunktion.

Offensichtlich ist dein Spielzeug Beispiel, für die wirklich Sinn beides nicht macht, so die Art und Weise Sie sich verlassen gehen, was Ihr Endziel ist.

Andere Tipps

Da Sie eine einfache skalare Funktion minimieren wollen (func() einen einzelnen Wert zurückgibt, nicht eine Liste von Werten), scipy.optimize.leastsq() durch einen Aufruf an eine der fmin Funktionen ersetzt werden sollte (mit den entsprechenden Argumenten):

x = optimize.fmin(func, Init)

richtig funktioniert!

In der Tat minimiert leastsq() die Summe der Quadrate einer Liste von Werten. Es scheint nicht auf einer (Liste enthält) zu arbeiten einzelnen Wert, wie in Ihrem Beispiel (obwohl es könnte in der Theorie).

Einfach mal an den kleinsten Quadrate docs , könnte es sein, dass Ihre Funktion func falsch definiert wird. Sie gehen davon aus, dass Sie immer eine Reihe von mindestens Länge 2, erhalten aber die optimize Funktion ist irrsinnig vage über die Länge des Arrays erhalten Sie. Sie könnten versuchen, was apar schreiben zu screenen ist, um zu sehen, was Sie tatsächlich bekommen.

Wenn Sie so etwas wie ipython oder die Python-Shell verwenden, sollten Sie Stack-Traces zu bekommen, die Ihnen genau zeigen, was die Fehlerzeile auftritt auf, so dass es starten. Wenn Sie es nicht verstehen kann von dort aus, würde die Stack-Trace Posting uns wahrscheinlich helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top