Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung |
p:ki:zeitreihe [2024/05/02 08:57] – Tscherter Vincent | p:ki:zeitreihe [2025/09/05 13:34] (aktuell) – Allemann, Peter |
---|
| |
===== - Einfache Zeitreihenvorhersage ===== | ===== - Einfache Zeitreihenvorhersage ===== |
[{{ :p:pasted:zeitreihe0.png|Zeitreihe der stündlichen Messgrösse X. Horizontal sind die Tagesstunden ersichtlich, vertikal die Werte der Messgrösse X. Orange: beobachtete Vergangenheit, Grün: vorherzusagende Zukunft ((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | <figure right>{{:p:pasted:zeitreihe0.png}}<caption>Zeitreihe der stündlichen Messgrösse X. Horizontal sind die Tagesstunden ersichtlich, vertikal die Werte der Messgrösse X. Orange: beobachtete Vergangenheit, Grün: vorherzusagende Zukunft ((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) </caption></figure> |
| |
💡 Eine Zeitreihe vorherzusagen kann für vieles nützlich sein, z.B. eine Vorhersage von Wetter- oder Klimamesswerten, von Börsenkursen, Hochwasserständen etc. | 💡 Eine Zeitreihe vorherzusagen kann für vieles nützlich sein, z.B. eine Vorhersage von Wetter- oder Klimamesswerten, von Börsenkursen, Hochwasserständen etc. |
💡 Eine einfache Idee ist z.B. die Folgende. Wir verwenden jeweils die letzten vier Werte der Zeitreihe als Eingangswerte für ein neuronales Netz (die letzten vier Werte können gemessen oder auch vorhergesagte Werte sein). Diese vier Werte sind in den Abbildungen dunkelblau eingezeichnet. Das neuronale Netz wird zuvor so trainiert, dass es immer nur den nächsten, unbekannten Wert voraussagt. D.h. das neuronale Netz sagt nur einen Zeitschritt (+1 Stunde) voraus. Dieser vorhergesagte Wert ist grün eingezeichnet. Ist ein grüner Wert berechnet worden, so kann auch dieser für die Vorhersage des nächsten Zeitschritts ebenfalls als Eingangswert für das neuronale Netz genommen werden. D.h. das neuronale Netz sagt einen Zeitpunkt voraus, rutscht eine Position weiter und sagt den nächsten Zeitpunkt voraus usw. (dies ist in den drei Abbildungen von links nach rechts ersichtlich). | 💡 Eine einfache Idee ist z.B. die Folgende. Wir verwenden jeweils die letzten vier Werte der Zeitreihe als Eingangswerte für ein neuronales Netz (die letzten vier Werte können gemessen oder auch vorhergesagte Werte sein). Diese vier Werte sind in den Abbildungen dunkelblau eingezeichnet. Das neuronale Netz wird zuvor so trainiert, dass es immer nur den nächsten, unbekannten Wert voraussagt. D.h. das neuronale Netz sagt nur einen Zeitschritt (+1 Stunde) voraus. Dieser vorhergesagte Wert ist grün eingezeichnet. Ist ein grüner Wert berechnet worden, so kann auch dieser für die Vorhersage des nächsten Zeitschritts ebenfalls als Eingangswert für das neuronale Netz genommen werden. D.h. das neuronale Netz sagt einen Zeitpunkt voraus, rutscht eine Position weiter und sagt den nächsten Zeitpunkt voraus usw. (dies ist in den drei Abbildungen von links nach rechts ersichtlich). |
| |
| [{{:p:pasted:zeitreihe1.png|Zeitreihenvorhersage für Zeitschritt 34((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | [{{:p:pasted:zeitreihe2.png|Zeitreihenvorhersage für Zeitschritt 35((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | [{{:p:pasted:zeitreihe3.png|Zeitreihenvorhersage für Zeitschritt 36((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | | <figure center> |
| <subfigure>{{:p:pasted:zeitreihe1.png}} |
| <caption>Zeitreihenvorhersage für Zeitschritt 34((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) </caption></subfigure> |
| <subfigure>{{:p:pasted:zeitreihe2.png}} |
| <caption>Zeitreihenvorhersage für Zeitschritt 35((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) </caption></subfigure> |
| <subfigure>{{:p:pasted:zeitreihe3.png}} |
| <caption>Zeitreihenvorhersage für Zeitschritt 36((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) </caption></subfigure> |
| <caption>Zeitreihenvorhersage </caption> |
| </figure> |
| |
🤔 Wie kann ein neuronales Netz aber für so was trainiert werden? | 🤔 Wie kann ein neuronales Netz aber für so was trainiert werden? |
⚠️ Das **Problem** ist der **Sprung** in der Stundenangabe (siehe unten). Für das neuronale Netz ist der Minimalwert 0 Uhr und der Maximalwert 23 etwas komplett anderes. Für uns (und in der Zeitreihe) sind 0 Uhr und 23 Uhr fast dasselbe. | ⚠️ Das **Problem** ist der **Sprung** in der Stundenangabe (siehe unten). Für das neuronale Netz ist der Minimalwert 0 Uhr und der Maximalwert 23 etwas komplett anderes. Für uns (und in der Zeitreihe) sind 0 Uhr und 23 Uhr fast dasselbe. |
| |
[{{::p:pasted:time1a.png?nolink|Dunkelblau: Tagesstunde((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | <figure center>{{::p:pasted:time1a.png?nolink}}<caption>Dunkelblau: Tagesstunde((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) </caption></figure> |
| |
\\ 🤔 Aber wie können wir 24 Stunden mit einer Zahl so darstellen, dass es keinen Sprung gibt, jedoch jede Tagesstunde einen anderen Wert bekommt? | \\ 🤔 Aber wie können wir 24 Stunden mit einer Zahl so darstellen, dass es keinen Sprung gibt, jedoch jede Tagesstunde einen anderen Wert bekommt? |
💡 Bevor du dir den Kopf zerbrichst, das ist mit einer Zahl nicht möglich, jedoch mit zwei Zahlen schon! Die Idee besteht darin, die Tagesstunde durch den Sinus UND den Cosinus der Tagesstunde zu ersetzen, d.h. durch zwei Eingangsgrössen.((Genauer gesagt verwenden wir ''sin(2*π*hour/24)'' und ''cos(2*π*hour/24)'' als zusätzliche Eingangsgrössen. Das ''2*π/24'' sorgt dafür, dass der Sinus und der Cosinus nach 24 Stunden wieder die Anfangswerte einnimmt.)). So wird jede Tagesstunde durch ein anderes Sinus / Cosinus Wertepaar dargestellt (siehe unten). | 💡 Bevor du dir den Kopf zerbrichst, das ist mit einer Zahl nicht möglich, jedoch mit zwei Zahlen schon! Die Idee besteht darin, die Tagesstunde durch den Sinus UND den Cosinus der Tagesstunde zu ersetzen, d.h. durch zwei Eingangsgrössen.((Genauer gesagt verwenden wir ''sin(2*π*hour/24)'' und ''cos(2*π*hour/24)'' als zusätzliche Eingangsgrössen. Das ''2*π/24'' sorgt dafür, dass der Sinus und der Cosinus nach 24 Stunden wieder die Anfangswerte einnimmt.)). So wird jede Tagesstunde durch ein anderes Sinus / Cosinus Wertepaar dargestellt (siehe unten). |
| |
[{{::p:pasted:time1b.png|Dunkelblau: Tagesstunde; Blaugrau: Sinus der Tagesstunde; Grau: Cosinus der Tagesstunde((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | <figure center>{{::p:pasted:time1b.png}}<caption>Dunkelblau: Tagesstunde; Blaugrau: Sinus der Tagesstunde; Grau: Cosinus der Tagesstunde((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) </caption></figure> |
| |
\\ 💡 Also bauen wir statt der Tagesstunde, die Sinus- und Cosinuswerte der Tagesstunde als zusätzliche Eingangsgrössen mit ein. | \\ 💡 Also bauen wir statt der Tagesstunde, die Sinus- und Cosinuswerte der Tagesstunde als zusätzliche Eingangsgrössen mit ein. |
- Starte das Programm zwei oder dreimal. Spiele mit Parametern etwas herum. Versuche, mit möglichst wenigen ''TIMESERIES_FEATURES'' auszukommen. Halte fest, mit welchen Einstellungen du dein bestes Resultat erzielen konntest.{{gem/plain?0=N4XyA#4b7eb6d8feb6e66f}} | - Starte das Programm zwei oder dreimal. Spiele mit Parametern etwas herum. Versuche, mit möglichst wenigen ''TIMESERIES_FEATURES'' auszukommen. Halte fest, mit welchen Einstellungen du dein bestes Resultat erzielen konntest.{{gem/plain?0=N4XyA#4b7eb6d8feb6e66f}} |
{{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Diese%20Trainings-%20und%20Updateparameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0A%0Aconst%20TIMESERIES_FEATURES%20%3D%2012%3B%20%2F%2F%20ganzahliger%20Wert%20von%201%20bis%2024%0A%0Aconst%20LERNRATE%20%3D%200.001%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%2020%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%20300%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20data%0Aconst%20hourArray%20%3D%20%5B0%2C%201%2C%202%2C%203%2C%204%2C%205%2C%206%2C%207%2C%208%2C%209%2C%2010%2C%2011%2C%2012%2C%2013%2C%2014%2C%2015%2C%2016%2C%2017%2C%2018%2C%2019%2C%2020%2C%2021%2C%2022%2C%2023%5D%3B%0Aconst%20valueArray%20%3D%20%5B0.5%2C%200.44%2C%200.41%2C%200.43%2C%200.5%2C%200.62%2C%200.75%2C%200.87%2C%200.93%2C%200.93%2C%200.84%2C%200.69%2C%200.5%2C%200.31%2C%200.16%2C%200.07%2C%200.07%2C%200.13%2C%200.25%2C%200.38%2C%200.5%2C%200.57%2C%200.59%2C%200.56%5D%3B%0A%0A%2F%2F%20further%20constants%0Aconst%20PREDICTION_LIMIT%20%3D%20120%3B%0Aconst%20PERIODICITY%20%3D%20hourArray.length%3B%0Aconst%20GRAPH_WIDH%20%3D%20600%3B%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20DATA%20HANDLING%20FUNCTIONS%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20create%20input%20data%0A%2F%2F%0Afunction%20createInputArray%28valueArray%29%20%7B%0A%09let%20inputArray%20%3D%20new%20Array%28valueArray.length%29.fill%280%29.map%28%28%29%20%3D%3E%20new%20Array%28TIMESERIES_FEATURES%29.fill%280%29%29%3B%20%2F%2F%20empty%20two-dimensional%20array%0A%09for%20%28v%20%3D%200%3B%20v%20%3C%20valueArray.length%3B%20v%2B%2B%29%20%7B%0A%09%09for%20%28f%20%3D%200%3B%20f%20%3C%20TIMESERIES_FEATURES%3B%20f%2B%2B%29%20%7B%0A%09%09%09inputArray%5Bv%5D%5Bf%5D%20%3D%20valueArray%5B%28v%20%2B%20f%29%20%25%20valueArray.length%5D%3B%0A%09%09%7D%0A%09%7D%0A%09return%20inputArray%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20create%20output%20data%0A%2F%2F%0Afunction%20createOutputArray%28valueArray%29%20%7B%0A%09let%20outputArray%20%3D%20new%20Array%28valueArray.length%29.fill%280%29%3B%0A%09for%20%28v%20%3D%200%3B%20v%20%3C%20valueArray.length%3B%20v%2B%2B%29%20%7B%0A%09%09outputArray%5Bv%5D%20%3D%20valueArray%5B%28v%20%2B%20TIMESERIES_FEATURES%29%20%25%20valueArray.length%5D%3B%0A%09%7D%0A%09return%20outputArray%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20NEURAL%20NETWORK%20FUNCTIONS%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20build%20model%0A%2F%2F%0Afunction%20buildModel%28%29%20%7B%0A%09const%20model%20%3D%20tf.sequential%28%7B%0A%09%09layers%3A%20%5B%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09%09%09inputShape%3A%20%5BTIMESERIES_FEATURES%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27relu%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer2%27%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27relu%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09%09%09units%3A%201%2C%0A%09%09%09%09activation%3A%20%27linear%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.adam%28LERNRATE%29%2C%0A%09%09loss%3A%20tf.losses.meanSquaredError%0A%09%7D%29%3B%0A%09return%20model%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20train%20model%0A%2F%2F%0Aasync%20function%20trainModel%28model%2C%20trainInput%2C%20trainOutput%29%20%7B%0A%09let%20history%20%3D%20await%20model.fit%28%0A%09%09tf.tensor%28trainInput%29%2C%20tf.tensor%28trainOutput%29%2C%20%7B%0A%09%09%09epochs%3A%20ANZAHL_EPOCHEN%20%2B%201%2C%0A%09%09%09batchSize%3A%20trainInput.length%2C%0A%09%09%09shuffle%3A%20true%2C%0A%09%09%09callbacks%3A%20%5B%0A%09%09%09%09tfvis.show.fitCallbacks%28%7B%0A%09%09%09%09%09name%3A%20%27Trainingsfehler%27%2C%0A%09%09%09%09%09tab%3A%20%27Training%27%2C%0A%09%09%09%09%09styles%3A%20%7B%0A%09%09%09%09%09%09width%3A%20GRAPH_WIDH%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%2C%20%5B%27loss%27%5D%2C%20%7B%0A%09%09%09%09%09height%3A%20200%2C%0A%09%09%09%09%09callbacks%3A%20%5B%27onEpochEnd%27%5D%2C%0A%09%09%09%09%09yLabel%3A%20%27MSE%27%0A%09%09%09%09%7D%29%2C%0A%09%09%09%5D%0A%09%09%7D%29%3B%0A%09return%20history%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20predict%20timeseries%20ahead%20and%20return%20object%20for%20tfvis%0A%2F%2F%0Aasync%20function%20predictTimeseries%28model%2C%20inputArray%29%20%7B%0A%09let%20mae%20%3D%20%5B%5D%3B%0A%09let%20predictedOutput%20%3D%20%5B%5D%3B%0A%09let%20inputSample%20%3D%20%5BinputArray%5BinputArray.length%20-%20TIMESERIES_FEATURES%5D.slice%28%29%5D%3B%0A%09let%20outputTensor%2C%20outputArray%3B%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20PREDICTION_LIMIT%3B%20t%2B%2B%29%20%7B%0A%09%09%2F%2F%20predict%20one%20timestep%0A%09%09outputTensor%20%3D%20await%20model.predict%28tf.tensor%28inputSample%29%29%3B%0A%09%09outputArray%20%3D%20await%20outputTensor.arraySync%28%29%3B%0A%09%09%2F%2F%20shift%20timeseries%20by%20one%20step%0A%09%09for%20%28f%20%3D%201%3B%20f%20%3C%20TIMESERIES_FEATURES%3B%20f%2B%2B%29%20%7B%0A%09%09%09inputSample%5B0%5D%5Bf%20-%201%5D%20%3D%20inputSample%5B0%5D%5Bf%5D%3B%0A%09%09%7D%0A%09%09%2F%2F%20add%20prediction%20as%20most%20recent%20time%20in%20timeseries%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20-%201%5D%20%3D%20outputArray%5B0%5D%5B0%5D%3B%0A%09%09%2F%2F%20store%20predicted%20time%0A%09%09predictedOutput.push%28outputArray%5B0%5D%5B0%5D%29%3B%0A%09%09%2F%2F%20store%20initial%20mae%20values%0A%09%09mae.push%28Math.abs%28outputArray%5B0%5D%5B0%5D%20-%20valueArray%5Bt%20%25%20PERIODICITY%5D%29%29%3B%0A%09%7D%0A%09%2F%2F%20summ%20mae%20values%20for%20shifted%20predictions%0A%09for%20%28s%20%3D%201%3B%20s%20%3C%20PERIODICITY%3B%20s%20%3D%20s%20%2B%201%29%20%7B%0A%09%09inputSample%20%3D%20%5BinputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%29%20%25%20PERIODICITY%5D.slice%28%29%5D%3B%0A%09%09for%20%28t%20%3D%200%3B%20t%20%3C%20PREDICTION_LIMIT%3B%20t%2B%2B%29%20%7B%0A%09%09%09%2F%2F%20predict%20one%20timestep%0A%09%09%09outputTensor%20%3D%20await%20model.predict%28tf.tensor%28inputSample%29%29%3B%0A%09%09%09outputArray%20%3D%20await%20outputTensor.arraySync%28%29%3B%0A%09%09%09%2F%2F%20shift%20timeseries%20by%20one%20step%0A%09%09%09for%20%28f%20%3D%201%3B%20f%20%3C%20TIMESERIES_FEATURES%3B%20f%2B%2B%29%20%7B%0A%09%09%09%09inputSample%5B0%5D%5Bf%20-%201%5D%20%3D%20inputSample%5B0%5D%5Bf%5D%3B%0A%09%09%09%7D%0A%09%09%09%2F%2F%20add%20prediction%20as%20most%20recent%20time%20in%20timeseries%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20-%201%5D%20%3D%20outputArray%5B0%5D%5B0%5D%3B%0A%09%09%09%2F%2F%20add%20mae%20values%0A%09%09%09mae%5Bt%5D%20%2B%3D%20Math.abs%28outputArray%5B0%5D%5B0%5D%20-%20valueArray%5B%28t%20%2B%20s%29%20%25%20PERIODICITY%5D%29%3B%0A%09%09%7D%0A%09%7D%0A%09%2F%2F%20calculate%20mae%20mean%20values%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20mae.length%3B%20t%2B%2B%29%20%7B%0A%09%09mae%5Bt%5D%20%3D%20mae%5Bt%5D%20%2F%20PERIODICITY%3B%0A%09%7D%0A%09return%20%5BpredictedOutput%2C%20mae%5D%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20timeseries%20prediction%0A%2F%2F%0Afunction%20drawTimeseries%28trueArray%2C%20predictedArray%2C%20mae%29%20%7B%0A%09%2F%2F%20observed%20values%0A%09let%20trueArrayObject%20%3D%20%5B%5D%3B%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20predictedArray.length%3B%20t%2B%2B%29%20%7B%0A%09%09trueArrayObject.push%28%7B%0A%09%09%09x%3A%20t%2C%0A%09%09%09y%3A%20trueArray%5Bt%20%25%20trueArray.length%5D%20%2a%2010%0A%09%09%7D%29%3B%0A%09%7D%0A%09%2F%2F%20predicted%20values%0A%09let%20predictedArrayObject%20%3D%20%5B%5D%3B%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20predictedArray.length%3B%20t%2B%2B%29%20%7B%0A%09%09predictedArrayObject.push%28%7B%0A%09%09%09x%3A%20t%2C%0A%09%09%09y%3A%20predictedArray%5Bt%5D%20%2a%2010%0A%09%09%7D%29%3B%0A%09%7D%0A%09%2F%2F%20prediction%20error%0A%09let%20meanPredictionError%20%3D%20%5B%5D%3B%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20predictedArray.length%3B%20t%2B%2B%29%20%7B%0A%09%09meanPredictionError.push%28%7B%0A%09%09%09x%3A%20t%2C%0A%09%09%09y%3A%20mae%5Bt%5D%20%2a%2010%0A%09%09%7D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20everything%0A%09let%20data%2C%20look%3B%0A%09let%20surface%20%3D%20%7B%0A%09%09name%3A%20%22Zeitreihenvorhersage%22%2C%0A%09%09tab%3A%20%27Resultat%27%2C%0A%09%09styles%3A%20%7B%0A%09%09%09width%3A%20GRAPH_WIDH%0A%09%09%7D%0A%09%7D%3B%0A%09data%20%3D%20%7B%0A%09%09values%3A%20%5BtrueArrayObject%2C%20predictedArrayObject%2C%20meanPredictionError%5D%2C%0A%09%09series%3A%20%5B%22beobachtet%22%2C%20%22vorhergesagt%22%2C%20%22MAE%22%5D%0A%09%7D%3B%0A%09look%20%3D%20%7B%0A%09%09xLabel%3A%20%27Prognosezeit%20%28Stunden%29%27%2C%0A%09%09yLabel%3A%20%27Wert%27%2C%0A%09%09zoomToFit%3A%20true%2C%0A%09%09seriesColors%3A%20%5B%22darkmagenta%22%2C%20%22coral%22%2C%20%22limegreen%22%5D%0A%09%7D%3B%0A%09tfvis.render.linechart%28surface%2C%20data%2C%20look%29%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20main%20function%0A%2F%2F%0Aasync%20function%20run%28%29%20%7B%0A%09%2F%2Fnoprotect%0A%0A%09%2F%2F%20check%20number%20of%20TIME_SERIES_FEATURES%0A%09if%20%28TIMESERIES_FEATURES%20%3E%20PERIODICITY%20%7C%7C%20TIMESERIES_FEATURES%20%3C%200%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20TIMESERIES_FEATURES%20muss%20zwischen%200%20und%20%22%20%2B%20PERIODICITY%20%2B%20%22%20liegen%21%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%0A%09%2F%2F%20write%20preferences%20on%20console%0A%09console.log%28%22Zeitreihenvorhersage%22%29%3B%0A%09console.log%28%22Neuronales%20Netz%3A%20Anzahl%20Eingangsgr%C3%B6ssen%3A%20%22%20%2B%20TIMESERIES_FEATURES%20%2B%20%22%2C%20Anzahl%20Hidden%20Neuronen%3A%20%22%20%2B%20ANZAHL_HIDDEN_NEURONS%29%3B%0A%09console.log%28%22Training%3A%20Lernrate%3A%20%22%20%2B%20LERNRATE%20%2B%20%22%2C%20Epochen%3A%20%22%20%2B%20ANZAHL_EPOCHEN%29%3B%0A%0A%09%2F%2F%20create%20input%20and%20output%20data%0A%09let%20inputArray%20%3D%20createInputArray%28valueArray%29%3B%0A%09let%20outputArray%20%3D%20createOutputArray%28valueArray%29%3B%0A%0A%09%2F%2F%20build%20and%20show%20model%0A%09let%20model%20%3D%20buildModel%28%29%3B%0A%09if%20%28%21tfvis.visor%28%29.isFullscreen%28%29%29%20%7B%0A%09%09tfvis.visor%28%29.toggleFullScreen%28%29%3B%0A%09%7D%0A%09tfvis.show.modelSummary%28%7B%0A%09%09name%3A%20%27Neuronales%20Netz%27%2C%0A%09%09tab%3A%20%27Modell%27%2C%0A%09%09styles%3A%20%7B%0A%09%09%09width%3A%20GRAPH_WIDH%0A%09%09%7D%0A%09%7D%2C%20model%29%3B%0A%0A%09%2F%2F%20train%20model%0A%09let%20history%20%3D%20await%20trainModel%28model%2C%20inputArray%2C%20outputArray%29%3B%0A%09console.log%28%22Entg%C3%BCltiger%20Trainingsfehler%20%28MSE%29%3A%20%22%20%2B%20history.history.loss%5BANZAHL_EPOCHEN%5D%29%3B%0A%0A%09%2F%2F%20predict%20and%20show%20timeseries%0A%09let%20%5BpredictedTimeseries%2C%20mae%5D%20%3D%20await%20predictTimeseries%28model%2C%20inputArray%29%3B%0A%09drawTimeseries%28valueArray%2C%20predictedTimeseries%2C%20mae%29%3B%0A%0A%7D%0Adocument.addEventListener%28%27DOMContentLoaded%27%2C%20run%29%3B&css=undefined&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E%0A%3Cscript%20src%3D%22https%3A%2F%2Fcdn.jsdelivr.net%2Fnpm%2F%40tensorflow%2Ftfjs%40latest%2Fdist%2Ftf.min.js%22%3E%3C%2Fscript%3E%0A%3Cscript%20src%3D%22https%3A%2F%2Fcdn.jsdelivr.net%2Fnpm%2F%40tensorflow%2Ftfjs-vis%22%3E%3C%2Fscript%3E&autorun=off&height=700px#ModernButNoTime}} | {{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Diese%20Trainings-%20und%20Updateparameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0A%0Aconst%20TIMESERIES_FEATURES%20%3D%2012%3B%20%2F%2F%20ganzahliger%20Wert%20von%201%20bis%2024%0A%0Aconst%20LERNRATE%20%3D%200.001%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%2020%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%20300%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20data%0Aconst%20hourArray%20%3D%20%5B0%2C%201%2C%202%2C%203%2C%204%2C%205%2C%206%2C%207%2C%208%2C%209%2C%2010%2C%2011%2C%2012%2C%2013%2C%2014%2C%2015%2C%2016%2C%2017%2C%2018%2C%2019%2C%2020%2C%2021%2C%2022%2C%2023%5D%3B%0Aconst%20valueArray%20%3D%20%5B0.5%2C%200.44%2C%200.41%2C%200.43%2C%200.5%2C%200.62%2C%200.75%2C%200.87%2C%200.93%2C%200.93%2C%200.84%2C%200.69%2C%200.5%2C%200.31%2C%200.16%2C%200.07%2C%200.07%2C%200.13%2C%200.25%2C%200.38%2C%200.5%2C%200.57%2C%200.59%2C%200.56%5D%3B%0A%0A%2F%2F%20further%20constants%0Aconst%20PREDICTION_LIMIT%20%3D%20120%3B%0Aconst%20PERIODICITY%20%3D%20hourArray.length%3B%0Aconst%20GRAPH_WIDH%20%3D%20600%3B%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20DATA%20HANDLING%20FUNCTIONS%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20create%20input%20data%0A%2F%2F%0Afunction%20createInputArray%28valueArray%29%20%7B%0A%09let%20inputArray%20%3D%20new%20Array%28valueArray.length%29.fill%280%29.map%28%28%29%20%3D%3E%20new%20Array%28TIMESERIES_FEATURES%29.fill%280%29%29%3B%20%2F%2F%20empty%20two-dimensional%20array%0A%09for%20%28v%20%3D%200%3B%20v%20%3C%20valueArray.length%3B%20v%2B%2B%29%20%7B%0A%09%09for%20%28f%20%3D%200%3B%20f%20%3C%20TIMESERIES_FEATURES%3B%20f%2B%2B%29%20%7B%0A%09%09%09inputArray%5Bv%5D%5Bf%5D%20%3D%20valueArray%5B%28v%20%2B%20f%29%20%25%20valueArray.length%5D%3B%0A%09%09%7D%0A%09%7D%0A%09return%20inputArray%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20create%20output%20data%0A%2F%2F%0Afunction%20createOutputArray%28valueArray%29%20%7B%0A%09let%20outputArray%20%3D%20new%20Array%28valueArray.length%29.fill%280%29%3B%0A%09for%20%28v%20%3D%200%3B%20v%20%3C%20valueArray.length%3B%20v%2B%2B%29%20%7B%0A%09%09outputArray%5Bv%5D%20%3D%20valueArray%5B%28v%20%2B%20TIMESERIES_FEATURES%29%20%25%20valueArray.length%5D%3B%0A%09%7D%0A%09return%20outputArray%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20NEURAL%20NETWORK%20FUNCTIONS%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20build%20model%0A%2F%2F%0Afunction%20buildModel%28%29%20%7B%0A%09const%20model%20%3D%20tf.sequential%28%7B%0A%09%09layers%3A%20%5B%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09%09%09inputShape%3A%20%5BTIMESERIES_FEATURES%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27relu%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer2%27%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27relu%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09%09%09units%3A%201%2C%0A%09%09%09%09activation%3A%20%27linear%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.adam%28LERNRATE%29%2C%0A%09%09loss%3A%20tf.losses.meanSquaredError%0A%09%7D%29%3B%0A%09return%20model%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20train%20model%0A%2F%2F%0Aasync%20function%20trainModel%28model%2C%20trainInput%2C%20trainOutput%29%20%7B%0A%09let%20history%20%3D%20await%20model.fit%28%0A%09%09tf.tensor%28trainInput%29%2C%20tf.tensor%28trainOutput%29%2C%20%7B%0A%09%09%09epochs%3A%20ANZAHL_EPOCHEN%20%2B%201%2C%0A%09%09%09batchSize%3A%20trainInput.length%2C%0A%09%09%09shuffle%3A%20true%2C%0A%09%09%09callbacks%3A%20%5B%0A%09%09%09%09tfvis.show.fitCallbacks%28%7B%0A%09%09%09%09%09name%3A%20%27Trainingsfehler%27%2C%0A%09%09%09%09%09tab%3A%20%27Training%27%2C%0A%09%09%09%09%09styles%3A%20%7B%0A%09%09%09%09%09%09width%3A%20GRAPH_WIDH%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%2C%20%5B%27loss%27%5D%2C%20%7B%0A%09%09%09%09%09height%3A%20200%2C%0A%09%09%09%09%09callbacks%3A%20%5B%27onEpochEnd%27%5D%2C%0A%09%09%09%09%09yLabel%3A%20%27MSE%27%0A%09%09%09%09%7D%29%2C%0A%09%09%09%5D%0A%09%09%7D%29%3B%0A%09return%20history%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20predict%20timeseries%20ahead%20and%20return%20object%20for%20tfvis%0A%2F%2F%0Aasync%20function%20predictTimeseries%28model%2C%20inputArray%29%20%7B%0A%09let%20mae%20%3D%20%5B%5D%3B%0A%09let%20predictedOutput%20%3D%20%5B%5D%3B%0A%09let%20inputSample%20%3D%20%5BinputArray%5BinputArray.length%20-%20TIMESERIES_FEATURES%5D.slice%28%29%5D%3B%0A%09let%20outputTensor%2C%20outputArray%3B%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20PREDICTION_LIMIT%3B%20t%2B%2B%29%20%7B%0A%09%09%2F%2F%20predict%20one%20timestep%0A%09%09outputTensor%20%3D%20await%20model.predict%28tf.tensor%28inputSample%29%29%3B%0A%09%09outputArray%20%3D%20await%20outputTensor.arraySync%28%29%3B%0A%09%09%2F%2F%20shift%20timeseries%20by%20one%20step%0A%09%09for%20%28f%20%3D%201%3B%20f%20%3C%20TIMESERIES_FEATURES%3B%20f%2B%2B%29%20%7B%0A%09%09%09inputSample%5B0%5D%5Bf%20-%201%5D%20%3D%20inputSample%5B0%5D%5Bf%5D%3B%0A%09%09%7D%0A%09%09%2F%2F%20add%20prediction%20as%20most%20recent%20time%20in%20timeseries%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20-%201%5D%20%3D%20outputArray%5B0%5D%5B0%5D%3B%0A%09%09%2F%2F%20store%20predicted%20time%0A%09%09predictedOutput.push%28outputArray%5B0%5D%5B0%5D%29%3B%0A%09%09%2F%2F%20store%20initial%20mae%20values%0A%09%09mae.push%28Math.abs%28outputArray%5B0%5D%5B0%5D%20-%20valueArray%5Bt%20%25%20PERIODICITY%5D%29%29%3B%0A%09%7D%0A%09%2F%2F%20summ%20mae%20values%20for%20shifted%20predictions%0A%09for%20%28s%20%3D%201%3B%20s%20%3C%20PERIODICITY%3B%20s%20%3D%20s%20%2B%201%29%20%7B%0A%09%09inputSample%20%3D%20%5BinputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%29%20%25%20PERIODICITY%5D.slice%28%29%5D%3B%0A%09%09for%20%28t%20%3D%200%3B%20t%20%3C%20PREDICTION_LIMIT%3B%20t%2B%2B%29%20%7B%0A%09%09%09%2F%2F%20predict%20one%20timestep%0A%09%09%09outputTensor%20%3D%20await%20model.predict%28tf.tensor%28inputSample%29%29%3B%0A%09%09%09outputArray%20%3D%20await%20outputTensor.arraySync%28%29%3B%0A%09%09%09%2F%2F%20shift%20timeseries%20by%20one%20step%0A%09%09%09for%20%28f%20%3D%201%3B%20f%20%3C%20TIMESERIES_FEATURES%3B%20f%2B%2B%29%20%7B%0A%09%09%09%09inputSample%5B0%5D%5Bf%20-%201%5D%20%3D%20inputSample%5B0%5D%5Bf%5D%3B%0A%09%09%09%7D%0A%09%09%09%2F%2F%20add%20prediction%20as%20most%20recent%20time%20in%20timeseries%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20-%201%5D%20%3D%20outputArray%5B0%5D%5B0%5D%3B%0A%09%09%09%2F%2F%20add%20mae%20values%0A%09%09%09mae%5Bt%5D%20%2B%3D%20Math.abs%28outputArray%5B0%5D%5B0%5D%20-%20valueArray%5B%28t%20%2B%20s%29%20%25%20PERIODICITY%5D%29%3B%0A%09%09%7D%0A%09%7D%0A%09%2F%2F%20calculate%20mae%20mean%20values%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20mae.length%3B%20t%2B%2B%29%20%7B%0A%09%09mae%5Bt%5D%20%3D%20mae%5Bt%5D%20%2F%20PERIODICITY%3B%0A%09%7D%0A%09return%20%5BpredictedOutput%2C%20mae%5D%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20timeseries%20prediction%0A%2F%2F%0Afunction%20drawTimeseries%28trueArray%2C%20predictedArray%2C%20mae%29%20%7B%0A%09%2F%2F%20observed%20values%0A%09let%20trueArrayObject%20%3D%20%5B%5D%3B%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20predictedArray.length%3B%20t%2B%2B%29%20%7B%0A%09%09trueArrayObject.push%28%7B%0A%09%09%09x%3A%20t%2C%0A%09%09%09y%3A%20trueArray%5Bt%20%25%20trueArray.length%5D%20%2a%2010%0A%09%09%7D%29%3B%0A%09%7D%0A%09%2F%2F%20predicted%20values%0A%09let%20predictedArrayObject%20%3D%20%5B%5D%3B%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20predictedArray.length%3B%20t%2B%2B%29%20%7B%0A%09%09predictedArrayObject.push%28%7B%0A%09%09%09x%3A%20t%2C%0A%09%09%09y%3A%20predictedArray%5Bt%5D%20%2a%2010%0A%09%09%7D%29%3B%0A%09%7D%0A%09%2F%2F%20prediction%20error%0A%09let%20meanPredictionError%20%3D%20%5B%5D%3B%0A%09for%20%28t%20%3D%200%3B%20t%20%3C%20predictedArray.length%3B%20t%2B%2B%29%20%7B%0A%09%09meanPredictionError.push%28%7B%0A%09%09%09x%3A%20t%2C%0A%09%09%09y%3A%20mae%5Bt%5D%20%2a%2010%0A%09%09%7D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20everything%0A%09let%20data%2C%20look%3B%0A%09let%20surface%20%3D%20%7B%0A%09%09name%3A%20%22Zeitreihenvorhersage%22%2C%0A%09%09tab%3A%20%27Resultat%27%2C%0A%09%09styles%3A%20%7B%0A%09%09%09width%3A%20GRAPH_WIDH%0A%09%09%7D%0A%09%7D%3B%0A%09data%20%3D%20%7B%0A%09%09values%3A%20%5BtrueArrayObject%2C%20predictedArrayObject%2C%20meanPredictionError%5D%2C%0A%09%09series%3A%20%5B%22beobachtet%22%2C%20%22vorhergesagt%22%2C%20%22MAE%22%5D%0A%09%7D%3B%0A%09look%20%3D%20%7B%0A%09%09xLabel%3A%20%27Prognosezeit%20%28Stunden%29%27%2C%0A%09%09yLabel%3A%20%27Wert%27%2C%0A%09%09zoomToFit%3A%20true%2C%0A%09%09seriesColors%3A%20%5B%22darkmagenta%22%2C%20%22coral%22%2C%20%22limegreen%22%5D%0A%09%7D%3B%0A%09tfvis.render.linechart%28surface%2C%20data%2C%20look%29%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20main%20function%0A%2F%2F%0Aasync%20function%20run%28%29%20%7B%0A%09%2F%2Fnoprotect%0A%0A%09%2F%2F%20check%20number%20of%20TIME_SERIES_FEATURES%0A%09if%20%28TIMESERIES_FEATURES%20%3E%20PERIODICITY%20%7C%7C%20TIMESERIES_FEATURES%20%3C%200%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20TIMESERIES_FEATURES%20muss%20zwischen%200%20und%20%22%20%2B%20PERIODICITY%20%2B%20%22%20liegen%21%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%0A%09%2F%2F%20write%20preferences%20on%20console%0A%09console.log%28%22Zeitreihenvorhersage%22%29%3B%0A%09console.log%28%22Neuronales%20Netz%3A%20Anzahl%20Eingangsgr%C3%B6ssen%3A%20%22%20%2B%20TIMESERIES_FEATURES%20%2B%20%22%2C%20Anzahl%20Hidden%20Neuronen%3A%20%22%20%2B%20ANZAHL_HIDDEN_NEURONS%29%3B%0A%09console.log%28%22Training%3A%20Lernrate%3A%20%22%20%2B%20LERNRATE%20%2B%20%22%2C%20Epochen%3A%20%22%20%2B%20ANZAHL_EPOCHEN%29%3B%0A%0A%09%2F%2F%20create%20input%20and%20output%20data%0A%09let%20inputArray%20%3D%20createInputArray%28valueArray%29%3B%0A%09let%20outputArray%20%3D%20createOutputArray%28valueArray%29%3B%0A%0A%09%2F%2F%20build%20and%20show%20model%0A%09let%20model%20%3D%20buildModel%28%29%3B%0A%09if%20%28%21tfvis.visor%28%29.isFullscreen%28%29%29%20%7B%0A%09%09tfvis.visor%28%29.toggleFullScreen%28%29%3B%0A%09%7D%0A%09tfvis.show.modelSummary%28%7B%0A%09%09name%3A%20%27Neuronales%20Netz%27%2C%0A%09%09tab%3A%20%27Modell%27%2C%0A%09%09styles%3A%20%7B%0A%09%09%09width%3A%20GRAPH_WIDH%0A%09%09%7D%0A%09%7D%2C%20model%29%3B%0A%0A%09%2F%2F%20train%20model%0A%09let%20history%20%3D%20await%20trainModel%28model%2C%20inputArray%2C%20outputArray%29%3B%0A%09console.log%28%22Entg%C3%BCltiger%20Trainingsfehler%20%28MSE%29%3A%20%22%20%2B%20history.history.loss%5BANZAHL_EPOCHEN%5D%29%3B%0A%0A%09%2F%2F%20predict%20and%20show%20timeseries%0A%09let%20%5BpredictedTimeseries%2C%20mae%5D%20%3D%20await%20predictTimeseries%28model%2C%20inputArray%29%3B%0A%09drawTimeseries%28valueArray%2C%20predictedTimeseries%2C%20mae%29%3B%0A%0A%7D%0Adocument.addEventListener%28%27DOMContentLoaded%27%2C%20run%29%3B&css=undefined&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E%0A%3Cscript%20src%3D%22https%3A%2F%2Fcdn.jsdelivr.net%2Fnpm%2F%40tensorflow%2Ftfjs%40latest%2Fdist%2Ftf.min.js%22%3E%3C%2Fscript%3E%0A%3Cscript%20src%3D%22https%3A%2F%2Fcdn.jsdelivr.net%2Fnpm%2F%40tensorflow%2Ftfjs-vis%22%3E%3C%2Fscript%3E&autorun=off&height=700px#ModernButNoTime}} |
| </WRAP> |
=== Eigene Notizen === | === Eigene Notizen === |
{{gem/quill#310ef8c289347e7f}} | {{gem/quill#310ef8c289347e7f}} |