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