Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
NĂ€chste Überarbeitung
Vorhergehende Überarbeitung
p:ki:timeseries2 [2022/04/02 11:01] – [1. Was ist TensorFlow?] Ralf Kretzschmarp:ki:timeseries2 [2024/05/02 08:57] (aktuell) – Tscherter, Vincent
Zeile 1: Zeile 1:
 +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 ^
 +| <code javascript>
 +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'
 +  })
 +];
 +</code> |  <code javascript>
 +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'
 +  })
 +];
 +</code> |
 +
 +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).
 +
 +<WRAP center round box >
 +== ✍ 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}}
 +</WRAP>
 +
 +==== - 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.
 +
 +<code javascript>
 +const MODEL_COMPILE = {
 +  optimizer: tf.train.sgd(LERNRATE),
 +  loss: tf.losses.meanSquaredError
 +};
 +</code>
 +
 +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).
 +
 +<WRAP center round box >
 +== ✍ 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}}
 +</WRAP>
 +
 +===== - 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).
 +
 +<WRAP center round box >
 +== ✍ 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}}
 +</WRAP>
 +
 +<WRAP center round warning>
 +== 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}}
 +</WRAP>
 +
 +<WRAP center round caution>
 +== 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}}
 +</WRAP>
 +
 +=== Eigene Notizen ===
 +{{gem/quill#fdaa6e4b3e666625}}