Ich habe eine kleine Messreihe, 2 Werte die von der Zeit abhängig sind.
1
07.08.21-19:00 -60380 -63703
2
07.08.21-19:20 835972 3800921
3
07.08.21-20:00 673433 3715989
4
07.08.21-20:20 518252 3599637
5
07.08.21-22:00 33228 3308804
6
07.08.21-23:00 719595 4111845
7
08.08.21-10:40 132950 4886900
8
08.08.21-11:00 49300 4842150
9
08.08.21-11:40 -198150 4672900
10
08.08.21-16:20 -713574 4702969
11
08.08.21-17:40 -116946 5458207
12
08.08.21-21:00 -157100 5819400
13
08.08.21-22:40 -703010 5473281
14
08.08.21-23:20 -939400 5316600
15
09.08.21-10:00 -1203712 6326313
16
09.08.21-17:20 -1640250 6782940
17
09.08.21-23:00 -1416150 7704500
18
10.08.21-10:00 -1683400 8790200
Die möchte ich mit gnuplot in eine Grafik umwandeln, Darstellung der
Punkte in der 2. und 3. Spalte sowie je eine Regressionsgerade (lineare
Regression).
1
#!/usr/bin/gnuplot
2
3
filnam='timer.log'
4
5
set yrange [-2000000:12000000]
6
7
set xdata time
8
set timefmt '%d.%m.%y-%H:%M'
9
set format x '%d.%m.%y-%H:%M'
10
set xtics 21600 rotate by 60 right
11
12
set grid
13
set terminal svg
14
set output 'timer.svg'
15
16
f(x)= a + b*x
17
fit f(x) filnam using 1:2 via a,b
18
19
g(x)= m + n*x
20
fit g(x) filnam using 1:3 via m,n
21
22
plot filnam using 1:2 title '001' lt 5 lc 2, f(x), \
23
filnam using 1:3 title '002' lt 7 lc 7, g(x)
Leider entspicht das Ergebnis timer.svg nur teilweise meinen
Erwartungen, die Punkte sind ok aber die Rergressionsgeraden dürften
nicht stimmen.
Was mache ist falsch?
Läuft das original Gnuplot Demo-File fit.dem bei dir?
https://github.com/gnuplot/gnuplot/tree/master/demo
Neben fit.dem brauchst du noch ein paar der .dat-Files. Am besten
einfach alles runter laden oder die Version aus deiner lokalen
gnuplot-Installation nehmen.
Hannes J. schrieb:> Läuft das original Gnuplot Demo-File fit.dem bei dir?
läuft problemlos, die Regressionsgeraden entprechen auch dem, was ich
erwarte
ich glaube nicht, dass gnuplot Datumsachsen fitten kann. Evtl gibts ne
Funktion, die aus dem Datum einen Sekundenzeitstempel macht, die man
statt "x" in die Funktionsdefinition einsetzen kann.
Andreas M. schrieb:> ich glaube nicht, dass gnuplot Datumsachsen fitten kann.
Schon gar nicht so ein verf..tes Datum/Zeit-Format, wo man erstmal
rätseln darf, was das Minuszeichen vor der Uhrzeit zu bedeuten hat ...
;-)
Andreas M. schrieb:> ich glaube nicht, dass gnuplot Datumsachsen fitten kann. Evtl gibts ne> Funktion, die aus dem Datum einen Sekundenzeitstempel macht, die man> statt "x" in die Funktionsdefinition einsetzen kann.
Zumindest versteht GnuPlot das Datum/Zeit-Format richtig. Sonst würden
die
Abstände der Punkte auf der x-Achse nicht stimmen.
gnuplot rechnet auf der Zeitachse mit Sekunden seit 1.1.70
Das verf..te Datumsformat hat einen handfesten Grund: nehme ich das
Leerzeichen statt des - (2021.08.07 19:20 statt 2021.08.07-19:20), dann
kommt eine falsche Grafik raus, siehe Bild, ich weiss nicht, was gnuplot
da macht.
mathe-ist-lang-her schrieb:> gnuplot rechnet auf der Zeitachse mit Sekunden seit 1.1.70>> Das verf..te Datumsformat hat einen handfesten Grund: nehme ich das> Leerzeichen statt des - (2021.08.07 19:20 statt 2021.08.07-19:20), dann> kommt eine falsche Grafik raus, siehe Bild, ich weiss nicht, was gnuplot> da macht.
Das Leerzeichen dürfte hier das Trennzeichen sein.
Damit dürften deine zwei Werte in der 3. und 4. Spalte liegen.
Und wenn den Bindestrich verwendest, dann könnte ich mir vorstellen.
das Gnuplot es folgendermaßen interpretiert, aber das ist nur eine
Vermutung von mir. Die Doku dürfte genaueren Aufschluss darüber geben,
wie Zeit und Datumsangaben auszusehen haben:
Aus
07.08.21-19:00
wird
07.08.21 MINUS 19:00
mathe-ist-lang-her schrieb:> Das verf..te Datumsformat hat einen handfesten Grund: nehme ich das> Leerzeichen statt des - (2021.08.07 19:20 statt 2021.08.07-19:20), dann> kommt eine falsche Grafik raus, siehe Bild, ich weiss nicht, was gnuplot> da macht.
Dieses Format (2021.08.07) ist doch nun der größte Kokolores - nichts
Halbes und nichts Ganzes.
Vielleicht versteht Gnuplot ein Datumsformat nach ISO 8601?
Um Problemen mit dem Trennzeichen aus dem Weg zu gehen, z.B. in der
Variante
2021-08-07T19:20
https://de.wikipedia.org/wiki/ISO_8601
Das Datumsformat wird von mir vorgegeben, es ist ein String in '', da
wird nichts subtrahiert. Schaut Euch nochmal den Sourcecode an.
Ausserdem sind die Messwerte als Punkte an den richtigen Stellen in der
Grafik, wo es klemmt ist die Gerade.
mathe-ist-lang-her schrieb:> Was ich noch herausgefunden haben: a und b müssen mit Werten vorbesetzt> werden, die nicht um Grössenordnungen daneben liegen.
Hmm, sollte bei einem linearen Fit eigentlich keine Rolle spielen.
Eventuell bricht er zu früh ab?
Zu Studiumszeiten habe ich viel mit Gnuplot gearbeitet. Gerade die
Möglichkeit die Diagramme im Tex-Format zu Erzeugen und dann die zu den
Formelbereichen des Dokuments passende Tex-Schriftart zu verwenden macht
was her. Inzwischen benutze ich aber fast nur noch pyplot. Die Diagramme
sind auch schön anzusehen und man hat die gesamte Mächtigkeit von numpy
bzw. Python ansich in der Hinterhand.
Wolfgang schrieb:> mathe-ist-lang-her schrieb:>> Was ich noch herausgefunden haben: a und b müssen mit Werten vorbesetzt>> werden, die nicht um Grössenordnungen daneben liegen.>> Kein Wunder, wenn du da eine iterativ arbeitende Parametersuche drauf> los lässt. Warum rechnest du die Ausgleichsgrade nicht direkt aus?
Solange man keine Werte wählt, die zu "numerischem Fehlerverhalten"
(Overflows, Underflows, NaNs, ...) führen sollte der benutzte "nonlinear
least-squares Marquardt-Levenberg algorithm" für diese lineare Funktione
mit jedem Startwert zum richtigen Ergebnis kommen.
mh schrieb:> "nonlinear least-squares Marquardt-Levenberg algorithm"
Nochmal: Warum einen iterativen Suchalgorithmus, wenn man Steigung und
Achsenabschnitt der Ausgleichsgraden direkt ausrechnen kann=?
Wolfgang schrieb:> mh schrieb:>> "nonlinear least-squares Marquardt-Levenberg algorithm">> Nochmal: Warum einen iterativen Suchalgorithmus, wenn man Steigung und> Achsenabschnitt der Ausgleichsgraden direkt ausrechnen kann=?
Dann habe ich eine Gegenfrage: Warum sollte man keinen iterativen
Suchalgorithmus nehemen? Mal davon abgesenen, dass ML für ein lineares
Modell nicht iterieren sollte.
Warum es sinnvoll ist:
-Weil es schon fertig existiert.
-Weil es einfach auf nichtlineare Funktionen mit vielen freien
Parametern erweiterbar ist.
-Weil es einfach ist Unsicherheiten für abhängige und unabhängige
Variablen zu beachten.
-Weil es korrekt implementiert ist.
mh schrieb:> Dann habe ich eine Gegenfrage: Warum sollte man keinen iterativen> Suchalgorithmus nehemen?
Wenn man Rechenzeit im Überfluss hat und mit den Tücken iterativer
Suchalgorithmen umgehen kann, spricht überhaupt nichts dagegen.
Wolfgang schrieb:> mh schrieb:>> Dann habe ich eine Gegenfrage: Warum sollte man keinen iterativen>> Suchalgorithmus nehemen?>> Wenn man Rechenzeit im Überfluss hat und mit den Tücken iterativer> Suchalgorithmen umgehen kann, spricht überhaupt nichts dagegen.
Ja, wenn man die extrem rechenaufwendige Matrixmultiplikation nicht
zahlen möchte, optimiert man für den Spezialfall. Aber bei einer Matrix
die vermutlich komplett im L1-Cache liegt wird man den Unterschied in
der Rechenzeit nicht feststellen können, wenn der mit Abstand größte
Teil der Rechenzeit beim Plotten der Daten draufgeht.
Und was sind nochmal die Tücken dieses iterativen Suchalgorithmus?
mh schrieb:> Aber bei einer Matrix die vermutlich komplett im L1-Cache liegt wird man> den Unterschied in der Rechenzeit nicht feststellen können
Der Unterschied ist, dass man die Rechnung für jeden Iterationsschritt
machen muss, nicht nur ein Mal.
> Und was sind nochmal die Tücken dieses iterativen Suchalgorithmus?
Die Startwerte - abhängig von der "Topologie des Fehlergebirges". Da ist
der TO gerade drüber gestolpert.
mathe-ist-lang-her schrieb:> Was ich noch herausgefunden haben: a und b müssen mit Werten vorbesetzt> werden, die nicht um Grössenordnungen daneben liegen.