Navigation: [[:p:ki:timeseries1|đ Teil 1]] - [[:p:ki:timeseries2|đ Teil 2]] {{gem/mgr}}{{ gem/pageinfo}}
====== đ Zeitreihenvorhersage mit TensorFlow 2 ======
đŻ In dieser Reihe erfĂ€hrst du, wie du mit neuronalen Netzen Zeitreihen vorhersagen kannst und erhĂ€ltst Einblicke in das Programmierer-Framework "TensorFlow".
â©ïž ZurĂŒck zum [[:p:ki:timeseries1|ersten Teil]].
~~INTOC~~
===== - Was ist TensorFlow? =====
[[wpde>KĂŒnstliche_Intelligenz]] in der Form von [[wpde>Neuronales_Netz|neuronalen Netzen]] wird in der Forschung und fĂŒr zahlreiche Anwendungen eingesetzt. Das Schreiben von Programmen zum Erstellen, Trainieren, Auswerten und Anwenden von neuronalen Netzen ist aufwĂ€ndig.
Damit nicht alle "das Rad neu erfinden" mĂŒssen, gibt es mehrere Sammlungen von ProgrammcodestĂŒcken (sogenannte [[wpde>Framework|Frameworks]]) fĂŒr neuronale Netze, die als [[wpde>Open_Source]] gekennzeichnet sind, d.h. frei genutzt werden können. Diese Open-Source-Frameworks werden von Freiwilligen (Community), Organisationen oder/und Firmen weiterentwickelt. Das vermutlich bekannteste und umfangreichste Neuronale-Netz-Framework ist [[wpde>TensorFlow]]. Z.B. nutzt Spotify TensorFlow, um Musikempfehlungen zusammenzustellen((Verschiedene Anwendungsbeispiele fĂŒr TensorFlow sind zu finden auf https://www.tensorflow.org/about/case-studies)).
Obwohl TensorFlow((TensorFlow-Webseite: https://www.tensorflow.org/ )) ursprĂŒnglich von Google fĂŒr die Programmiersprache [[wpde>Python_(Programmiersprache)|Python]] entwickelt wurde, ist TensorFlow mittlerweile fĂŒr mehrere Programmiersprachen verfĂŒgbar, unter anderem auch fĂŒr [[wpde>JavaScript]].
Obwohl TensorFlow viel Programmierarbeit abnimmt, ist die Nutzung immer noch aufwĂ€ndig und braucht viel Einarbeitungszeit. Das liegt daran, dass sich TensorFlow nur mit fortgeschrittenen JavaScript-Programmiertechniken und -konzepten nutzen lĂ€sst. Aus diesem Grund gibt es mittlerweile "Meta-Frameworks", welche den Gebrauch von TensorFlow vereinfachen, wie z.B. [[wpde>Keras]] fĂŒr Python oder [[https://ml5js.org/|ml5.js]] fĂŒr JavaScript.
Die Programme in diesen Kapiteln nutzen direkt TensorFlow fĂŒr JavaScript. Der Grund dafĂŒr liegt darin, dass das Meta-Framework ml5.js (im Gegensatz zu Keras) fĂŒr unsere Zwecke zu viele Einstellungen fĂŒr das Training von neuronalen Netzen vorgibt.
TensorFlow fĂŒr JavaScript wird als [[https://www.tensorflow.org/js|Tensorflow.js]] bezeichnet. Auf der [[https://www.tensorflow.org/js|Tensorflow.js]]-Webseite gibt es Tutorials, Demos und bereits fertig trainierte neuronale Netze, welche frei genutzt werden dĂŒrfen. Eine Auflistung und Beschreibung aller TensorFlow.js-Komponenten ist auf [[https://js.tensorflow.org/api/latest/|Tensorflow.js API]] zu finden.
===== - Herumexperimentieren mit TensorFlow.js =====
đĄ Da die Handhabung von TensorFlow.js relativ aufwĂ€ndig ist, wurden alle Programmteile, welche fĂŒr die Erstellung und das Training der neuronalen Netze relevant sind, in die "Parametersektion" ganz oben im Programmen verschoben. Somit musst du dich nicht vertieft mit den JavaScript-Konzepten von TensorFlow.js auseinandersetzen, sondern kannst dich auf die Möglichkeiten konzentrieren, welche TensorFlow.js dir bietet.
==== - Layer und Activation ====
[{{ :p:pasted:feedforward.png?300px|TensorFlow model mit layers und units((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])) }}]In TensorFlow wird ein neuronales Netz als **model** bezeichnet. TensorFlow nutzt per Default ein sogenanntes Feedforward Neural Network, welches aus mehreren **layers** (Schichten) aufgebaut ist. Jeder layer besteht aus mehreren **units** (Neuronen). Jeder unit besitzt eine **activation** (Aktivierungsfunktion).
Die beiden Sourcecode unten zeigen, wie in TensorFlow ein neuronales Netz aus mehren layer aufgebaut wird. Im Code links ist ein neuronales Netz mit nur einem Hidden Layer definiert, rechts ein neuronales Netz mit zwei Hidden Layers.
Jeder ''tf.layers.dense(...)'' Abschnitt stellt einen Hidden Layer dar. Der Input Layer wird gerade mit dem ersten Hidden Layer zusammen definiert durch die Zeile ''inputShape'', wobei in den ''['' '']''-Klammern die Anzahl der Eingangsgrössen (Input Neuronen) definiert wird (hier die Anzahl ''TIMESERIES_FEATURES'' plus Sinus und Cosinus der Tagesstunde). Das letzte ''tf.layers.dense(...)'' stellt den Output Layer dar. Alle weiteren Hidden Layer beinhalten keine ''inputShape''-Zeile, diese kommt **nur** im ersten Hidden Layer vor. Um einen Hidden Layer hinzuzufĂŒgen oder zu entfernen, wird einfach ein ''tf.layers.dense(...)'' Abschnitt hinzugefĂŒgt oder entfernt und der Name hinter ''name'' entsprechend angepasst.
^ "Einfaches" Modell ^ "Deep Learning" Modell ^
|
const MODEL_LAYERS = [
tf.layers.dense({
name: 'HiddenLayer1',
inputShape: [TIMESERIES_FEATURES + 2],
units: ANZAHL_HIDDEN_NEURONS,
activation: 'tanh'
}),
tf.layers.dense({
name: 'OutputLayer',
units: 1,
activation: 'linear'
})
];
|
const MODEL_LAYERS = [
tf.layers.dense({
name: 'HiddenLayer1',
inputShape: [TIMESERIES_FEATURES + 2],
units: ANZAHL_HIDDEN_NEURONS,
activation: 'relu'
}),
tf.layers.dense({
name: 'HiddenLayer2',
units: ANZAHL_HIDDEN_NEURONS,
activation: 'relu'
}),
tf.layers.dense({
name: 'OutputLayer',
units: 1,
activation: 'linear'
})
];
|
FĂŒr jeden Hidden und Output Layer können andere Aktivierungsfunktionen gewĂ€hlt werden. Die Aktivierungsfunktion wird nach ''activation'' eingetragen.
; Activation
: Die gÀngigen Aktivierungsfunktionen sind: ''elu'', ''hardSigmoid'', ''linear'', ''relu'', ''relu6'', ''selu'', ''sigmoid'', ''softmax'', ''softplus'', ''softsign'', ''tanh''. Sie sind auf [[https://polarisation.github.io/tfjs-activation-functions/|dieser Webseite]] beschrieben.
: Die "advanced" Aktivierungsfunktionen ''LeakyReLU'', ''PReLU'', ''ReLU'' sind in der [[https://js.tensorflow.org/api/latest/#Layers-Advanced%20Activation|Tensorflow.js API - Advanced Activation]] dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
== â Auftrag â Layer und Activation ==
- Starte das Programm so wie es ist (1 Hidden Layer mit 'tanh' activation). Ăndere die activation 'linear' im Output Layer nicht, diese activation erlaubt es beliebig grosse Zahlen vorherzusagen. Z.B. 'tanh' kann nur Zahlen im Bereich -1 und +1 produzieren.
- Verwende nun die 'relu' activation im Hidden Layer. Wie verÀndert sich das Resultat?
- FĂŒge einen zweiten Hidden Layer hinzu. Wie verĂ€ndert sich das Resultat?
- Spiele noch etwas mit verschiedenen Aktivierungsfunktionen und einem oder mehreren Hidden Layern herum.
- {{ gem/flag?label=Erledigt&icon=%E2%9C%8D#833e8f5bc5d2c9b6}}Wenn du dir nun zutraust, verschiedene Aktivierungsfunktionen und ein oder mehrere Hidden Layer einzustellen, dann bestÀtige mit "Erledigt" sonst hole Hilfe.
{{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%202%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%0A%2F%2F%20Fortgeschrittene%20Anpassungen%0A%0Aconst%20MODEL_LAYERS%20%3D%20%5B%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09inputShape%3A%20%5BTIMESERIES_FEATURES%20%2B%202%5D%2C%0A%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09activation%3A%20%27tanh%27%0A%09%7D%29%2C%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09units%3A%201%2C%0A%09%09activation%3A%20%27linear%27%0A%09%7D%29%0A%5D%3B%0A%0Aconst%20MODEL_COMPILE%20%3D%20%7B%0A%09optimizer%3A%20tf.train.sgd%28LERNRATE%29%2C%0A%09loss%3A%20tf.losses.meanSquaredError%0A%7D%3B%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%20MODEL_LAYERS%0A%09%7D%29%3B%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28MODEL_COMPILE%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%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%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%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%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#LayerUndActivation}}
==== - Optimizer und LOSS ====
FĂŒr das Training des neuronalen Netzes mĂŒssen der **optimizer** (Update- oder Lernalgorithmus) und der **loss** (Fehlerfunktion) festgelegt werden. Dies wird in TensorFlow im folgenden Code festgelegt.
const MODEL_COMPILE = {
optimizer: tf.train.sgd(LERNRATE),
loss: tf.losses.meanSquaredError
};
Nicht alle optimizer brauchen eine Lernrate. Z.B. kommt der aktuell sehr beliebte "adam" Algorithmus ohne Lernrate aus. Dieser kann mit ''optimizer: tf.train.adam()'' verwendet werden.
;Optimizer
:Die TensorFlow.js optimizer sind auf [[https://js.tensorflow.org/api/latest/#Training-Optimizers|TensorFlow.js API - Optimizers]] aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
;Loss
:Die TensorFlow.js loss Funktionen sind auf [[https://js.tensorflow.org/api/latest/#Training-Losses|TensorFlow.js API - Training Losses]] aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
== â Auftrag â Layer und Activation ==
- Starte das Programm so wie es ist.
- Verwende den "adam" optimizer: ''optimizer: tf.train.adam()''. Wie verÀndert sich das Resultat?
- Verwende den "huberLoss" loss: ''tf.losses.huberLoss''. Wie verÀndert sich das Resultat?
- Spiele noch etwas mit verschiedenen optimizern und loss herum\\ â ïž Nicht alle werden funktionieren - egal.
- {{ gem/flag?label=Erledigt&icon=%E2%9C%8D#c25cfb2422ad3a6a}}Wenn du dir nun zutraust, verschiedene optimizer und loss einzustellen, dann bestÀtige mit "Erledigt" sonst hole Hilfe.
{{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%202%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%0A%2F%2F%20Fortgeschrittene%20Anpassungen%0A%0Aconst%20MODEL_LAYERS%20%3D%20%5B%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09inputShape%3A%20%5BTIMESERIES_FEATURES%20%2B%202%5D%2C%0A%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09activation%3A%20%27tanh%27%0A%09%7D%29%2C%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09units%3A%201%2C%0A%09%09activation%3A%20%27linear%27%0A%09%7D%29%0A%5D%3B%0A%0Aconst%20MODEL_COMPILE%20%3D%20%7B%0A%09optimizer%3A%20tf.train.sgd%28LERNRATE%29%2C%0A%09loss%3A%20tf.losses.meanSquaredError%0A%7D%3B%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%20MODEL_LAYERS%0A%09%7D%29%3B%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28MODEL_COMPILE%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%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#OptimizierUndLoss}}
===== - Labor und Auftrag =====
; Activation
: Die gÀngigen Aktivierungsfunktionen sind: ''elu'', ''hardSigmoid'', ''linear'', ''relu'', ''relu6'', ''selu'', ''sigmoid'', ''softmax'', ''softplus'', ''softsign'', ''tanh''. Sie sind auf [[https://polarisation.github.io/tfjs-activation-functions/|dieser Webseite]] beschrieben.
: Die "advanced" Aktivierungsfunktionen ''LeakyReLU'', ''PReLU'', ''ReLU'' sind in der [[https://js.tensorflow.org/api/latest/#Layers-Advanced%20Activation|TensorFlow.js API - Advanced Activation]] dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
;Optimizer
: Die TensorFlow.js optimizer sind auf [[https://js.tensorflow.org/api/latest/#Training-Optimizers|TensorFlow.js API - Optimizers]] aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
;Loss
:Die TensorFlow.js loss Funktionen sind auf [[https://js.tensorflow.org/api/latest/#Training-Losses|TensorFlow.js API - Training Losses]] aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
== â Auftrag ==
đĄ Die beiden untenstehenden Programme sind zum Experimentieren gedacht. Das neuronale Netz im roten Bereich nutzt die Zeitreihe + Sinus und Cosinus der Tageszeit. Das neuronale Netz im gelben Bereich nutzt nur die Zeitreihe und stellt somit die grössere Herausforderung dar. Die folgenden AuftrĂ€ge können mit einem oder beiden Programmen durchgefĂŒhrt werden.
- Vergleiche die folgenden beiden AnsÀtze:
* "Traditioneller" Ansatz: Möglichst gutes Resultat mit möglichst wenig Hidden Neuronen erzielen (mit nur 1 Hidden Layer). HĂ€ufig werden fĂŒr diesen Ansatz genutzt: activation ''tanh'', optimizer ''tf.train.sgd(LERNRATE)'', loss ''tf.losses.meanSquaredError''.
* Moderner "Deep Learning" Ansatz: Mehr als ein Hidden Layer und genĂŒgend Hidden Neuronen verwenden. HĂ€ufig werden fĂŒr diesen Ansatz genutzt: activation ''relu'' (in allen Hidden Layern), optimizer ''tf.train.adam()'', loss ''tf.losses.meanSquaredError''.
- Spiele mit allen Möglichkeiten etwas herum (Anzahl Epochen, Anzahl Zeitreihenpunkte, Anzahl der Hidden Layer und Neuronen, Aktivierungsfunktionen, optimizer und allenfalls Lernrate, loss). Versuche mit möglichst wenigen ''TIMESERIES_FEATURES'' auszukommen. Halte fest, mit welchen Einstellungen du dein bestes Resultat erzielen konntest.{{gem/plain?0=N4XyA#03f3d10cb93a79f5}}
== Zeitreihe mit Sinus und Cosinus der Tagesstunde ==
{{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%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%20300%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0A%0A%0A%2F%2F%20Fortgeschrittene%20Anpassungen%0A%0Aconst%20MODEL_LAYERS%20%3D%20%5B%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09inputShape%3A%20%5BTIMESERIES_FEATURES%20%2B%202%5D%2C%0A%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09activation%3A%20%27relu%27%0A%09%7D%29%2C%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27HiddenLayer2%27%2C%0A%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09activation%3A%20%27relu%27%0A%09%7D%29%2C%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09units%3A%201%2C%0A%09%09activation%3A%20%27linear%27%0A%09%7D%29%0A%5D%3B%0A%0Aconst%20MODEL_COMPILE%20%3D%20%7B%0A%09optimizer%3A%20tf.train.adam%28%29%2C%0A%09loss%3A%20tf.losses.meanSquaredError%0A%7D%3B%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%20MODEL_LAYERS%0A%09%7D%29%3B%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28MODEL_COMPILE%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%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#LaborSinCos}}
== Nur Zeitreihe ==
{{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%20300%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0A%0A%0A%2F%2F%20Fortgeschrittene%20Anpassungen%0A%0Aconst%20MODEL_LAYERS%20%3D%20%5B%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09inputShape%3A%20%5BTIMESERIES_FEATURES%5D%2C%0A%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09activation%3A%20%27relu%27%0A%09%7D%29%2C%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27HiddenLayer2%27%2C%0A%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09activation%3A%20%27relu%27%0A%09%7D%29%2C%0A%09tf.layers.dense%28%7B%0A%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09units%3A%201%2C%0A%09%09activation%3A%20%27linear%27%0A%09%7D%29%0A%5D%3B%0A%0Aconst%20MODEL_COMPILE%20%3D%20%7B%0A%09optimizer%3A%20tf.train.adam%28%29%2C%0A%09loss%3A%20tf.losses.meanSquaredError%0A%7D%3B%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%20MODEL_LAYERS%0A%09%7D%29%3B%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28MODEL_COMPILE%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#LaborNoTime}}
=== Eigene Notizen ===
{{gem/quill#fdaa6e4b3e666625}}