Nächste Überarbeitung | Vorhergehende Überarbeitung |
p:ki:zeitreihe [2023/08/28 22:33] – angelegt Ralf Kretzschmar | p:ki:zeitreihe [2024/05/02 08:57] (aktuell) – Tscherter, Vincent |
---|
💡 Dieses Thema setzt Grundwissen bezüglich neuronaler Netze voraus (dieses Grundwissen wird z.B. in [[:p:ki:fische1|Künstliche Intelligenz für echte Fische]] vermittelt). | 💡 Dieses Thema setzt Grundwissen bezüglich neuronaler Netze voraus (dieses Grundwissen wird z.B. in [[:p:ki:fische1|Künstliche Intelligenz für echte Fische]] vermittelt). |
| |
~~NOTOC~~ {{INLINETOC 2-3}} \\ | ~~INTOC~~ |
| |
===== - Einfache Zeitreihenvorhersage ===== | ===== - Einfache Zeitreihenvorhersage ===== |
[{{ :p:pasted:zeitreihe0.png?nolink&360|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]])) }}] | [{{ :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]])) }}] |
| |
💡 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. |
🤔 Wie lässt sich nun eine solche digitale Zeitreihe vorhersagen? | 🤔 Wie lässt sich nun eine solche digitale Zeitreihe vorhersagen? |
| |
💡 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 blau 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?nolink&272|Zeitreihenvorhersage für Zeitschritt 34((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | [{{:p:pasted:zeitreihe2.png?nolink&272|Zeitreihenvorhersage für Zeitschritt 35((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | [{{:p:pasted:zeitreihe3.png?nolink&272|Zeitreihenvorhersage für Zeitschritt 36((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | | | [{{: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]])) }}] | |
| |
🤔 Wie kann ein neuronales Netz aber für so was trainiert werden? | 🤔 Wie kann ein neuronales Netz aber für so was trainiert werden? |
- Starte das untenstehende Programm und studiere die folgenden Punkte (es dauert einen kleinen Moment, bis die Zeitreihe angezeigt wird). | - Starte das untenstehende Programm und studiere die folgenden Punkte (es dauert einen kleinen Moment, bis die Zeitreihe angezeigt wird). |
* Während dem Training wird der Trainingsfehler "loss" (MSE für die +1 Stundenprognose) angezeigt. | * Während dem Training wird der Trainingsfehler "loss" (MSE für die +1 Stundenprognose) angezeigt. |
* Danach wird eine Grafik erzeugt mit | * Danach wird eine Grafik für eine Prognosezeitreihe ausgehend von einem Startpunkt erzeugt mit |
* der wahren, beobachteten Zeitreihe (orange) | * der wahren, beobachteten Zeitreihe (orange) |
* der vorhergesagten Zeitreihe (grün) | * der vorhergesagten Zeitreihe (grün) |
* dem MAE für die +1, +2, +3, ... + 120 Stundenprognosen (blau) | * Zusätzlich wird der MAE für die +1, +2, +3, ... + 120 Stundenprognosen (violett) berechnet. Der MAE wird über mehrere Prognosenzeitreihen ausgehend von mehreren, verschiedenen Startpunkten aus gemittelt. |
* Du kannst nach dem Training zwischen einer Beschreibung des neuronalen Netzes, dem Trainingsfehler und der Vorhersage über die Register ''Modell'', ''Training'' und ''Resultat'' hin und her wechseln. | * Du kannst nach dem Training zwischen einer Beschreibung des neuronalen Netzes, dem Trainingsfehler und der Vorhersage über die Register ''Modell'', ''Training'' und ''Resultat'' hin und her wechseln. |
- Notiere den MAE für die +72 Stundenprognose, fahre dazu einfach mit der Maus auf die Grafik und suche den MAE für ''x = 72''. {{gem/plain?0=N4XyA#a71e8c87a540f361}} | - Notiere den MAE für die +72 Stundenprognose, fahre dazu einfach mit der Maus auf die Grafik und suche den MAE für ''x = 72''. {{gem/plain?0=N4XyA#a71e8c87a540f361}} |
- Warum wird der MAE tentenziell immer grösser mit fortschreitender Prognosezeit? Schreibe deine Vermutung in das Textfeld. {{gem/plain?0=N4XyA#5daa8fe086e55930}} | - Warum wird der MAE tentenziell immer grösser mit fortschreitender Prognosezeit? Schreibe deine Vermutung in das Textfeld. {{gem/plain?0=N4XyA#5daa8fe086e55930}} |
- Vergleiche deine Antwort mit ++unserer Antwort|\\ \\ Für die Prognosezeit +1 Stunde verwendet das neuronale Netz nur gemessene (beobachtete) Daten. Für die Prognosezeit +2 Stunden wird bereits ein vorhergesagter Wert verwendet, für +3 Stunden zwei etc. Irgendwann basiert die Prognose nur noch auf vorhergesagten Daten und bald einmal auf vorhergesagten Daten, die auf vorhergesagten Daten basieren etc. Daher wird mit fortschreitender Prognosedauer der Fehler immer grösser.\\ \\ ++ | - Vergleiche deine Antwort mit ++unserer Antwort|\\ \\ Für die Prognosezeit +1 Stunde verwendet das neuronale Netz nur gemessene (beobachtete) Daten. Für die Prognosezeit +2 Stunden wird bereits ein vorhergesagter Wert verwendet, für +3 Stunden zwei etc. Irgendwann basiert die Prognose nur noch auf vorhergesagten Daten und bald einmal auf vorhergesagten Daten, die auf vorhergesagten Daten basieren etc. Daher wird mit fortschreitender Prognosedauer der Fehler immer grösser.\\ \\ ++ |
{{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.1%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%20200%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%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%27tanh%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.sgd%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%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%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%22steelblue%22%2C%20%22limegreen%22%2C%20%22darkorange%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%09tfvis.show.modelSummary%28%7B%0A%09%09name%3A%20%27Neurales%20Netz%27%2C%0A%09%09tab%3A%20%27Modell%27%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%2Fcdn.jsdelivr.net%2Fnpm%2Fp5%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=500px#TimeseriesRaw}} | {{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.1%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%20200%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%27tanh%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.sgd%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#TimeseriesRaw}} |
| |
== ✍ Auftrag 1 – Teil 2 == | == ✍ Auftrag 1 – Teil 2 == |
- Ändere in der ersten Sektion im obigen Programmcode die Parameter ab und wiederhole das Training ein paar Male mit verschiedenen Einstellungen. Die Parameter sind die Folgenden: | - Ändere in der ersten Sektion im obigen Programmcode die Parameter ab und wiederhole das Training ein paar Male mit verschiedenen Einstellungen. Die Parameter sind die Folgenden: |
* ''TIMESERIES_FEATURES'': Bestimmt, wie viele vergangene Zeitpunkte als Eingangsgrössen verwendet werden. In den einleitenden Grafiken werden vier vergangene Zeitpunkte verwendet (die blauen Punkte). | * ''TIMESERIES_FEATURES'': Bestimmt, wie viele vergangene Zeitpunkte als Eingangsgrössen verwendet werden. In den einleitenden Grafiken werden vier vergangene Zeitpunkte verwendet (die dunkelblauen Punkte). |
* ''LERNRATE'': Legt fest, wie stark sich die Gewichte des neuronalen Netzes pro Schritt ändern dürfen. Ist der Wert zu hoch, springt der Fehler (loss) während des Trainings hin und her, ist der Wert zu tief, brauchst du viel Geduld…\\ ⚠️ Achtung! Bei einer viel zu hohen Lernrate kann es sogar sein, dass das neuronale Netz derart stark springt, dass die Zahlen grösser werden, als der Computer diese anzeigen kann. Dann wird keine grüne Linie gezeichnet und als Loss "NaN" (not a number) ausgegeben. Dann ist einfach eine kleinere Lernrate zu wählen. | * ''LERNRATE'': Legt fest, wie stark sich die Gewichte des neuronalen Netzes pro Schritt ändern dürfen. Ist der Wert zu hoch, springt der Fehler (loss) während des Trainings hin und her, ist der Wert zu tief, brauchst du viel Geduld…\\ ⚠️ Achtung! Bei einer viel zu hohen Lernrate kann es sogar sein, dass das neuronale Netz derart stark springt, dass die Zahlen grösser werden, als der Computer diese anzeigen kann. Dann wird keine grüne Linie gezeichnet und als Loss "NaN" (not a number) ausgegeben. Dann ist einfach eine kleinere Lernrate zu wählen. |
* ''ANZAHL_HIDDEN_NEURONS'': Bestimmt die Komplexität des neuronalen Netzes. Ist der Wert zu hoch, kann Overfitting auftreten (was für dieses Beispiel, weniger ein Problem darstellt), ist die Zahl zu klein, kann die Zeitreihe nicht genügend vorhergesagt werden. | * ''ANZAHL_HIDDEN_NEURONS'': Bestimmt die Komplexität des neuronalen Netzes. Ist der Wert zu hoch, kann Overfitting auftreten (was für dieses Beispiel, weniger ein Problem darstellt), ist die Zahl zu klein, kann die Zeitreihe nicht genügend vorhergesagt werden. |
* ''ANZAHL_EPOCHEN'': Legt die Anzahl der "Lerndurchgänge" fest. Je grösser dieser Wert ist, desto länger wird trainiert. | * ''ANZAHL_EPOCHEN'': Legt die Anzahl der "Lerndurchgänge" fest. Je grösser dieser Wert ist, desto länger wird trainiert. |
- Notiere, mit welchen Parametereinstellungen du den tiefsten MAE für die +72 Stundenprognose erzielen konntest. {{gem/plain?0=N4XyA#a71e8c87a540f361}} | - Notiere, mit welchen Parametereinstellungen du den tiefsten MAE für die +72 Stundenprognose erzielen konntest. {{gem/plain?0=N4XyA#fb283d4c707cb080}} |
</WRAP> | </WRAP> |
| |
🤔 Vermutlich waren deine Zeitreihenvorhersagen im vorangehenden Auftrag nicht ganz perfekt oder du musstest viele Eingangsgrössen (input features) verwenden. | 🤔 Vermutlich waren deine Zeitreihenvorhersagen im vorangehenden Auftrag nicht ganz perfekt oder du musstest viele Eingangsgrössen (input features) verwenden. |
| |
⚠️ Für die Wahl der **Eingangsgrössen** ist es immer eine Gute Idee **Fachwissen**, d.h. Wissen über die zu vorhersagende Grösse zu berücksichtigen. Interessant ist, dass sich die Zeitreihe alle 24 Stunden wiederholt. | ⚠️ Für die Wahl der **Eingangsgrössen** ist es immer eine gute Idee, **Fachwissen**, d.h. Wissen über die zu vorhersagende Grösse, zu berücksichtigen. Interessant ist, dass sich die Zeitreihe alle 24 Stunden wiederholt. |
| |
💡 Also bauen wir die Tagesstunde 0 - 23 als zusätzliche Eingangsgrösse mit ein (24 Uhr wäre ja wieder 0 Uhr). | 💡 Also bauen wir die Tagesstunde 0 - 23 als zusätzliche Eingangsgrösse mit ein (24 Uhr wäre ja wieder 0 Uhr). |
- Verglichen mit dem MAE in "Auftrag 1 - Teil 1" ist das Resultat besser oder schlechter?{{gem/plain?0=N4XyA#21a4e7574c0199e5}} | - Verglichen mit dem MAE in "Auftrag 1 - Teil 1" ist das Resultat besser oder schlechter?{{gem/plain?0=N4XyA#21a4e7574c0199e5}} |
- Wenn du das Programm mehrfach startest, sind die Resultate in etwa gleich gut oder stellst du grössere Unterschiede fest? | - Wenn du das Programm mehrfach startest, sind die Resultate in etwa gleich gut oder stellst du grössere Unterschiede fest? |
{{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.1%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%20200%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%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%2C%20hourArray%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%20%2B%201%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%09%2F%2F%20hour%20of%20%22actual%22%20time%20%28normalized%29%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%5D%20%3D%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%2012%20-%201%3B%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%20%2B%201%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%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.sgd%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%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%20update%20hour%20input%20feature%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%20update%20hour%20input%20feature%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%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%22steelblue%22%2C%20%22limegreen%22%2C%20%22darkorange%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%20%28TIMESERIES_FEATURES%20%2B%201%29%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%2C%20hourArray%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%09tfvis.show.modelSummary%28%7B%0A%09%09name%3A%20%27Neurales%20Netz%27%2C%0A%09%09tab%3A%20%27Modell%27%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%2Fcdn.jsdelivr.net%2Fnpm%2Fp5%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=500px#TimeseriesHour}} | {{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.1%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%20200%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%2C%20hourArray%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%20%2B%201%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%09%2F%2F%20hour%20of%20%22actual%22%20time%20%28normalized%29%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%5D%20%3D%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%2012%20-%201%3B%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%20%2B%201%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%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.sgd%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%20update%20hour%20input%20feature%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%20update%20hour%20input%20feature%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%20%28TIMESERIES_FEATURES%20%2B%201%29%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%2C%20hourArray%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#TimeseriesHour}} |
</WRAP> | </WRAP> |
===== - Dem neuronalen Netzwerk helfen ===== | ===== - Dem neuronalen Netzwerk helfen ===== |
⚠️ 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&334|Blau: Tagesstunde((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | [{{::p:pasted:time1a.png?nolink|Dunkelblau: Tagesstunde((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] |
| |
\\ 🤔 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?nolink&334|Blau: Tagesstunde; Orange: Sinus der Tagesstunde; Grau: Cosinus der Tagesstunde((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}] | [{{::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]])) }}] |
| |
\\ 💡 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. |
<WRAP center round box > | <WRAP center round box > |
== ✍ Auftrag 3 == | == ✍ Auftrag 3 == |
Neben den "timeseries features" werden hier zusätzlich Sinus und Cosinus der Tagesstunde verwendet. Bei der Wahl ''TIMESERIES_FEATURES = 12'' besitzt das neuronale Netz somit 14 Eingangsgrössen. | Neben vergangenen Werten der Zeitreihe werden hier zusätzlich Sinus und Cosinus der Tagesstunde verwendet. Bei der Wahl ''TIMESERIES_FEATURES = 12'' besitzt das neuronale Netz somit 14 Eingangsgrössen. |
- Starte das Programm. Ist das Resultat nun besser oder schlechter in den vorangehenden Aufträgen? {{gem/plain?0=N4XyA#d94fcc4114ff694a}} | - Starte das Programm. Ist das Resultat nun besser oder schlechter in den vorangehenden Aufträgen? {{gem/plain?0=N4XyA#d94fcc4114ff694a}} |
- Spiele mit den Parametern etwas herum. Mit wie weinigen ''TIMESERIES_FEATURES'' bekommst du eine MAE für die +72 Stundenprognose von weniger als 0.1 hin? Halte die MAE zusammen mit deiner neuronalen Netz Einstellung im Textfeld fest. {{gem/plain?0=N4XyA#344040d14bb98ac5}} | - Spiele mit den Parametern etwas herum. Mit wie weinigen ''TIMESERIES_FEATURES'' bekommst du eine MAE für die +72 Stundenprognose von weniger als 0.1 hin? Halte die MAE zusammen mit deiner neuronalen Netz Einstellung im Textfeld fest. {{gem/plain?0=N4XyA#344040d14bb98ac5}} |
{{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.1%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%20200%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%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%2C%20hourArray%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%20%2B%202%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%09%2F%2F%20sin%2C%20cos%20of%20%22actual%22%20time%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%5D%20%3D%20Math.sin%282%20%2a%20Math.PI%20%2a%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%20hourArray.length%29%3B%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20Math.cos%282%20%2a%20Math.PI%20%2a%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%20hourArray.length%29%3B%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%20%2B%202%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%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.sgd%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%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%20update%20cos%20%2F%20sin%20of%20hour%20input%20feature%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%202%5D%3B%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%20sum%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%20update%20cos%20%2F%20sin%20of%20hour%20input%20feature%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%202%5D%3B%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%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%22steelblue%22%2C%20%22limegreen%22%2C%20%22darkorange%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%20%28TIMESERIES_FEATURES%20%2B%202%29%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%2C%20hourArray%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%09tfvis.show.modelSummary%28%7B%0A%09%09name%3A%20%27Neurales%20Netz%27%2C%0A%09%09tab%3A%20%27Modell%27%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%2Fcdn.jsdelivr.net%2Fnpm%2Fp5%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=500px#TimeseriesSinCosHour}} | {{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.1%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%20200%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%2C%20hourArray%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%20%2B%202%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%09%2F%2F%20sin%2C%20cos%20of%20%22actual%22%20time%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%5D%20%3D%20Math.sin%282%20%2a%20Math.PI%20%2a%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%20hourArray.length%29%3B%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20Math.cos%282%20%2a%20Math.PI%20%2a%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%20hourArray.length%29%3B%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%20%2B%202%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%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.sgd%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%20update%20cos%20%2F%20sin%20of%20hour%20input%20feature%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%202%5D%3B%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%20sum%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%20update%20cos%20%2F%20sin%20of%20hour%20input%20feature%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%202%5D%3B%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%22steelblue%22%2C%20%22limegreen%22%2C%20%22darkorange%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%20%28TIMESERIES_FEATURES%20%2B%202%29%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%2C%20hourArray%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#TimeseriesSinCosHour}} |
</WRAP> | </WRAP> |
| |
<WRAP center round box > | <WRAP center round box > |
== ✍ Auftrag 4 == | == ✍ Auftrag 4 == |
In der Defaulteinstellung nutzt das neuronale Netz nur ein einziges timeseries feature sowie Cosinus und Sinus der Tagesstunde, d.h. nur 3 Eingangsgrössen. | In der Defaulteinstellung nutzt das neuronale Netz nur einen einzigen vergangenen Wert der Zeitreihe sowie Cosinus und Sinus der Tagesstunde, d.h. nur 3 Eingangsgrössen. |
- Starte das Programm zwei oder dreimal. Ist das Resultat nun besser oder schlechter in den vorangehenden Aufträgen? Wie vergleicht sich das hier genutzte neuronale Netz mit den zuvor genutzten neuronalen Netzen? {{gem/plain?0=N4XyA#ab0d4297a1770c97}} | - Starte das Programm zwei oder dreimal. Ist das Resultat nun besser oder schlechter in den vorangehenden Aufträgen? Wie vergleicht sich das hier genutzte neuronale Netz mit den zuvor genutzten neuronalen Netzen? {{gem/plain?0=N4XyA#ab0d4297a1770c97}} |
{{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%201%3B%20%2F%2F%20ganzahliger%20Wert%20von%201%20bis%2024%0A%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%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%2C%20hourArray%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%20%2B%202%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%09%2F%2F%20sin%2C%20cos%20of%20%22actual%22%20time%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%5D%20%3D%20Math.sin%282%20%2a%20Math.PI%20%2a%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%20hourArray.length%29%3B%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20Math.cos%282%20%2a%20Math.PI%20%2a%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%20hourArray.length%29%3B%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%20%2B%202%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%28%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%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%20update%20cos%20%2F%20sin%20of%20hour%20input%20feature%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%202%5D%3B%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%20sum%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%20update%20cos%20%2F%20sin%20of%20hour%20input%20feature%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%202%5D%3B%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%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%22steelblue%22%2C%20%22limegreen%22%2C%20%22darkorange%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%20%28TIMESERIES_FEATURES%20%2B%202%29%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%20keine%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%2C%20hourArray%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%09tfvis.show.modelSummary%28%7B%0A%09%09name%3A%20%27Neurales%20Netz%27%2C%0A%09%09tab%3A%20%27Modell%27%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%2Fcdn.jsdelivr.net%2Fnpm%2Fp5%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=500px#ModernSinCos}} | {{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%201%3B%20%2F%2F%20ganzahliger%20Wert%20von%201%20bis%2024%0A%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%2C%20hourArray%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%20%2B%202%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%09%2F%2F%20sin%2C%20cos%20of%20%22actual%22%20time%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%5D%20%3D%20Math.sin%282%20%2a%20Math.PI%20%2a%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%20hourArray.length%29%3B%0A%09%09inputArray%5Bv%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20Math.cos%282%20%2a%20Math.PI%20%2a%20hourArray%5B%28v%20%2B%20TIMESERIES_FEATURES%20-%201%29%20%25%20hourArray.length%5D%20%2F%20hourArray.length%29%3B%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%20%2B%202%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%28%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%20update%20cos%20%2F%20sin%20of%20hour%20input%20feature%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%202%5D%3B%0A%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%20sum%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%20update%20cos%20%2F%20sin%20of%20hour%20input%20feature%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%202%5D%3B%0A%09%09%09inputSample%5B0%5D%5BTIMESERIES_FEATURES%20%2B%201%5D%20%3D%20inputArray%5B%28inputArray.length%20-%20TIMESERIES_FEATURES%20%2B%20s%20%2B%20t%20%2B%201%29%20%25%20inputArray.length%5D%5BinputArray%5B0%5D.length%20-%201%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%20%28TIMESERIES_FEATURES%20%2B%202%29%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%20keine%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%2C%20hourArray%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#ModernSinCos}} |
</WRAP> | </WRAP> |
| |
<WRAP center round box> | <WRAP center round box> |
== Auftrag 5 == | == Auftrag 5 == |
Das neuronale Netz verwendet ausschliesslich timeseries features als Eingangsgrössen. Obwohl der verwendete Lernalgorithmus ohne Lernrate auskommt, kann dieser optional mit einer Lernrate "getuned" werden. | Das neuronale Netz verwendet ausschliesslich vergangene Werte der Zeitreihe als Eingangsgrössen. Obwohl der verwendete Lernalgorithmus ohne Lernrate auskommt, kann dieser in diesem Auftrag zusätzlich mit einer Lernrate "getuned" werden. |
- 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%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%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%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%22steelblue%22%2C%20%22limegreen%22%2C%20%22darkorange%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%09tfvis.show.modelSummary%28%7B%0A%09%09name%3A%20%27Neurales%20Netz%27%2C%0A%09%09tab%3A%20%27Modell%27%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%2Fcdn.jsdelivr.net%2Fnpm%2Fp5%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=500px#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}} |