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:

  1. Sollte mein Modell die Formulierung func meine unabhängige variable x oder sollten aus den experimentellen Daten x_exp als Teil *args?
  2. 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 definieren func?

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

Schreibe einen Kommentar