Korrekte Verwendung von fmin_l_bfgs_b für die parameteridentifikation
Ich habe einige experimentelle Daten (y, x, t_exp, m_exp), und wollen, um die "optimale" Modell-Parameter (A, B, C, D, E) für diese Daten mithilfe der eingeschränkte multivariate BFGS-Methode. Parameter E muss größer als 0 sein, die anderen sind zwanglos.
def func(x, A, B, C, D, E, *args):
return A * (x ** E) * numpy.cos(t_exp) * (1 - numpy.exp((-2 * B * x) / numpy.cos(t_exp))) + numpy.exp((-2 * B * x) / numpy.cos(t_exp)) * C + (D * m_exp)
initial_values = numpy.array([-10, 2, -20, 0.3, 0.25])
mybounds = [(None,None), (None,None), (None,None), (None,None), (0, None)]
x,f,d = scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(m_exp, t_exp), bounds=mybounds)
Ein paar Fragen:
- Sollte mein Modell die Formulierung
func
meine unabhängige variablex
oder sollten aus den experimentellen Datenx_exp
als Teil*args
? - Wenn ich den oben stehenden code ausführen, bekomme ich die Fehlermeldung
func() takes at least 6 arguments (3 given)
, was ich davon ausgehen sind x, und meine beiden *args... Wie soll ich es definierenfunc
?
EDIT: Dank @zephyr Antwort, ich verstehe jetzt, dass das Ziel ist die Minimierung der Summe der quadrierten Residuen, nicht die tatsächliche Funktion. Ich habe folgenden funktionierenden code:
def func(params, *args):
l_exp = args[0]
s_exp = args[1]
m_exp = args[2]
t_exp = args[3]
A, B, C, D, E = params
s_model = A * (l_exp ** E) * numpy.cos(t_exp) * (1 - numpy.exp((-2 * B * l_exp) / numpy.cos(t_exp))) + numpy.exp((-2 * B * l_exp) / numpy.cos(theta_exp)) * C + (D * m_exp)
residual = s_exp - s_model
return numpy.sum(residual ** 2)
initial_values = numpy.array([-10, 2, -20, 0.3, 0.25])
mybounds = [(None,None), (None,None), (None,None), (None,None), (0,None)]
x, f, d = scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(l_exp, s_exp, m_exp, t_exp), bounds=mybounds, approx_grad=True)
Ich bin nicht sicher, ob die Grenzen richtig arbeiten. Wenn ich angeben (0, None) für E, bekomme ich einen run-flag 2, abnormale Beendigung. Wenn ich es auf (1e-6, Keine), es läuft gut, aber wählt 1e-6 als E. Bin ich die Angabe der Grenzen, richtig?
InformationsquelleAutor Benjamin | 2011-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nicht wollen, um zu versuchen, um herauszufinden, was das Modell, das Sie mit vertreten, so dass hier ein einfaches Beispiel passend zu einer Linie:
Den ersten Optimierung ist Grenzenlos, und gibt die richtige Antwort, die zweite respektiert die Grenzen, die verhindert, dass es bei erreichen der korrekten Parameter.
Die wichtigste Sache, die Sie haben, falsch sind, ist für fast alle das optimieren von Funktionen, ein 'x' und 'x0' beziehen sich auf die Parameter, die Sie optimieren über - alles andere als ein argument übergeben wird. Es ist auch wichtig, dass Ihre fit-Funktion die richtigen Daten geben - hier wollen wir einen einzelnen Wert, manche Routinen erwarten einen error vector. Auch Sie müssen die approx_grad=True-flag, wenn Sie möchten, berechnen Sie den Gradienten analytisch und zur Verfügung stellen.
ein Problem, das ich sehe ist, dass in Ihrem Modell, A und E sind underdetermined. Da erscheinen Sie nur in dem Begriffl_exp*E Sie können variieren, gleichzeitig ohne Auswirkungen auf das Modell Wert ist, so wird es keine eindeutige Lösung.
Es scheint, dass die Verwendung von (0, None) behebt den parameter auf 0, während Sie sagen (0,10) können Werte innerhalb dieses Bereichs.
InformationsquelleAutor so12311