Live-Graph mit Matplotlib in Optimize-Funktion einbauen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ruhla
User
Beiträge: 2
Registriert: Donnerstag 3. Mai 2012, 15:53

Hallo zusammen,
nach etlichen Experimenten, mehr oder minder erfolglosem googlen und diversen Python Foren, die ich durchstöbert habe, gebe ich auf und wende mich hoffnungsvoll an euch.

Ich habe vor ein paar Monaten angefangen, Python zu programmieren, bis dato hat auch alles wunderbar funktioniert.
Kommen wir zu meinem Problem:

Ich habe eine komplexe Funktion, die mir eine Datenreihe errechnet und real gemessene Daten, die ich mit diesen vergleiche. Dies mache ich über eine lineare Regression und nehme R² als Indikator, wie nah meine errechneten Daten an den real gemessenen liegen.

Durch variieren meiner Parameter der Funktion, verändert sich natürlich mein R².

Nun habe ich erfolgreich diverse Optimierungsfunktionen von SciPy benutzt, die mir das Output der linearen Regression "1-R²" minimieren (Also R² maximieren => optimale Eingangsparameter).

Das aber alles nur um euch einen groben Rahmen zu nennen, was mein Programm macht. Jede "Rechnung" dauert zwischen 10 und 15 Sekunden und jedes Mal wird ein R² ausgespuckt.

Was ich nun gerne hätte, wäre ein Live-Graph, der mir nach jeder Rechnung den aktuellen R²-Wert in einen Graphen einträgt, sodass ich einen Verlauf der R²e erkennen kann. (Ich schreibe die Ergebnisse parallel in eine csv Datei und kann diesen Graphen quasi am Ende der Rechnung auch in Excel erstellen - mein Ziel ist aber das Live in einem plt Fenster via Matplotlib o.ä. zu sehen).

Ich habe folgenden Code gefunden, der "Live" eine Sinuskurve zeichnet: http://matplotlib.sourceforge.net/examp ... _blit.html

Wenn ich nun die dort vorkommende "while 1:" Schleife durch meine Optimierungsfunktion austausche, müsste ich eigentlich schon am Ziel sein.

Der Graph wird beim Aufruf zwar angezeigt, mein Programm rechnet auch - aber das Fenster, in dem der Graph sein sollte hat nach ein paar Sekunden "Keine Rückmeldung" im Titel stehen. Weiter rechnen tut er, nur das Graph-Fenster ist abgestürzt.

Hier ein Auszug meines Codes:

Code: Alles auswählen

def Optimierungsfunktion(x):
    global rechnungszaehler
    global R_quadrat

    
    # EINZEL_BERECHNUNG(x) = [[Infiltration][SollTag][SollNacht][NutzVon][NutzBis][IPL_Faktor][IGL_Faktor][IBL_Faktor][Datum_des_Jahres]]
    sim_Stunde1, sim_Tag1, sim_Monat1 = Functions.EINZEL_BERECHNUNG([x[7], x[6], x[5], x[4], x[3], x[2], x[1], x[0], Datum_des_Jahres])
    


    gemesseneWerte = Messung[384:551]
    simulierteWerte = sim_Stunde1[384:551]

    gradient, intercept, r_value, p_value, std_err = stats.linregress(gemesseneWerte,simulierteWerte)

    r_squared = r_value**2
    rechnungszaehler = rechnungszaehler + 1
    
    #Functions.Diagramm_zeichnen_KW([rechnungszaehler, gemesseneWerte, simulierteWerte])
    
    print "Rechnung Nummer:", rechnungszaehler  
    print "R Quadrat:", r_squared
    negativwert = 1 - r_squared
    R_quadrat.writerow([rechnungszaehler, x[7], x[6], x[5], x[4], x[3], x[2], x[1], x[0], r_squared])
    
    
    ####live graph 
    test(rechnungszaehler, r_squared)
    return negativwert

def test(neuxwert, neuywert):
    global background
    # time.sleep(1)
    # restore the clean slate background
    fig.canvas.restore_region(background)
    # update the data
    t = neuxwert
    y = neuywert
    xdata.append(t)
    ydata.append(y)
    xmin, xmax = ax.get_xlim()
    if t>=xmax:
        ax.set_xlim(xmin, 2*xmax)
        fig.canvas.draw()
        background = fig.canvas.copy_from_bbox(ax.bbox)

    line.set_data(xdata, ydata)

    # just draw the animated artist
    ax.draw_artist(line)
    print "zeichne!"
    # just redraw the axes rectangle
    fig.canvas.blit(ax.bbox)

    
def run(*args):
    global R_quadrat
    R_quadrat = csv.writer(open('R_Quadrat_Brute.csv', 'wb'), dialect='excel')
    R_quadrat.writerow(['Rechnungszaehler', 'Infiltration', 'SollTag', 'SollNacht', 'NutzVon', 'NutzBis', 'IPL_Faktor', 'IGL_Faktor', 'IBL_Faktor', 'R_Quadrat'])
    import scipy.optimize
    startinput = np.array([1, 1, 1, 19, 7, 18, 19, 0.7])
    listoffloats, anzahleval, dritteroutput = scipy.optimize.fmin_tnc(Optimierungsfunktion, startinput, approx_grad=1, bounds=[(0.6,1.4),(0.6,1.4),(0.6,1.4),(17,22),(5,9),(17,20),(18,23),(0.2,2)])



fig.canvas.draw()
    
manager = plt.get_current_fig_manager()
manager.window.after(100, run)

plt.show()

print "Fertig"


Vielen Dank für eure Anregungen im Voraus

Bernd
Ruhla
User
Beiträge: 2
Registriert: Donnerstag 3. Mai 2012, 15:53

Hallo, nach einem Update auf matplotlib-1.1.1rc.win32-py2.6 funktioniert es nun. Es ist ein sehr schönes Feature, wie ich finde.


Thread kann geschlossen werden - das mit dem Update hätte mir auch früher einfallen können. Entschuldigt bitte die Störung ;-)

Viele Grüße
Antworten