2015-08-31 11 views
5

Die Sache ist, ich versuche, passende Prozedur für meine Zwecke zu entwerfen und scipy Differential Evolutionsalgorithmus als ein allgemeiner Schätzer der Anfangswerte zu verwenden, die dann in LM-Algorithmus für eine bessere Anpassung verwendet werden. Die Funktion, die ich mit DE minimieren möchte, sind die kleinsten Quadrate zwischen analytisch definierter nichtlinearer Funktion und einigen experimentellen Werten. Punkt, an dem ich feststecke, ist das Funktionsdesign. Wie es in scipy Referenz angegeben: "Funktion muss in der Form sein f (x, * args) , wo x ist das Argument in Form eines 1-D-Array und args ist ein Tupel von zusätzlichen festen Parameter benötigt vollständig die Funktion "angebenScipy, differential evolution

es ist ein hässliches Beispiel für Code, die ich nur zu Veranschaulichungszwecken geschrieben:

def func(x, *args): 
    """args[0] = x 
     args[1] = y""" 
    result = 0 
    for i in range(len(args[0][0])): 
     result += (x[0]*(args[0][0][i]**2) + x[1]*(args[0][0][i]) + x[2] - args[0][1][i])**2 
    return result**0.5 

if __name__ == '__main__': 
    bounds = [(1.5, 0.5), (-0.3, 0.3), (0.1, -0.1)] 
    x = [0,1,2,3,4] 
    y = [i**2 for i in x] 
    args = (x, y) 
    result = differential_evolution(func, bounds, args=args) 
    print(func(bounds, args)) 

ich als Tupel in die Funktion Rohdaten liefern wollte, aber es scheint, dass sein nicht wie es sein soll, da der Dolmetscher nicht mit der Funktion zufrieden ist. Das Problem sollte einfach lösbar sein, aber ich bin wirklich frustriert, so dass Ratschläge sehr geschätzt werden.

+0

leider jeder für beunruhigend, aber ich schaffte diesen Code zu machen zu arbeiten (* facepalm *) ... –

+3

Das ist in Ordnung, @Tierpot, froh, dass Sie es heraus :) Willkommen zu den [ damit]! Da Sie das Problem gelöst haben, löschen Sie entweder Ihre Frage oder posten Sie Ihre Lösung als Antwort. Vielen Dank! – askewchan

+0

Posted Lösung ^)) –

Antwort

4

Dies ist eine einfache Lösung, die die Idee zeigt, auch Code ist nicht sehr pythonisch, aber der Einfachheit halber denke ich, dass es gut genug ist. Ok, als Beispiel wollen wir eine Gleichung der Art y = ax^2 + bx + c an eine aus der Gleichung y = x^2 erhaltenen Daten anpassen. Es ist offensichtlich, dass Parameter a = 1 und b, c gleich 0 sein sollten. Da der differentielle Evolutionsalgorithmus das Minimum einer Funktion findet, wollen wir ein Minimum einer quadratischen Abweichung (wiederum zur Vereinfachung) der analytischen Lösung der allgemeinen Gleichung finden (y = ax^2 + bx + c) mit gegebenen Parametern (die eine anfängliche Schätzung liefern) gegenüber "experimentellen" Daten. Also, um den Code:

from scipy.optimize import differential_evolution 

def func(parameters, *data): 

    #we have 3 parameters which will be passed as parameters and 
    #"experimental" x,y which will be passed as data 

    a,b,c = parameters 
    x,y = data 

    result = 0 

    for i in range(len(x)): 
     result += (a*x[i]**2 + b*x[i]+ c - y[i])**2 

    return result**0.5 

if __name__ == '__main__': 
    #initial guess for variation of parameters 
    #    a   b   c 
    bounds = [(1.5, 0.5), (-0.3, 0.3), (0.1, -0.1)] 

    #producing "experimental" data 
    x = [i for i in range(6)] 
    y = [x**2 for x in x] 

    #packing "experimental" data into args 
    args = (x,y) 

    result = differential_evolution(func, bounds, args=args) 
    print(result.x) 
+0

Kühl. Danke für das Posten. Ich habe genau danach gesucht. – Umberto