Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
p:ki:seltene_ereignisse [2024/05/02 08:57] Tscherter Vincentp:ki:seltene_ereignisse [2026/03/29 11:40] (aktuell) Ralf Kretzschmar
Zeile 61: Zeile 61:
   - Schaue dir die Daten an. Inmitten von 45 grünen Kreisen (beobachtete normale Tage) befinden sich 5 rote Kreuze (beobachtete Stürme). Ein neuronales Netz wird so trainiert, dass es die 5 roten Kreuze erkennen (die Stürme vorhersagen) kann. Alle Eingaben (Pixel in der linken Grafik) für welche eine Sturmprognose ausgegeben wird, werden mit einer roten Hintergrundfarbe versehen. Alle Eingaben, für welche ein normaler Tag prognostiziert wird, werden mit einer grünen Hintergrundfarbe versehen.   - Schaue dir die Daten an. Inmitten von 45 grünen Kreisen (beobachtete normale Tage) befinden sich 5 rote Kreuze (beobachtete Stürme). Ein neuronales Netz wird so trainiert, dass es die 5 roten Kreuze erkennen (die Stürme vorhersagen) kann. Alle Eingaben (Pixel in der linken Grafik) für welche eine Sturmprognose ausgegeben wird, werden mit einer roten Hintergrundfarbe versehen. Alle Eingaben, für welche ein normaler Tag prognostiziert wird, werden mit einer grünen Hintergrundfarbe versehen.
   - Lass das Training weiter laufen. Das Training wird erst nach 10'000 Epochen (Durchgängen) beendet (ein Klick in die Grafik und ein Drücken der Taste ''ECS'' oder auch der Taste ''§'' beendet das Training sofort). Erfahrungsgemäss wird (wenn überhaupt) die rote Klasse erst nach ca. 7000 - 9000 Epochen erkannt, was einige Minuten dauern kann. Falls ein roter Bereich in der Grafik entsteht, so wird die seltene Klasse vorhergesagt. Falls bis zum Schluss kein roter Bereich entsteht, so starte das Training erneut. \\ 💡 Alles, was Rot unterlegt wird, wird vom neuronalen Netz als Sturm interpretiert. Wird ein rotes Kreuz rot unterlegt, so wurde das rote Kreuz Sturm korrekt vorhergesagt. Wird ein grüner Kreis rot unterlegt, so wurde für diesen Tag ein Fehlalarm ausgegeben.\\ ⚠️ Studiere während des Trainings die nachfolgende "Erklärung der Ausgabe des Programms".   - Lass das Training weiter laufen. Das Training wird erst nach 10'000 Epochen (Durchgängen) beendet (ein Klick in die Grafik und ein Drücken der Taste ''ECS'' oder auch der Taste ''§'' beendet das Training sofort). Erfahrungsgemäss wird (wenn überhaupt) die rote Klasse erst nach ca. 7000 - 9000 Epochen erkannt, was einige Minuten dauern kann. Falls ein roter Bereich in der Grafik entsteht, so wird die seltene Klasse vorhergesagt. Falls bis zum Schluss kein roter Bereich entsteht, so starte das Training erneut. \\ 💡 Alles, was Rot unterlegt wird, wird vom neuronalen Netz als Sturm interpretiert. Wird ein rotes Kreuz rot unterlegt, so wurde das rote Kreuz Sturm korrekt vorhergesagt. Wird ein grüner Kreis rot unterlegt, so wurde für diesen Tag ein Fehlalarm ausgegeben.\\ ⚠️ Studiere während des Trainings die nachfolgende "Erklärung der Ausgabe des Programms".
-{{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.%0Aconst%20LERNRATE%20%3D%201%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%205%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%2010000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20500%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20constants%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20240%3B%0Aconst%20GRAPH_SIZE%20%3D%20Math.round%2810.0%20%2a%20DATA_WINDOW_SIZE%20%2F%2012.0%29%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B9.5%2C%205.0%5D%2C%0A%09%5B8.5%2C%204.0%5D%2C%0A%09%5B5.0%2C%205.5%5D%2C%0A%09%5B1.0%2C%205.0%5D%2C%0A%09%5B5.0%2C%203.5%5D%2C%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B5.0%2C%204.0%5D%2C%0A%09%5B5.0%2C%202.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B5.0%2C%206.5%5D%2C%0A%09%5B7.0%2C%204.5%5D%2C%0A%09%5B4.5%2C%207.0%5D%2C%0A%09%5B3.0%2C%201.5%5D%2C%0A%09%5B3.5%2C%207.5%5D%2C%0A%09%5B5.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%203.0%5D%2C%0A%09%5B4.0%2C%206.5%5D%2C%0A%09%5B5.5%2C%205.0%5D%2C%0A%09%5B7.0%2C%200.5%5D%2C%0A%09%5B5.5%2C%204.5%5D%2C%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B6.5%2C%204.0%5D%2C%0A%09%5B8.0%2C%204.0%5D%2C%0A%09%5B8.0%2C%203.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.5%2C%205.5%5D%2C%0A%09%5B3.5%2C%202.5%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B7.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%204.0%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B8.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%206.5%5D%2C%0A%09%5B3.5%2C%205.5%5D%2C%0A%09%5B3.5%2C%204.5%5D%2C%0A%09%5B6.0%2C%205.5%5D%2C%0A%09%5B2.0%2C%206.0%5D%2C%0A%09%5B2.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%202.0%5D%2C%0A%09%5B8.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%208.0%5D%2C%0A%09%5B3.0%2C%201.0%5D%2C%0A%09%5B5.5%2C%205.0%5D%2C%0A%09%5B2.0%2C%204.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%5D%3B%0A%0A%2F%2F%20data%20normalization%20range%0Aconst%20trainInputMax%20%3D%20%5B10.0%2C%2010.0%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B0.0%2C%200.0%5D%3B%0A%0A%2F%2F%20further%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20trainingSampleBuffer%2C%20inputFeatureSpaceBuffer%2C%20rocVaules%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%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%20generate%20data%20tensors%0A%2F%2F%0Afunction%20generateTensors%28%29%20%7B%0A%09let%20normalizedTrainInputArray%20%3D%20%5B%5D%3B%0A%09let%20normalizedTestInputArray%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20normalize%20training%20and%20validation%20inputs%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20trainInputArray.length%3B%20i%2B%2B%29%20%7B%0A%09%09normalizedTrainInputArray.push%28%5B%28trainInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28trainInputArray%5Bi%5D%5B1%5D%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09trainInput%20%3D%20tf.tensor2d%28normalizedTrainInputArray%2C%20%5BnormalizedTrainInputArray.length%2C%202%5D%29%3B%0A%09trainOutput%20%3D%20tf.tensor2d%28trainOutputArray%2C%20%5BtrainOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20trainOutput%20%3D%20tf.oneHot%28tf.tensor1d%28trainOutputArray%29.toInt%28%29%2C%202%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09normalizedTestInputArray.push%28%5B%28i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09testInput%20%3D%20tf.tensor2d%28normalizedTestInputArray%2C%20%5BnormalizedTestInputArray.length%2C%202%5D%29%3B%0A%09%2F%2F%09testInput.print%28%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20build%20neural%20network%20model%20and%20define%20training%20functions%0A%2F%2F%0Afunction%20compileModel%28%29%20%7B%0A%09%2F%2F%20neural%20network%20structure%0A%09model%20%3D%20tf.sequential%28%7B%0A%09%09layers%3A%20%5B%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09%09%09inputShape%3A%20%5B2%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09%09%09units%3A%201%2C%0A%09%09%09%09activation%3A%20%27sigmoid%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.sgd%28LERNRATE%29%2C%0A%09%09loss%3A%20tf.losses.meanSquaredError%2C%0A%09%09metrics%3A%20%5B%27mse%27%5D%2C%0A%09%7D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20train%20neural%20network%0A%2F%2F%0Aasync%20function%20trainModel%28%29%20%7B%0A%09await%20model.fit%28%0A%09%09trainInput%2C%20trainOutput%2C%20%7B%0A%09%09%09epochs%3A%20ANZAHL_EPOCHEN%2C%0A%09%09%09shuffle%3A%20true%2C%0A%09%09%09callbacks%3A%20%5B%7B%0A%09%09%09%09onEpochEnd%3A%20async%20%28epoch%2C%20logs%29%20%3D%3E%20%7B%0A%09%09%09%09%09%2F%2F%20remember%20epoch%20number%20if%20interrupted%0A%09%09%09%09%09actualEpoch%20%3D%20epoch%20%2B%201%3B%0A%09%09%09%09%09actualLogs%20%3D%20logs%3B%0A%09%09%09%09%09%2F%2F%20initiate%20graphic%20update%0A%09%09%09%09%09if%20%28%28%28actualEpoch%29%20%25%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%3D%3D%200%29%20%7C%7C%20%28epoch%20%3D%3D%3D%200%29%29%20%7B%0A%09%09%09%09%09%09drawPrediction%28%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%20%5D%0A%09%09%7D%0A%09%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20roc%20parameters%0A%2F%2F%0Afunction%20calculateROC%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09let%20threshold%20%3D%200.5%3B%0A%0A%09%2F%2F%20count%20contingency%20table%20entries%0A%09let%20contingencyA%20%3D%200%3B%20%2F%2F%20observed%20AND%20predicted%0A%09let%20contingencyB%20%3D%200%3B%20%2F%2F%20not%20observed%20AND%20predicted%0A%09let%20contingencyC%20%3D%200%3B%20%2F%2F%20observed%20AND%20not%20predicted%0A%09let%20observed%2C%20predicted%3B%0A%09let%20hit%20%3D%200.0%2C%0A%09%09far%20%3D%200.0%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09observed%20%3D%20trueOutput%5Bi%5D%3B%0A%09%09predicted%20%3D%20predictedOutput%5Bi%5D%3B%0A%0A%09%09if%20%28observed%20%3E%20threshold%20%26%26%20predicted%20%3E%20threshold%29%20%7B%0A%09%09%09contingencyA%20%2B%3D%201%3B%0A%09%09%7D%0A%09%09if%20%28observed%20%3C%3D%20threshold%20%26%26%20predicted%20%3E%20threshold%29%20%7B%0A%09%09%09contingencyB%20%2B%3D%201%3B%0A%09%09%7D%0A%09%09if%20%28observed%20%3E%20threshold%20%26%26%20predicted%20%3C%3D%20threshold%29%20%7B%0A%09%09%09contingencyC%20%2B%3D%201%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20hit%20and%20far%0A%0A%09if%20%28contingencyA%20%2B%20contingencyC%20%3E%200%29%20%7B%0A%09%09hit%20%3D%20Math.round%28contingencyA%20%2F%20%28contingencyA%20%2B%20contingencyC%29%20%2a%20100%29%3B%0A%09%7D%20else%20%7B%0A%09%09hit%20%3D%20%22Kann%20nicht%20berechnet%20werden%2C%20da%20es%20keinen%20Messwert%20%3E%20%22%20%2B%20threshold%20%2B%20%22%20im%20Datenset%20gibt%21%22%3B%0A%09%7D%0A%09if%20%28contingencyA%20%2B%20contingencyB%20%3E%200%29%20%7B%0A%09%09far%20%3D%20Math.round%28contingencyB%20%2F%20%28contingencyA%20%2B%20contingencyB%29%20%2a%20100%29%3B%0A%09%7D%20else%20%7B%0A%09%09far%20%3D%200.0%3B%0A%09%7D%0A%0A%09%2F%2F%20return%20everything%0A%09return%20%7B%0A%09%09thresh%3A%20threshold%2C%0A%09%09hit%3A%20hit%2C%0A%09%09far%3A%20far%0A%09%7D%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%20decision%20boundary%2C%20roc%20curve%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28%29%20%7B%0A%09%2F%2F%20make%20predictions%20with%20neural%20network%0A%09let%20training%20%3D%20model.predict%28trainInput%29.arraySync%28%29%3B%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20calculate%20roc%0A%09rocVaules%20%3D%20calculateROC%28training%2C%20trainOutputArray%29%3B%0A%0A%09%2F%2F%20shift%20of%20graph%20with%20respect%20to%20windows%20size%0A%09let%20shift%20%3D%20Math.round%28%28DATA_WINDOW_SIZE%20-%20GRAPH_SIZE%29%20%2F%202.0%29%3B%0A%0A%09%2F%2F%20draw%20input%20feature%20space%20window%0A%09inputFeatureSpaceBuffer.noStroke%28%29%3B%0A%09let%20element%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09%2F%2F%20transform%20neural%20network%20output%20into%20a%20color%0A%09%09%09if%20%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28255%2C%20Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%2C%20Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%29%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%2C%20255%2C%20Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%29%3B%0A%09%09%09%7D%0A%09%09%09%2F%2F%20check%20for%20decision%20boundary%20and%20alter%20color%0A%09%09%09if%20%28%28element%20%25%20%28NUM_DATA_PIXEL%20%2B%201%29%29%20%21%3D%3D%200%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09if%20%28element%20%3E%3D%20NUM_DATA_PIXEL%20%2B%201%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09inputFeatureSpaceBuffer.rect%28DATA_SCALE%20%2a%20i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%29%20-%20PIXEL_SIZE%20%2F%202%2C%20PIXEL_SIZE%2C%20PIXEL_SIZE%29%3B%0A%09%09%09element%20%3D%20element%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20add%20training%20information%0A%09inputFeatureSpaceBuffer.noStroke%28%29%3B%0A%09inputFeatureSpaceBuffer.fill%28%22black%22%29%3B%0A%09inputFeatureSpaceBuffer.textSize%28PIXEL_SIZE%20%2a%202.5%29%3B%0A%09inputFeatureSpaceBuffer.textAlign%28LEFT%2C%20TOP%29%3B%0A%09inputFeatureSpaceBuffer.text%28%22Epoche%3A%20%22%20%2B%20actualEpoch%2C%20shift%20%2F%202%2C%20shift%20%2F%202%29%3B%0A%09inputFeatureSpaceBuffer.textAlign%28RIGHT%2C%20TOP%29%3B%0A%09inputFeatureSpaceBuffer.text%28%22MSE%3A%20%22%20%2B%20actualLogs.loss.toFixed%286%29%2C%20DATA_WINDOW_SIZE%20-%20shift%20%2F%202%2C%20shift%20%2F%202%29%3B%0A%0A%09%2F%2F%20draw%20input%20feature%20space%20with%20samples%0A%09image%28inputFeatureSpaceBuffer%2C%200%2C%200%29%3B%0A%09image%28trainingSampleBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20print%20training%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20actualEpoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20actualLogs.loss.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20rocVaules.hit.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20rocVaules.far.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%20%2F%202%20-%200.5%29%3B%0A%09%2F%2F%20draw%20all%20blue%20circles%20first%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%200%29%20%7B%0A%09%09%09%2F%2F%20blue%20circle%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22green%22%29%3B%0A%09%09%09buffer.circle%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%2C%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%09%2F%2F%20draw%20green%20crosses%20last%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%2F%2F%20green%20crosses%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkred%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20print%20final%20results%20to%20console%0A%2F%2F%0Afunction%20printFinalResults%28%29%20%7B%0A%09console.log%28%22%22%29%3B%0A%09console.log%28%22Final%20Results%22%29%3B%0A%09console.log%28%22Epochs%3A%20%22%20%2B%20actualEpoch%20%2B%20%22%2C%20MSE%3A%20%22%20%2B%20actualLogs.loss.toFixed%286%29%29%3B%0A%09console.log%28%22%7C%7C%20Threshold%20%7C%20%20%20HR%20%7C%20%20%20FR%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%22%20%2B%20rocVaules.thresh.toFixed%281%29%20%2B%20%22%20%7C%20%22%20%2B%20rocVaules.hit.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20rocVaules.far.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%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%20p5.js%20setup%28%29%0A%2F%2F%0Aasync%20function%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20console%20output%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20%20%20%20%20%20MSE%20%7C%7C%20%20HIT%20%7C%20%20FAR%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainingSampleBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09inputFeatureSpaceBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20initial%20training%20buffer%0A%09drawDataInBuffer%28trainInputArray%2C%20trainOutputArray%2C%20trainingSampleBuffer%29%3B%0A%09image%28trainingSampleBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20data%20preprocessing%0A%09generateTensors%28%29%3B%0A%0A%09%2F%2F%20define%20model%20and%20training%0A%09compileModel%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09printFinalResults%28%29%3B%0A%7D%0A%0A%0A%20%2F%2F%0A%20%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20%3D%20emergency%20stop%0A%20%2F%2F%20and%20keyPressed%28%29%20%C2%A7%20%3D%20emergency%20stop%0A%20%2F%2F%0A%20function%20logKey%28e%29%20%7B%0A%20%09if%20%28e.key%20%3D%3D%3D%20%22Escape%22%20%7C%7C%20e.key%20%3D%3D%3D%20%22%C2%A7%22%29%20%7B%0A%20%09%09%2F%2F%20initiate%20stop%20of%20training%20after%20next%20epoch%0A%20%09%09model.stopTraining%20%3D%20true%3B%0A%20%09%7D%0A%20%7D&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&autorun=off&height=500px#imbalancedClasses1}}+{{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.%0Aconst%20LERNRATE%20%3D%201%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%205%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%2010000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20500%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20constants%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20240%3B%0Aconst%20GRAPH_SIZE%20%3D%20Math.round%2810.0%20%2a%20DATA_WINDOW_SIZE%20%2F%2012.0%29%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B9.5%2C%205.0%5D%2C%0A%09%5B8.5%2C%204.0%5D%2C%0A%09%5B5.0%2C%205.5%5D%2C%0A%09%5B1.0%2C%205.0%5D%2C%0A%09%5B5.0%2C%203.5%5D%2C%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B5.0%2C%204.0%5D%2C%0A%09%5B5.0%2C%202.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B5.0%2C%206.5%5D%2C%0A%09%5B7.0%2C%204.5%5D%2C%0A%09%5B4.5%2C%207.0%5D%2C%0A%09%5B3.0%2C%201.5%5D%2C%0A%09%5B3.5%2C%207.5%5D%2C%0A%09%5B5.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%203.0%5D%2C%0A%09%5B4.0%2C%206.5%5D%2C%0A%09%5B5.5%2C%205.0%5D%2C%0A%09%5B7.0%2C%200.5%5D%2C%0A%09%5B5.5%2C%204.5%5D%2C%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B6.5%2C%204.0%5D%2C%0A%09%5B8.0%2C%204.0%5D%2C%0A%09%5B8.0%2C%203.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.5%2C%205.5%5D%2C%0A%09%5B3.5%2C%202.5%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B7.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%204.0%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B8.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%206.5%5D%2C%0A%09%5B3.5%2C%205.5%5D%2C%0A%09%5B3.5%2C%204.5%5D%2C%0A%09%5B6.0%2C%205.5%5D%2C%0A%09%5B2.0%2C%206.0%5D%2C%0A%09%5B2.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%202.0%5D%2C%0A%09%5B8.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%208.0%5D%2C%0A%09%5B3.0%2C%201.0%5D%2C%0A%09%5B5.5%2C%205.0%5D%2C%0A%09%5B2.0%2C%204.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%5D%3B%0A%0A%2F%2F%20data%20normalization%20range%0Aconst%20trainInputMax%20%3D%20%5B10.0%2C%2010.0%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B0.0%2C%200.0%5D%3B%0A%0A%2F%2F%20further%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20trainingSampleBuffer%2C%20inputFeatureSpaceBuffer%2C%20rocVaules%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%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%20generate%20data%20tensors%0A%2F%2F%0Afunction%20generateTensors%28%29%20%7B%0A%09let%20normalizedTrainInputArray%20%3D%20%5B%5D%3B%0A%09let%20normalizedTestInputArray%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20normalize%20training%20and%20validation%20inputs%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20trainInputArray.length%3B%20i%2B%2B%29%20%7B%0A%09%09normalizedTrainInputArray.push%28%5B%28trainInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28trainInputArray%5Bi%5D%5B1%5D%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09trainInput%20%3D%20tf.tensor2d%28normalizedTrainInputArray%2C%20%5BnormalizedTrainInputArray.length%2C%202%5D%29%3B%0A%09trainOutput%20%3D%20tf.tensor2d%28trainOutputArray%2C%20%5BtrainOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20trainOutput%20%3D%20tf.oneHot%28tf.tensor1d%28trainOutputArray%29.toInt%28%29%2C%202%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09normalizedTestInputArray.push%28%5B%28i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09testInput%20%3D%20tf.tensor2d%28normalizedTestInputArray%2C%20%5BnormalizedTestInputArray.length%2C%202%5D%29%3B%0A%09%2F%2F%09testInput.print%28%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20build%20neural%20network%20model%20and%20define%20training%20functions%0A%2F%2F%0Afunction%20compileModel%28%29%20%7B%0A%09%2F%2F%20neural%20network%20structure%0A%09model%20%3D%20tf.sequential%28%7B%0A%09%09layers%3A%20%5B%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09%09%09inputShape%3A%20%5B2%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09%09%09units%3A%201%2C%0A%09%09%09%09activation%3A%20%27sigmoid%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.sgd%28LERNRATE%29%2C%0A%09%09loss%3A%20tf.losses.meanSquaredError%2C%0A%09%09metrics%3A%20%5B%27mse%27%5D%2C%0A%09%7D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20train%20neural%20network%0A%2F%2F%0Aasync%20function%20trainModel%28%29%20%7B%0A%09await%20model.fit%28%0A%09%09trainInput%2C%20trainOutput%2C%20%7B%0A%09%09%09epochs%3A%20ANZAHL_EPOCHEN%2C%0A%09%09%09shuffle%3A%20true%2C%0A%09%09%09callbacks%3A%20%5B%7B%0A%09%09%09%09onEpochEnd%3A%20async%20%28epoch%2C%20logs%29%20%3D%3E%20%7B%0A%09%09%09%09%09%2F%2F%20remember%20epoch%20number%20if%20interrupted%0A%09%09%09%09%09actualEpoch%20%3D%20epoch%20%2B%201%3B%0A%09%09%09%09%09actualLogs%20%3D%20logs%3B%0A%09%09%09%09%09%2F%2F%20initiate%20graphic%20update%0A%09%09%09%09%09if%20%28%28%28actualEpoch%29%20%25%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%3D%3D%200%29%20%7C%7C%20%28epoch%20%3D%3D%3D%200%29%29%20%7B%0A%09%09%09%09%09%09drawPrediction%28%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%20%5D%0A%09%09%7D%0A%09%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20roc%20parameters%0A%2F%2F%0Afunction%20calculateROC%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09let%20threshold%20%3D%200.5%3B%0A%0A%09%2F%2F%20count%20contingency%20table%20entries%0A%09let%20contingencyA%20%3D%200%3B%20%2F%2F%20observed%20AND%20predicted%0A%09let%20contingencyB%20%3D%200%3B%20%2F%2F%20not%20observed%20AND%20predicted%0A%09let%20contingencyC%20%3D%200%3B%20%2F%2F%20observed%20AND%20not%20predicted%0A%09let%20observed%2C%20predicted%3B%0A%09let%20hit%20%3D%200.0%2C%0A%09%09far%20%3D%200.0%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09observed%20%3D%20trueOutput%5Bi%5D%3B%0A%09%09predicted%20%3D%20predictedOutput%5Bi%5D%3B%0A%0A%09%09if%20%28observed%20%3E%20threshold%20%26%26%20predicted%20%3E%20threshold%29%20%7B%0A%09%09%09contingencyA%20%2B%3D%201%3B%0A%09%09%7D%0A%09%09if%20%28observed%20%3C%3D%20threshold%20%26%26%20predicted%20%3E%20threshold%29%20%7B%0A%09%09%09contingencyB%20%2B%3D%201%3B%0A%09%09%7D%0A%09%09if%20%28observed%20%3E%20threshold%20%26%26%20predicted%20%3C%3D%20threshold%29%20%7B%0A%09%09%09contingencyC%20%2B%3D%201%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20hit%20and%20far%0A%0A%09if%20%28contingencyA%20%2B%20contingencyC%20%3E%200%29%20%7B%0A%09%09hit%20%3D%20Math.round%28contingencyA%20%2F%20%28contingencyA%20%2B%20contingencyC%29%20%2a%20100%29%3B%0A%09%7D%20else%20%7B%0A%09%09hit%20%3D%20%22Kann%20nicht%20berechnet%20werden%2C%20da%20es%20keinen%20Messwert%20%3E%20%22%20%2B%20threshold%20%2B%20%22%20im%20Datenset%20gibt%21%22%3B%0A%09%7D%0A%09if%20%28contingencyA%20%2B%20contingencyB%20%3E%200%29%20%7B%0A%09%09far%20%3D%20Math.round%28contingencyB%20%2F%20%28contingencyA%20%2B%20contingencyB%29%20%2a%20100%29%3B%0A%09%7D%20else%20%7B%0A%09%09far%20%3D%200.0%3B%0A%09%7D%0A%0A%09%2F%2F%20return%20everything%0A%09return%20%7B%0A%09%09thresh%3A%20threshold%2C%0A%09%09hit%3A%20hit%2C%0A%09%09far%3A%20far%0A%09%7D%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%20decision%20boundary%2C%20roc%20curve%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28%29%20%7B%0A%09%2F%2F%20make%20predictions%20with%20neural%20network%0A%09let%20training%20%3D%20model.predict%28trainInput%29.arraySync%28%29%3B%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20calculate%20roc%0A%09rocVaules%20%3D%20calculateROC%28training%2C%20trainOutputArray%29%3B%0A%0A%09%2F%2F%20shift%20of%20graph%20with%20respect%20to%20windows%20size%0A%09let%20shift%20%3D%20Math.round%28%28DATA_WINDOW_SIZE%20-%20GRAPH_SIZE%29%20%2F%202.0%29%3B%0A%0A%09%2F%2F%20draw%20input%20feature%20space%20window%0A%09inputFeatureSpaceBuffer.noStroke%28%29%3B%0A%09let%20element%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09%2F%2F%20transform%20neural%20network%20output%20into%20a%20color%0A%09%09%09if%20%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28255%2C%20Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%2C%20Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%29%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%2C%20255%2C%20Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%29%3B%0A%09%09%09%7D%0A%09%09%09%2F%2F%20check%20for%20decision%20boundary%20and%20alter%20color%0A%09%09%09if%20%28%28element%20%25%20%28NUM_DATA_PIXEL%20%2B%201%29%29%20%21%3D%3D%200%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09if%20%28element%20%3E%3D%20NUM_DATA_PIXEL%20%2B%201%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09inputFeatureSpaceBuffer.rect%28DATA_SCALE%20%2a%20i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%29%20-%20PIXEL_SIZE%20%2F%202%2C%20PIXEL_SIZE%2C%20PIXEL_SIZE%29%3B%0A%09%09%09element%20%3D%20element%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20add%20training%20information%0A%09inputFeatureSpaceBuffer.noStroke%28%29%3B%0A%09inputFeatureSpaceBuffer.fill%28%22black%22%29%3B%0A%09inputFeatureSpaceBuffer.textSize%28PIXEL_SIZE%20%2a%202.5%29%3B%0A%09inputFeatureSpaceBuffer.textAlign%28LEFT%2C%20TOP%29%3B%0A%09inputFeatureSpaceBuffer.text%28%22Epoche%3A%20%22%20%2B%20actualEpoch%2C%20shift%20%2F%202%2C%20shift%20%2F%202%29%3B%0A%09inputFeatureSpaceBuffer.textAlign%28RIGHT%2C%20TOP%29%3B%0A%09inputFeatureSpaceBuffer.text%28%22MSE%3A%20%22%20%2B%20actualLogs.loss.toFixed%286%29%2C%20DATA_WINDOW_SIZE%20-%20shift%20%2F%202%2C%20shift%20%2F%202%29%3B%0A%0A%09%2F%2F%20draw%20input%20feature%20space%20with%20samples%0A%09image%28inputFeatureSpaceBuffer%2C%200%2C%200%29%3B%0A%09image%28trainingSampleBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20print%20training%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20actualEpoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20actualLogs.loss.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20rocVaules.hit.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20rocVaules.far.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%20%2F%202%20-%200.5%29%3B%0A%09%2F%2F%20draw%20all%20blue%20circles%20first%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%200%29%20%7B%0A%09%09%09%2F%2F%20blue%20circle%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22green%22%29%3B%0A%09%09%09buffer.circle%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%2C%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%09%2F%2F%20draw%20green%20crosses%20last%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%2F%2F%20green%20crosses%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkred%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20print%20final%20results%20to%20console%0A%2F%2F%0Afunction%20printFinalResults%28%29%20%7B%0A%09console.log%28%22%22%29%3B%0A%09console.log%28%22Final%20Results%22%29%3B%0A%09console.log%28%22Epochs%3A%20%22%20%2B%20actualEpoch%20%2B%20%22%2C%20MSE%3A%20%22%20%2B%20actualLogs.loss.toFixed%286%29%29%3B%0A%09console.log%28%22%7C%7C%20Grenzwert%20%7C%20%20%20HR%20%7C%20%20%20FR%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%22%20%2B%20rocVaules.thresh.toFixed%281%29%20%2B%20%22%20%7C%20%22%20%2B%20rocVaules.hit.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20rocVaules.far.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%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%20p5.js%20setup%28%29%0A%2F%2F%0Aasync%20function%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20console%20output%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20%20%20%20%20%20MSE%20%7C%7C%20%20HIT%20%7C%20%20FAR%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainingSampleBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09inputFeatureSpaceBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20initial%20training%20buffer%0A%09drawDataInBuffer%28trainInputArray%2C%20trainOutputArray%2C%20trainingSampleBuffer%29%3B%0A%09image%28trainingSampleBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20data%20preprocessing%0A%09generateTensors%28%29%3B%0A%0A%09%2F%2F%20define%20model%20and%20training%0A%09compileModel%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09printFinalResults%28%29%3B%0A%7D%0A%0A%0A%20%2F%2F%0A%20%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20%3D%20emergency%20stop%0A%20%2F%2F%20and%20keyPressed%28%29%20%C2%A7%20%3D%20emergency%20stop%0A%20%2F%2F%0A%20function%20logKey%28e%29%20%7B%0A%20%09if%20%28e.key%20%3D%3D%3D%20%22Escape%22%20%7C%7C%20e.key%20%3D%3D%3D%20%22%C2%A7%22%29%20%7B%0A%20%09%09%2F%2F%20initiate%20stop%20of%20training%20after%20next%20epoch%0A%20%09%09model.stopTraining%20%3D%20true%3B%0A%20%09%7D%0A%20%7D&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&autorun=off&height=500px#imbalancedClasses1}}
 </WRAP> </WRAP>
  
Zeile 67: Zeile 67:
  
   * Das neuronale Netz, das im Programm trainiert wird, besitzt zwei Input Neuronen, d.h. zwei Eingänge (die X- und Y-Koordinaten in der Grafik) und ein einziges Output Neuron, d.h. einen einzigen Ausgang.   * Das neuronale Netz, das im Programm trainiert wird, besitzt zwei Input Neuronen, d.h. zwei Eingänge (die X- und Y-Koordinaten in der Grafik) und ein einziges Output Neuron, d.h. einen einzigen Ausgang.
-  * Der Ausgang des neuronalen Netzs produziert Ausgangswerte zwischen 0 und 1. Die Desired Outputs für die rote Klasse (Sturm) sind ''1'' und für die grüne Klasse (normaler Tag) ''0''. Der Threshold für die Klassifikation ist ''0.5''. D.h. alle Ausgangswerte ''> 0.5'' werden als Stürme erkannt, alle Ausgangswerte ''≤ 0.5'' als normale Tage.+  * Der Ausgang des neuronalen Netzs produziert Ausgangswerte zwischen 0 und 1. Die Desired Outputs für die rote Klasse (Sturm) sind ''1'' und für die grüne Klasse (normaler Tag) ''0''. Der Grenzwert für die Klassifikation ist ''0.5''. D.h. alle Ausgangswerte ''> 0.5'' werden als Stürme erkannt, alle Ausgangswerte ''≤ 0.5'' als normale Tage.
   * In der Grafik und in der Console werden alle 500 Epochen der Trainingsfehler (Loss) ausgegeben. Zur Berechnung des Trainingsfehlers wird der sogennannte "Mean Squared Error (MSE)" verwendet. Je kleiner der Loss desto besser.   * In der Grafik und in der Console werden alle 500 Epochen der Trainingsfehler (Loss) ausgegeben. Zur Berechnung des Trainingsfehlers wird der sogennannte "Mean Squared Error (MSE)" verwendet. Je kleiner der Loss desto besser.
   * In der Console werden die Hit Rate (HIT) und False Alarm Raten (FAR) für die seltene Klasse (rote Kreuze, Stürme) ausgegeben.   * In der Console werden die Hit Rate (HIT) und False Alarm Raten (FAR) für die seltene Klasse (rote Kreuze, Stürme) ausgegeben.
Zeile 74: Zeile 74:
 == ✍ Auftrag – neuronales Netz auswerten == == ✍ Auftrag – neuronales Netz auswerten ==
   - Falls noch nicht gemacht, lies die obigen Erklärungen zur Ausgabe des neuronalen Netzes **sorgfältig** durch!   - Falls noch nicht gemacht, lies die obigen Erklärungen zur Ausgabe des neuronalen Netzes **sorgfältig** durch!
-  - Warte bis das Training beendet ist (und ein roter Bereich eingezeichnet wurde). Halte im Textfeld fest, nach wie vielen Epochen am Ende welcher MSE und welche HIT und FAR erzielt wurden.\\ 💡 Hier wird immer der Threshold 0.5 für alle Experimente verwendet. In der nächsten Übung wirst du auch mit anderen Thresholds experimentieren.+  - Warte bis das Training beendet ist (und ein roter Bereich eingezeichnet wurde). Halte im Textfeld fest, nach wie vielen Epochen am Ende welcher MSE und welche HIT und FAR erzielt wurden.\\ 💡 Hier wird immer der Grenzwert 0.5 für alle Experimente verwendet. In der nächsten Übung wirst du auch mit anderen Grenzwerten experimentieren.
 {{gem/plain?0=N4IgLgpgHmIFwgKIAcD2BjAFhAdgAgLjwB0cBZAZUQJsJJwBVMAnCAZ01QBsATPI0gAkAkg1o0BOAGIBBAEri6IAL5A#b067e97f95ddad92}} {{gem/plain?0=N4IgLgpgHmIFwgKIAcD2BjAFhAdgAgLjwB0cBZAZUQJsJJwBVMAnCAZ01QBsATPI0gAkAkg1o0BOAGIBBAEri6IAL5A#b067e97f95ddad92}}
 </WRAP> </WRAP>
Zeile 82: Zeile 82:
 🤩 Kapitel für Schnelle oder Interessierte 🤩 Kapitel für Schnelle oder Interessierte
  
-💡 Für die bisherigen Betrachtungen hatten wir den Threshold ''0.5'' verwendet, um die häufige Klasse "normaler Tag" (Desired Output ''0'') von der seltenen Klasse "Sturmtag" (Desired Output ''1'') zu unterscheiden. Die Idee besteht nun darin, die seltene Klasse bereits anzuzeigen (d.h. eine Sturmwarnung auszugeben), wenn das neuronale Netz z.B. einen Ausgangswert ''> 0.1'' produziert. So erhalten wir ein "hypersensibles Netzwerk" für die seltene Klasse. Das erhöht in der Regel die Hit Rate, aber leider auch die False Alarm Rate.+💡 Für die bisherigen Betrachtungen hatten wir den Grenzwert ''0.5'' verwendet, um die häufige Klasse "normaler Tag" (Desired Output ''0'') von der seltenen Klasse "Sturmtag" (Desired Output ''1'') zu unterscheiden. Die Idee besteht nun darin, die seltene Klasse bereits anzuzeigen (d.h. eine Sturmwarnung auszugeben), wenn das neuronale Netz z.B. einen Ausgangswert ''> 0.1'' produziert. So erhalten wir ein "hypersensibles Netzwerk" für die seltene Klasse. Das erhöht in der Regel die Hit Rate, aber leider auch die False Alarm Rate.
  
 <WRAP center round box > <WRAP center round box >
 == ✍ Auftrag – Grenzen ausloten 1 == == ✍ Auftrag – Grenzen ausloten 1 ==
   - Lasse das nachfolgende Programm (mehrfach) laufen, bis die seltene Klasse erkannt wird.\\ ⚠️ Studiere während des Trainings die nachfolgende "Erklärung der Ausgabe des Programms".   - Lasse das nachfolgende Programm (mehrfach) laufen, bis die seltene Klasse erkannt wird.\\ ⚠️ Studiere während des Trainings die nachfolgende "Erklärung der Ausgabe des Programms".
-{{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.%0Aconst%20LERNRATE%20%3D%201%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%205%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%2010000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20500%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20constants%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20240%3B%0Aconst%20GRAPH_SIZE%20%3D%20Math.round%2810.0%20%2a%20DATA_WINDOW_SIZE%20%2F%2012.0%29%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B9.5%2C%205.0%5D%2C%0A%09%5B8.5%2C%204.0%5D%2C%0A%09%5B5.0%2C%205.5%5D%2C%0A%09%5B1.0%2C%205.0%5D%2C%0A%09%5B5.0%2C%203.5%5D%2C%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B5.0%2C%204.0%5D%2C%0A%09%5B5.0%2C%202.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B5.0%2C%206.5%5D%2C%0A%09%5B7.0%2C%204.5%5D%2C%0A%09%5B4.5%2C%207.0%5D%2C%0A%09%5B3.0%2C%201.5%5D%2C%0A%09%5B3.5%2C%207.5%5D%2C%0A%09%5B5.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%203.0%5D%2C%0A%09%5B4.0%2C%206.5%5D%2C%0A%09%5B5.5%2C%205.0%5D%2C%0A%09%5B7.0%2C%200.5%5D%2C%0A%09%5B5.5%2C%204.5%5D%2C%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B6.5%2C%204.0%5D%2C%0A%09%5B8.0%2C%204.0%5D%2C%0A%09%5B8.0%2C%203.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.5%2C%205.5%5D%2C%0A%09%5B3.5%2C%202.5%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B7.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%204.0%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B8.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%206.5%5D%2C%0A%09%5B3.5%2C%205.5%5D%2C%0A%09%5B3.5%2C%204.5%5D%2C%0A%09%5B6.0%2C%205.5%5D%2C%0A%09%5B2.0%2C%206.0%5D%2C%0A%09%5B2.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%202.0%5D%2C%0A%09%5B8.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%208.0%5D%2C%0A%09%5B3.0%2C%201.0%5D%2C%0A%09%5B5.5%2C%205.0%5D%2C%0A%09%5B2.0%2C%204.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%5D%3B%0A%0A%2F%2F%20data%20normalization%20range%0Aconst%20trainInputMax%20%3D%20%5B10.0%2C%2010.0%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B0.0%2C%200.0%5D%3B%0A%0A%2F%2F%20further%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20trainingSampleBuffer%2C%20inputFeatureSpaceBuffer%2C%20rocBuffer%2C%20rocVaules%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%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%20generate%20data%20tensors%0A%2F%2F%0Afunction%20generateTensors%28%29%20%7B%0A%09let%20normalizedTrainInputArray%20%3D%20%5B%5D%3B%0A%09let%20normalizedTestInputArray%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20normalize%20training%20and%20validation%20inputs%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20trainInputArray.length%3B%20i%2B%2B%29%20%7B%0A%09%09normalizedTrainInputArray.push%28%5B%28trainInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28trainInputArray%5Bi%5D%5B1%5D%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09trainInput%20%3D%20tf.tensor2d%28normalizedTrainInputArray%2C%20%5BnormalizedTrainInputArray.length%2C%202%5D%29%3B%0A%09trainOutput%20%3D%20tf.tensor2d%28trainOutputArray%2C%20%5BtrainOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20trainOutput%20%3D%20tf.oneHot%28tf.tensor1d%28trainOutputArray%29.toInt%28%29%2C%202%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09normalizedTestInputArray.push%28%5B%28i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09testInput%20%3D%20tf.tensor2d%28normalizedTestInputArray%2C%20%5BnormalizedTestInputArray.length%2C%202%5D%29%3B%0A%09%2F%2F%09testInput.print%28%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20build%20neural%20network%20model%20and%20define%20training%20functions%0A%2F%2F%0Afunction%20compileModel%28%29%20%7B%0A%09%2F%2F%20neural%20network%20structure%0A%09model%20%3D%20tf.sequential%28%7B%0A%09%09layers%3A%20%5B%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09%09%09inputShape%3A%20%5B2%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09%09%09units%3A%201%2C%0A%09%09%09%09activation%3A%20%27sigmoid%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.sgd%28LERNRATE%29%2C%0A%09%09loss%3A%20tf.losses.meanSquaredError%2C%0A%09%09metrics%3A%20%5B%27mse%27%5D%2C%0A%09%7D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20train%20neural%20network%0A%2F%2F%0Aasync%20function%20trainModel%28%29%20%7B%0A%09await%20model.fit%28%0A%09%09trainInput%2C%20trainOutput%2C%20%7B%0A%09%09%09epochs%3A%20ANZAHL_EPOCHEN%2C%0A%09%09%09shuffle%3A%20true%2C%0A%09%09%09callbacks%3A%20%5B%7B%0A%09%09%09%09onEpochEnd%3A%20async%20%28epoch%2C%20logs%29%20%3D%3E%20%7B%0A%09%09%09%09%09%2F%2F%20remember%20epoch%20number%20if%20interrupted%0A%09%09%09%09%09actualEpoch%20%3D%20epoch%20%2B%201%3B%0A%09%09%09%09%09actualLogs%20%3D%20logs%3B%0A%09%09%09%09%09%2F%2F%20initiate%20graphic%20update%0A%09%09%09%09%09if%20%28%28%28actualEpoch%29%20%25%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%3D%3D%200%29%20%7C%7C%20%28epoch%20%3D%3D%3D%200%29%29%20%7B%0A%09%09%09%09%09%09drawPrediction%28%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%20%5D%0A%09%09%7D%0A%09%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20roc%20parameters%0A%2F%2F%0Afunction%20calculateROC%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09%2F%2F%20list%20of%20thresholds%20exept%200.0%20and%201.0%0A%09let%20threshold%20%3D%20%5B0.1%2C%200.2%2C%200.3%2C%200.4%2C%200.5%2C%200.6%2C%200.7%2C%200.8%2C%200.9%5D%3B%0A%0A%09%2F%2F%20count%20contingency%20table%20entries%0A%09let%20contingencyA%20%3D%20new%20Array%28threshold.length%29.fill%280%29%3B%20%2F%2F%20observed%20AND%20predicted%0A%09let%20contingencyB%20%3D%20new%20Array%28threshold.length%29.fill%280%29%3B%20%2F%2F%20not%20observed%20AND%20predicted%0A%09let%20contingencyC%20%3D%20new%20Array%28threshold.length%29.fill%280%29%3B%20%2F%2F%20observed%20AND%20not%20predicted%0A%09let%20observed%2C%20predicted%3B%0A%09let%20hit%20%3D%20%5B%5D%2C%0A%09%09far%20%3D%20%5B%5D%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09observed%20%3D%20trueOutput%5Bi%5D%3B%0A%09%09predicted%20%3D%20predictedOutput%5Bi%5D%3B%0A%0A%09%09for%20%28let%20t%20%3D%200%3B%20t%20%3C%20threshold.length%3B%20t%2B%2B%29%20%7B%0A%09%09%09if%20%28observed%20%3E%20threshold%5Bt%5D%20%26%26%20predicted%20%3E%20threshold%5Bt%5D%29%20%7B%0A%09%09%09%09contingencyA%5Bt%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%09if%20%28observed%20%3C%3D%20threshold%5Bt%5D%20%26%26%20predicted%20%3E%20threshold%5Bt%5D%29%20%7B%0A%09%09%09%09contingencyB%5Bt%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%09if%20%28observed%20%3E%20threshold%5Bt%5D%20%26%26%20predicted%20%3C%3D%20threshold%5Bt%5D%29%20%7B%0A%09%09%09%09contingencyC%5Bt%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20hit%20and%20far%0A%09for%20%28let%20t%20%3D%200%3B%20t%20%3C%20threshold.length%3B%20t%2B%2B%29%20%7B%0A%0A%09%09if%20%28contingencyA%5Bt%5D%20%2B%20contingencyC%5Bt%5D%20%3E%200%29%20%7B%0A%09%09%09hit.push%28Math.round%28contingencyA%5Bt%5D%20%2F%20%28contingencyA%5Bt%5D%20%2B%20contingencyC%5Bt%5D%29%20%2a%20100%29%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09hit.push%28%22Kann%20nicht%20berechnet%20werden%2C%20da%20es%20keinen%20Messwert%20%3E%20%22%20%2B%20threshold%5Bt%5D%20%2B%20%22%20im%20Datenset%20gibt%21%22%29%3B%0A%09%09%7D%0A%09%09if%20%28contingencyA%5Bt%5D%20%2B%20contingencyB%5Bt%5D%20%3E%200%29%20%7B%0A%09%09%09far.push%28Math.round%28contingencyB%5Bt%5D%20%2F%20%28contingencyA%5Bt%5D%20%2B%20contingencyB%5Bt%5D%29%20%2a%20100%29%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09far.push%280%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20return%20everything%0A%09return%20%7B%0A%09%09thresh%3A%20threshold%2C%0A%09%09hit%3A%20hit%2C%0A%09%09far%3A%20far%0A%09%7D%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%20decision%20boundary%2C%20roc%20curve%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28%29%20%7B%0A%09%2F%2F%20make%20predictions%20with%20neural%20network%0A%09let%20training%20%3D%20model.predict%28trainInput%29.arraySync%28%29%3B%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20calculate%20roc%0A%09rocVaules%20%3D%20calculateROC%28training%2C%20trainOutputArray%29%3B%0A%0A%09%2F%2F%20shift%20of%20graph%20with%20respect%20to%20windows%20size%0A%09let%20shift%20%3D%20Math.round%28%28DATA_WINDOW_SIZE%20-%20GRAPH_SIZE%29%20%2F%202.0%29%3B%0A%0A%09%2F%2F%20draw%20input%20feature%20space%20window%0A%09inputFeatureSpaceBuffer.noStroke%28%29%3B%0A%09let%20element%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09%2F%2F%20transform%20neural%20network%20output%20into%20a%20color%0A%09%09%09if%20%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28255%2C%20Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%2C%20Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%29%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%2C%20255%2C%20Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%29%3B%0A%09%09%09%7D%0A%09%09%09%2F%2F%20check%20for%20decision%20boundary%20and%20alter%20color%0A%09%09%09if%20%28%28element%20%25%20%28NUM_DATA_PIXEL%20%2B%201%29%29%20%21%3D%3D%200%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09if%20%28element%20%3E%3D%20NUM_DATA_PIXEL%20%2B%201%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09inputFeatureSpaceBuffer.rect%28DATA_SCALE%20%2a%20i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%29%20-%20PIXEL_SIZE%20%2F%202%2C%20PIXEL_SIZE%2C%20PIXEL_SIZE%29%3B%0A%09%09%09element%20%3D%20element%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20add%20training%20information%0A%09inputFeatureSpaceBuffer.noStroke%28%29%3B%0A%09inputFeatureSpaceBuffer.fill%28%22black%22%29%3B%0A%09inputFeatureSpaceBuffer.textSize%28PIXEL_SIZE%20%2a%202.5%29%3B%0A%09inputFeatureSpaceBuffer.textAlign%28LEFT%2C%20TOP%29%3B%0A%09inputFeatureSpaceBuffer.text%28%22Epoche%3A%20%22%20%2B%20actualEpoch%2C%20shift%20%2F%202%2C%20shift%20%2F%202%29%3B%0A%09inputFeatureSpaceBuffer.textAlign%28RIGHT%2C%20TOP%29%3B%0A%09inputFeatureSpaceBuffer.text%28%22MSE%3A%20%22%20%2B%20actualLogs.loss.toFixed%286%29%2C%20DATA_WINDOW_SIZE%20-%20shift%20%2F%202%2C%20shift%20%2F%202%29%3B%0A%0A%09%2F%2F%20draw%20input%20feature%20space%20with%20samples%0A%09image%28inputFeatureSpaceBuffer%2C%200%2C%200%29%3B%0A%09image%28trainingSampleBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20roc%20buffer%0A%09rocBuffer.background%28%22white%22%29%3B%0A%0A%09%2F%2F%20draw%20roc%20frame%0A%09rocBuffer.stroke%28%22black%22%29%3B%0A%09rocBuffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09rocBuffer.noFill%28%29%3B%0A%09rocBuffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20create%20roc%20grid%0A%09rocBuffer.stroke%28%22lightgrey%22%29%3B%0A%09rocBuffer.strokeWeight%281%29%3B%0A%09for%20%28let%20g%20%3D%200%3B%20g%20%3C%3D%201.0%3B%20g%20%3D%20g%20%2B%200.1%29%20%7B%0A%09%09rocBuffer.line%28shift%20%2B%20g%20%2a%20GRAPH_SIZE%2C%20shift%2C%20shift%20%2B%20g%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%29%3B%0A%09%09rocBuffer.line%28shift%2C%20shift%20%2B%20g%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%2C%20shift%20%2B%20g%20%2a%20GRAPH_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20add%20roc%20lables%0A%09rocBuffer.noStroke%28%29%3B%0A%09rocBuffer.fill%28%22black%22%29%3B%0A%09rocBuffer.textSize%28PIXEL_SIZE%20%2a%201.75%29%3B%0A%09for%20%28let%20l%20%3D%200%3B%20l%20%3C%3D%201.0%3B%20l%20%3D%20l%20%2B%200.1%29%20%7B%0A%09%09rocBuffer.textAlign%28RIGHT%2C%20CENTER%29%3B%0A%09%09rocBuffer.text%28Math.round%28100%20-%20l%20%2a%20100%29%2C%20shift%20-%202%2C%20shift%20%2B%20l%20%2a%20GRAPH_SIZE%20%2B%201%29%3B%0A%09%09rocBuffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09%09rocBuffer.text%28Math.round%28l%20%2a%20100%29%2C%20shift%20%2B%20l%20%2a%20GRAPH_SIZE%2C%20DATA_WINDOW_SIZE%20-%20shift%20%2F%202%29%3B%0A%09%7D%0A%09rocBuffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09rocBuffer.text%28%22HR%22%2C%20shift%2C%20shift%20%2F%202%29%3B%0A%09rocBuffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09rocBuffer.text%28%22FR%22%2C%20DATA_WINDOW_SIZE%20-%20shift%20%2F%202%2C%20DATA_WINDOW_SIZE%20-%20shift%20-%201%29%3B%0A%0A%09%2F%2F%20draw%20roc%20graph%0A%09rocBuffer.stroke%28%22red%22%29%3B%0A%09rocBuffer.strokeWeight%281%29%3B%0A%09rocBuffer.fill%28%22red%22%29%3B%0A%09let%20oldX%20%3D%20100%3B%0A%09let%20oldY%20%3D%20100%3B%0A%09rocBuffer.circle%28shift%20%2B%20GRAPH_SIZE%2C%20shift%2C%203%29%3B%0A%09for%20%28let%20t%20%3D%200%3B%20t%20%3C%20rocVaules.thresh.length%3B%20t%2B%2B%29%20%7B%0A%09%09rocBuffer.line%28shift%20%2B%20oldX%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%20-%20oldY%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20rocVaules.far%5Bt%5D%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%20-%20rocVaules.hit%5Bt%5D%20%2F%20100%20%2a%20GRAPH_SIZE%29%3B%0A%09%09rocBuffer.circle%28shift%20%2B%20rocVaules.far%5Bt%5D%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%20-%20rocVaules.hit%5Bt%5D%20%2F%20100%20%2a%20GRAPH_SIZE%2C%203%29%3B%0A%09%09oldX%20%3D%20rocVaules.far%5Bt%5D%3B%0A%09%09oldY%20%3D%20rocVaules.hit%5Bt%5D%3B%0A%09%7D%0A%09rocBuffer.line%28shift%20%2B%20oldX%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%20-%20oldY%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%2C%20shift%20%2B%20GRAPH_SIZE%29%3B%0A%09rocBuffer.circle%28shift%2C%20shift%20%2B%20GRAPH_SIZE%2C%203%29%3B%0A%0A%09%2F%2F%20draw%20roc%20buffer%0A%09image%28rocBuffer%2C%20DATA_WINDOW_SIZE%20-%20PIXEL_SIZE%20%2F%202%2C%200%29%3B%0A%0A%09%2F%2F%20print%20training%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20actualEpoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20actualLogs.loss.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20rocVaules.hit%5B4%5D.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20rocVaules.far%5B4%5D.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%20%2F%202%20-%200.5%29%3B%0A%09%2F%2F%20draw%20all%20blue%20circles%20first%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%200%29%20%7B%0A%09%09%09%2F%2F%20blue%20circle%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22green%22%29%3B%0A%09%09%09buffer.circle%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%2C%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%09%2F%2F%20draw%20green%20crosses%20last%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%2F%2F%20green%20crosses%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkred%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20print%20final%20results%20to%20console%0A%2F%2F%0Afunction%20printFinalResults%28%29%20%7B%0A%09console.log%28%22%22%29%3B%0A%09console.log%28%22Final%20Results%22%29%3B%0A%09console.log%28%22Epochs%3A%20%22%20%2B%20actualEpoch%20%2B%20%22%2C%20MSE%3A%20%22%20%2B%20actualLogs.loss.toFixed%286%29%29%3B%0A%09console.log%28%22%7C%7C%20Threshold%20%7C%20%20%20HR%20%7C%20%20%20FR%20%7C%7C%22%29%3B%0A%09for%20%28let%20t%20%3D%200%3B%20t%20%3C%20rocVaules.thresh.length%3B%20t%2B%2B%29%20%7B%0A%09%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%22%20%2B%20rocVaules.thresh%5Bt%5D.toFixed%281%29%20%2B%20%22%20%7C%20%22%20%2B%20rocVaules.hit%5Bt%5D.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20rocVaules.far%5Bt%5D.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%29%3B%0A%09%7D%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%20p5.js%20setup%28%29%0A%2F%2F%0Aasync%20function%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20console%20output%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20%20%20%20%20%20MSE%20%7C%7C%20%20HIT%20%7C%20%20FAR%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_WINDOW_SIZE%29%3B%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainingSampleBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09inputFeatureSpaceBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09rocBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20initial%20training%20and%20validation%20buffer%0A%09drawDataInBuffer%28trainInputArray%2C%20trainOutputArray%2C%20trainingSampleBuffer%29%3B%0A%09image%28trainingSampleBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20data%20preprocessing%0A%09generateTensors%28%29%3B%0A%0A%09%2F%2F%20define%20model%20and%20training%0A%09compileModel%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09printFinalResults%28%29%3B%0A%7D%0A%0A%0A%20%2F%2F%0A%20%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20%3D%20emergency%20stop%0A%20%2F%2F%20and%20keyPressed%28%29%20%C2%A7%20%3D%20emergency%20stop%0A%20%2F%2F%0A%20function%20logKey%28e%29%20%7B%0A%20%09if%20%28e.key%20%3D%3D%3D%20%22Escape%22%20%7C%7C%20e.key%20%3D%3D%3D%20%22%C2%A7%22%29%20%7B%0A%20%09%09%2F%2F%20initiate%20stop%20of%20training%20after%20next%20epoch%0A%20%09%09model.stopTraining%20%3D%20true%3B%0A%20%09%7D%0A%20%7D&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&autorun=off&height=500px#imbalancedClasses2}}+{{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.%0Aconst%20LERNRATE%20%3D%201%3B%20%2F%2F%20Dezimalzahl%20%3E%200%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%205%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%2010000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20500%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20constants%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20240%3B%0Aconst%20GRAPH_SIZE%20%3D%20Math.round%2810.0%20%2a%20DATA_WINDOW_SIZE%20%2F%2012.0%29%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%2050%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B9.5%2C%205.0%5D%2C%0A%09%5B8.5%2C%204.0%5D%2C%0A%09%5B5.0%2C%205.5%5D%2C%0A%09%5B1.0%2C%205.0%5D%2C%0A%09%5B5.0%2C%203.5%5D%2C%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B5.0%2C%204.0%5D%2C%0A%09%5B5.0%2C%202.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B5.0%2C%206.5%5D%2C%0A%09%5B7.0%2C%204.5%5D%2C%0A%09%5B4.5%2C%207.0%5D%2C%0A%09%5B3.0%2C%201.5%5D%2C%0A%09%5B3.5%2C%207.5%5D%2C%0A%09%5B5.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%203.0%5D%2C%0A%09%5B4.0%2C%206.5%5D%2C%0A%09%5B5.5%2C%205.0%5D%2C%0A%09%5B7.0%2C%200.5%5D%2C%0A%09%5B5.5%2C%204.5%5D%2C%0A%09%5B5.0%2C%206.0%5D%2C%0A%09%5B6.5%2C%204.0%5D%2C%0A%09%5B8.0%2C%204.0%5D%2C%0A%09%5B8.0%2C%203.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.5%2C%205.5%5D%2C%0A%09%5B3.5%2C%202.5%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B7.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%204.0%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B8.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%206.5%5D%2C%0A%09%5B3.5%2C%205.5%5D%2C%0A%09%5B3.5%2C%204.5%5D%2C%0A%09%5B6.0%2C%205.5%5D%2C%0A%09%5B2.0%2C%206.0%5D%2C%0A%09%5B2.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%202.0%5D%2C%0A%09%5B8.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%208.0%5D%2C%0A%09%5B3.0%2C%201.0%5D%2C%0A%09%5B5.5%2C%205.0%5D%2C%0A%09%5B2.0%2C%204.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%200%2C%200%2C%201%2C%200%2C%200%2C%200%5D%3B%0A%0A%2F%2F%20data%20normalization%20range%0Aconst%20trainInputMax%20%3D%20%5B10.0%2C%2010.0%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B0.0%2C%200.0%5D%3B%0A%0A%2F%2F%20further%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20trainingSampleBuffer%2C%20inputFeatureSpaceBuffer%2C%20rocBuffer%2C%20rocVaules%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%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%20generate%20data%20tensors%0A%2F%2F%0Afunction%20generateTensors%28%29%20%7B%0A%09let%20normalizedTrainInputArray%20%3D%20%5B%5D%3B%0A%09let%20normalizedTestInputArray%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20normalize%20training%20and%20validation%20inputs%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20trainInputArray.length%3B%20i%2B%2B%29%20%7B%0A%09%09normalizedTrainInputArray.push%28%5B%28trainInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28trainInputArray%5Bi%5D%5B1%5D%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%7D%0A%0A%09%2F%2F%20generate%20training%20input%20and%20output%20tensors%0A%09trainInput%20%3D%20tf.tensor2d%28normalizedTrainInputArray%2C%20%5BnormalizedTrainInputArray.length%2C%202%5D%29%3B%0A%09trainOutput%20%3D%20tf.tensor2d%28trainOutputArray%2C%20%5BtrainOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20trainOutput%20%3D%20tf.oneHot%28tf.tensor1d%28trainOutputArray%29.toInt%28%29%2C%202%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09normalizedTestInputArray.push%28%5B%28i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20trainInputMin%5B1%5D%29%20%2F%20%28trainInputMax%5B1%5D%20-%20trainInputMin%5B1%5D%29%5D%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20generate%20testing%20input%20tensor%20for%20visualisation%0A%09testInput%20%3D%20tf.tensor2d%28normalizedTestInputArray%2C%20%5BnormalizedTestInputArray.length%2C%202%5D%29%3B%0A%09%2F%2F%09testInput.print%28%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20build%20neural%20network%20model%20and%20define%20training%20functions%0A%2F%2F%0Afunction%20compileModel%28%29%20%7B%0A%09%2F%2F%20neural%20network%20structure%0A%09model%20%3D%20tf.sequential%28%7B%0A%09%09layers%3A%20%5B%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27HiddenLayer1%27%2C%0A%09%09%09%09inputShape%3A%20%5B2%5D%2C%0A%09%09%09%09units%3A%20ANZAHL_HIDDEN_NEURONS%2C%0A%09%09%09%09activation%3A%20%27tanh%27%0A%09%09%09%7D%29%2C%0A%09%09%09tf.layers.dense%28%7B%0A%09%09%09%09name%3A%20%27OutputLayer%27%2C%0A%09%09%09%09units%3A%201%2C%0A%09%09%09%09activation%3A%20%27sigmoid%27%0A%09%09%09%7D%29%0A%09%09%5D%0A%09%7D%29%3B%0A%0A%09%2F%2F%20neural%20network%20training%0A%09model.compile%28%7B%0A%09%09optimizer%3A%20tf.train.sgd%28LERNRATE%29%2C%0A%09%09loss%3A%20tf.losses.meanSquaredError%2C%0A%09%09metrics%3A%20%5B%27mse%27%5D%2C%0A%09%7D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20train%20neural%20network%0A%2F%2F%0Aasync%20function%20trainModel%28%29%20%7B%0A%09await%20model.fit%28%0A%09%09trainInput%2C%20trainOutput%2C%20%7B%0A%09%09%09epochs%3A%20ANZAHL_EPOCHEN%2C%0A%09%09%09shuffle%3A%20true%2C%0A%09%09%09callbacks%3A%20%5B%7B%0A%09%09%09%09onEpochEnd%3A%20async%20%28epoch%2C%20logs%29%20%3D%3E%20%7B%0A%09%09%09%09%09%2F%2F%20remember%20epoch%20number%20if%20interrupted%0A%09%09%09%09%09actualEpoch%20%3D%20epoch%20%2B%201%3B%0A%09%09%09%09%09actualLogs%20%3D%20logs%3B%0A%09%09%09%09%09%2F%2F%20initiate%20graphic%20update%0A%09%09%09%09%09if%20%28%28%28actualEpoch%29%20%25%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%3D%3D%200%29%20%7C%7C%20%28epoch%20%3D%3D%3D%200%29%29%20%7B%0A%09%09%09%09%09%09drawPrediction%28%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%2C%20%5D%0A%09%09%7D%0A%09%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20roc%20parameters%0A%2F%2F%0Afunction%20calculateROC%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09%2F%2F%20list%20of%20thresholds%20exept%200.0%20and%201.0%0A%09let%20threshold%20%3D%20%5B0.1%2C%200.2%2C%200.3%2C%200.4%2C%200.5%2C%200.6%2C%200.7%2C%200.8%2C%200.9%5D%3B%0A%0A%09%2F%2F%20count%20contingency%20table%20entries%0A%09let%20contingencyA%20%3D%20new%20Array%28threshold.length%29.fill%280%29%3B%20%2F%2F%20observed%20AND%20predicted%0A%09let%20contingencyB%20%3D%20new%20Array%28threshold.length%29.fill%280%29%3B%20%2F%2F%20not%20observed%20AND%20predicted%0A%09let%20contingencyC%20%3D%20new%20Array%28threshold.length%29.fill%280%29%3B%20%2F%2F%20observed%20AND%20not%20predicted%0A%09let%20observed%2C%20predicted%3B%0A%09let%20hit%20%3D%20%5B%5D%2C%0A%09%09far%20%3D%20%5B%5D%3B%0A%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09observed%20%3D%20trueOutput%5Bi%5D%3B%0A%09%09predicted%20%3D%20predictedOutput%5Bi%5D%3B%0A%0A%09%09for%20%28let%20t%20%3D%200%3B%20t%20%3C%20threshold.length%3B%20t%2B%2B%29%20%7B%0A%09%09%09if%20%28observed%20%3E%20threshold%5Bt%5D%20%26%26%20predicted%20%3E%20threshold%5Bt%5D%29%20%7B%0A%09%09%09%09contingencyA%5Bt%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%09if%20%28observed%20%3C%3D%20threshold%5Bt%5D%20%26%26%20predicted%20%3E%20threshold%5Bt%5D%29%20%7B%0A%09%09%09%09contingencyB%5Bt%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%09if%20%28observed%20%3E%20threshold%5Bt%5D%20%26%26%20predicted%20%3C%3D%20threshold%5Bt%5D%29%20%7B%0A%09%09%09%09contingencyC%5Bt%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20hit%20and%20far%0A%09for%20%28let%20t%20%3D%200%3B%20t%20%3C%20threshold.length%3B%20t%2B%2B%29%20%7B%0A%0A%09%09if%20%28contingencyA%5Bt%5D%20%2B%20contingencyC%5Bt%5D%20%3E%200%29%20%7B%0A%09%09%09hit.push%28Math.round%28contingencyA%5Bt%5D%20%2F%20%28contingencyA%5Bt%5D%20%2B%20contingencyC%5Bt%5D%29%20%2a%20100%29%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09hit.push%28%22Kann%20nicht%20berechnet%20werden%2C%20da%20es%20keinen%20Messwert%20%3E%20%22%20%2B%20threshold%5Bt%5D%20%2B%20%22%20im%20Datenset%20gibt%21%22%29%3B%0A%09%09%7D%0A%09%09if%20%28contingencyA%5Bt%5D%20%2B%20contingencyB%5Bt%5D%20%3E%200%29%20%7B%0A%09%09%09far.push%28Math.round%28contingencyB%5Bt%5D%20%2F%20%28contingencyA%5Bt%5D%20%2B%20contingencyB%5Bt%5D%29%20%2a%20100%29%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09far.push%280%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20return%20everything%0A%09return%20%7B%0A%09%09thresh%3A%20threshold%2C%0A%09%09hit%3A%20hit%2C%0A%09%09far%3A%20far%0A%09%7D%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%20decision%20boundary%2C%20roc%20curve%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28%29%20%7B%0A%09%2F%2F%20make%20predictions%20with%20neural%20network%0A%09let%20training%20%3D%20model.predict%28trainInput%29.arraySync%28%29%3B%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20calculate%20roc%0A%09rocVaules%20%3D%20calculateROC%28training%2C%20trainOutputArray%29%3B%0A%0A%09%2F%2F%20shift%20of%20graph%20with%20respect%20to%20windows%20size%0A%09let%20shift%20%3D%20Math.round%28%28DATA_WINDOW_SIZE%20-%20GRAPH_SIZE%29%20%2F%202.0%29%3B%0A%0A%09%2F%2F%20draw%20input%20feature%20space%20window%0A%09inputFeatureSpaceBuffer.noStroke%28%29%3B%0A%09let%20element%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09for%20%28j%20%3D%200%3B%20j%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20j%20%3D%20j%20%2B%201%29%20%7B%0A%09%09%09%2F%2F%20transform%20neural%20network%20output%20into%20a%20color%0A%09%09%09if%20%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28255%2C%20Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%2C%20Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%29%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%2C%20255%2C%20Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%29%3B%0A%09%09%09%7D%0A%09%09%09%2F%2F%20check%20for%20decision%20boundary%20and%20alter%20color%0A%09%09%09if%20%28%28element%20%25%20%28NUM_DATA_PIXEL%20%2B%201%29%29%20%21%3D%3D%200%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%201%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09if%20%28element%20%3E%3D%20NUM_DATA_PIXEL%20%2B%201%20%26%26%20%28%28prediction%5Belement%5D%5B0%5D%20%3E%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3C%3D%200.5%29%20%7C%7C%20%28prediction%5Belement%5D%5B0%5D%20%3C%3D%200.5%20%26%26%20prediction%5Belement%20-%20%28NUM_DATA_PIXEL%20%2B%201%29%5D%5B0%5D%20%3E%200.5%29%29%29%20%7B%0A%09%09%09%09inputFeatureSpaceBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09inputFeatureSpaceBuffer.rect%28DATA_SCALE%20%2a%20i%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20j%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%29%20-%20PIXEL_SIZE%20%2F%202%2C%20PIXEL_SIZE%2C%20PIXEL_SIZE%29%3B%0A%09%09%09element%20%3D%20element%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20add%20training%20information%0A%09inputFeatureSpaceBuffer.noStroke%28%29%3B%0A%09inputFeatureSpaceBuffer.fill%28%22black%22%29%3B%0A%09inputFeatureSpaceBuffer.textSize%28PIXEL_SIZE%20%2a%202.5%29%3B%0A%09inputFeatureSpaceBuffer.textAlign%28LEFT%2C%20TOP%29%3B%0A%09inputFeatureSpaceBuffer.text%28%22Epoche%3A%20%22%20%2B%20actualEpoch%2C%20shift%20%2F%202%2C%20shift%20%2F%202%29%3B%0A%09inputFeatureSpaceBuffer.textAlign%28RIGHT%2C%20TOP%29%3B%0A%09inputFeatureSpaceBuffer.text%28%22MSE%3A%20%22%20%2B%20actualLogs.loss.toFixed%286%29%2C%20DATA_WINDOW_SIZE%20-%20shift%20%2F%202%2C%20shift%20%2F%202%29%3B%0A%0A%09%2F%2F%20draw%20input%20feature%20space%20with%20samples%0A%09image%28inputFeatureSpaceBuffer%2C%200%2C%200%29%3B%0A%09image%28trainingSampleBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20roc%20buffer%0A%09rocBuffer.background%28%22white%22%29%3B%0A%0A%09%2F%2F%20draw%20roc%20frame%0A%09rocBuffer.stroke%28%22black%22%29%3B%0A%09rocBuffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09rocBuffer.noFill%28%29%3B%0A%09rocBuffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20create%20roc%20grid%0A%09rocBuffer.stroke%28%22lightgrey%22%29%3B%0A%09rocBuffer.strokeWeight%281%29%3B%0A%09for%20%28let%20g%20%3D%200%3B%20g%20%3C%3D%201.0%3B%20g%20%3D%20g%20%2B%200.1%29%20%7B%0A%09%09rocBuffer.line%28shift%20%2B%20g%20%2a%20GRAPH_SIZE%2C%20shift%2C%20shift%20%2B%20g%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%29%3B%0A%09%09rocBuffer.line%28shift%2C%20shift%20%2B%20g%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%2C%20shift%20%2B%20g%20%2a%20GRAPH_SIZE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20add%20roc%20lables%0A%09rocBuffer.noStroke%28%29%3B%0A%09rocBuffer.fill%28%22black%22%29%3B%0A%09rocBuffer.textSize%28PIXEL_SIZE%20%2a%201.75%29%3B%0A%09for%20%28let%20l%20%3D%200%3B%20l%20%3C%3D%201.0%3B%20l%20%3D%20l%20%2B%200.1%29%20%7B%0A%09%09rocBuffer.textAlign%28RIGHT%2C%20CENTER%29%3B%0A%09%09rocBuffer.text%28Math.round%28100%20-%20l%20%2a%20100%29%2C%20shift%20-%202%2C%20shift%20%2B%20l%20%2a%20GRAPH_SIZE%20%2B%201%29%3B%0A%09%09rocBuffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09%09rocBuffer.text%28Math.round%28l%20%2a%20100%29%2C%20shift%20%2B%20l%20%2a%20GRAPH_SIZE%2C%20DATA_WINDOW_SIZE%20-%20shift%20%2F%202%29%3B%0A%09%7D%0A%09rocBuffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09rocBuffer.text%28%22HR%22%2C%20shift%2C%20shift%20%2F%202%29%3B%0A%09rocBuffer.textAlign%28CENTER%2C%20CENTER%29%3B%0A%09rocBuffer.text%28%22FR%22%2C%20DATA_WINDOW_SIZE%20-%20shift%20%2F%202%2C%20DATA_WINDOW_SIZE%20-%20shift%20-%201%29%3B%0A%0A%09%2F%2F%20draw%20roc%20graph%0A%09rocBuffer.stroke%28%22red%22%29%3B%0A%09rocBuffer.strokeWeight%281%29%3B%0A%09rocBuffer.fill%28%22red%22%29%3B%0A%09let%20oldX%20%3D%20100%3B%0A%09let%20oldY%20%3D%20100%3B%0A%09rocBuffer.circle%28shift%20%2B%20GRAPH_SIZE%2C%20shift%2C%203%29%3B%0A%09for%20%28let%20t%20%3D%200%3B%20t%20%3C%20rocVaules.thresh.length%3B%20t%2B%2B%29%20%7B%0A%09%09rocBuffer.line%28shift%20%2B%20oldX%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%20-%20oldY%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20rocVaules.far%5Bt%5D%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%20-%20rocVaules.hit%5Bt%5D%20%2F%20100%20%2a%20GRAPH_SIZE%29%3B%0A%09%09rocBuffer.circle%28shift%20%2B%20rocVaules.far%5Bt%5D%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%20-%20rocVaules.hit%5Bt%5D%20%2F%20100%20%2a%20GRAPH_SIZE%2C%203%29%3B%0A%09%09oldX%20%3D%20rocVaules.far%5Bt%5D%3B%0A%09%09oldY%20%3D%20rocVaules.hit%5Bt%5D%3B%0A%09%7D%0A%09rocBuffer.line%28shift%20%2B%20oldX%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%20%2B%20GRAPH_SIZE%20-%20oldY%20%2F%20100%20%2a%20GRAPH_SIZE%2C%20shift%2C%20shift%20%2B%20GRAPH_SIZE%29%3B%0A%09rocBuffer.circle%28shift%2C%20shift%20%2B%20GRAPH_SIZE%2C%203%29%3B%0A%0A%09%2F%2F%20draw%20roc%20buffer%0A%09image%28rocBuffer%2C%20DATA_WINDOW_SIZE%20-%20PIXEL_SIZE%20%2F%202%2C%200%29%3B%0A%0A%09%2F%2F%20print%20training%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20actualEpoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20actualLogs.loss.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20rocVaules.hit%5B4%5D.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20rocVaules.far%5B4%5D.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%20%2F%202%20-%200.5%29%3B%0A%09%2F%2F%20draw%20all%20blue%20circles%20first%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%200%29%20%7B%0A%09%09%09%2F%2F%20blue%20circle%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22green%22%29%3B%0A%09%09%09buffer.circle%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%2C%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%09%2F%2F%20draw%20green%20crosses%20last%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%2F%2F%20green%20crosses%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkred%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20print%20final%20results%20to%20console%0A%2F%2F%0Afunction%20printFinalResults%28%29%20%7B%0A%09console.log%28%22%22%29%3B%0A%09console.log%28%22Final%20Results%22%29%3B%0A%09console.log%28%22Epochs%3A%20%22%20%2B%20actualEpoch%20%2B%20%22%2C%20MSE%3A%20%22%20%2B%20actualLogs.loss.toFixed%286%29%29%3B%0A%09console.log%28%22%7C%7C%20Grenzwert%20%7C%20%20%20HR%20%7C%20%20%20FR%20%7C%7C%22%29%3B%0A%09for%20%28let%20t%20%3D%200%3B%20t%20%3C%20rocVaules.thresh.length%3B%20t%2B%2B%29%20%7B%0A%09%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%22%20%2B%20rocVaules.thresh%5Bt%5D.toFixed%281%29%20%2B%20%22%20%7C%20%22%20%2B%20rocVaules.hit%5Bt%5D.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20rocVaules.far%5Bt%5D.toString%28%29.padStart%283%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%7C%22%29%3B%0A%09%7D%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%20p5.js%20setup%28%29%0A%2F%2F%0Aasync%20function%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20console%20output%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20%20%20%20%20%20MSE%20%7C%7C%20%20HIT%20%7C%20%20FAR%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_WINDOW_SIZE%29%3B%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainingSampleBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09inputFeatureSpaceBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09rocBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20initial%20training%20and%20validation%20buffer%0A%09drawDataInBuffer%28trainInputArray%2C%20trainOutputArray%2C%20trainingSampleBuffer%29%3B%0A%09image%28trainingSampleBuffer%2C%200%2C%200%29%3B%0A%0A%09%2F%2F%20data%20preprocessing%0A%09generateTensors%28%29%3B%0A%0A%09%2F%2F%20define%20model%20and%20training%0A%09compileModel%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09await%20trainModel%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09printFinalResults%28%29%3B%0A%7D%0A%0A%0A%20%2F%2F%0A%20%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20%3D%20emergency%20stop%0A%20%2F%2F%20and%20keyPressed%28%29%20%C2%A7%20%3D%20emergency%20stop%0A%20%2F%2F%0A%20function%20logKey%28e%29%20%7B%0A%20%09if%20%28e.key%20%3D%3D%3D%20%22Escape%22%20%7C%7C%20e.key%20%3D%3D%3D%20%22%C2%A7%22%29%20%7B%0A%20%09%09%2F%2F%20initiate%20stop%20of%20training%20after%20next%20epoch%0A%20%09%09model.stopTraining%20%3D%20true%3B%0A%20%09%7D%0A%20%7D&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&autorun=off&height=500px#imbalancedClasses2}}
 </WRAP> </WRAP>
  
 💡 **Erklärung der Ausgabe des Programms** 💡 **Erklärung der Ausgabe des Programms**
  
-  * Wenn das Training beendet ist, wird ganz unten in der Console die Tabelle "Final Results" angezeigt. Dort sind für verschiedene Thresholds die Hit und False Alarm Raten angegeben. Z.B. der Threshold ''0.2'' bedeutet, dass alle Ausgangswerte ''> 0.2'' als Sturm angesehen werden; die HIT und FAR Werte in derselben Zeile geben an, wie gut die Sturmprognose mit dem Threshold ''0.2'' ist. Entsprechend sind alle Zeilen in dieser Tabelle zu interpretieren. +  * Wenn das Training beendet ist, wird ganz unten in der Console die Tabelle "Final Results" angezeigt. Dort sind für verschiedene Grenzwerte die Hit und False Alarm Raten angegeben. Z.B. der Grenzwert ''0.2'' bedeutet, dass alle Ausgangswerte ''> 0.2'' als Sturm angesehen werden; die HIT und FAR Werte in derselben Zeile geben an, wie gut die Sturmprognose mit dem Grenzwert ''0.2'' ist. Entsprechend sind alle Zeilen in dieser Tabelle zu interpretieren. 
-  * Das Liniendiagramm (Grafik rechts) ist eine Darstellung aller Zeilen in dieser Tabelle. Auf der horizontalen Achse sind die Hit Rate (HR) Werte und auf der vertikalen Achsen die False Alarm Rate (FR) Werte aller Thresholds eingetragen (die kleinen roten Punkte) und durch Geraden miteinander verbunden.+  * Das Liniendiagramm (Grafik rechts) ist eine Darstellung aller Zeilen in dieser Tabelle. Auf der horizontalen Achse sind die Hit Rate (HR) Werte und auf der vertikalen Achsen die False Alarm Rate (FR) Werte aller Grenzwerte eingetragen (die kleinen roten Punkte) und durch Geraden miteinander verbunden.
  
   ;Receiver Operator Curve (ROC)   ;Receiver Operator Curve (ROC)
-  :Das HIT-FAR-Diagramm in der Grafik rechts wird als Receiver Operator Curve (ROC) bezeichnet. Damit können die für den jeweiligen Einsatzzweck optimalen Hit und False Alarm Raten mit dem zugehörigen Threshold herausgelesen werden. +  :Das HIT-FAR-Diagramm in der Grafik rechts wird als Receiver Operator Curve (ROC) bezeichnet. Damit können die für den jeweiligen Einsatzzweck optimalen Hit und False Alarm Raten mit dem zugehörigen Grenzwert herausgelesen werden. 
  
 <WRAP center round box > <WRAP center round box >
Zeile 102: Zeile 102:
   - Starte das Training erneut. Breche das Training jedoch nach 3000 - 4000 Epochen ab. (Zum Abbrechen in die Grafik klicken und ''ESC'' drücken.) Vermutlich wird in der linken Grafik nur die grüne Klasse angezeigt, was hier aber gewollt ist!   - Starte das Training erneut. Breche das Training jedoch nach 3000 - 4000 Epochen ab. (Zum Abbrechen in die Grafik klicken und ''ESC'' drücken.) Vermutlich wird in der linken Grafik nur die grüne Klasse angezeigt, was hier aber gewollt ist!
   - Falls noch nicht gemacht, lies die obigen Erklärungen zur Ausgabe des neuronalen Netzes **sorgfältig** durch!   - Falls noch nicht gemacht, lies die obigen Erklärungen zur Ausgabe des neuronalen Netzes **sorgfältig** durch!
-  - Schaue dir die Tabelle am Ende der Consolen-Ausgabe genau an. Halte im Textfeld fest, welches der grösste Threshold ist, für welchen die rote Klasse (die Stürme) vorhergesagt wird (d.h. wo HIT und FAR nicht gleich 0% sind). Versuche auch den zugehörigen kleinen roten Punkt in der ROC (Liniengrafik) zu finden. {{gem/plain?0=N4IgLgpgHmIFwgCoAsBOEDOyD2AbAJnAAQA6AdgBICSiRd9x5AYgIIBK9DRIAvkA#ea4198502e91da18}} +  - Schaue dir die Tabelle am Ende der Consolen-Ausgabe genau an. Halte im Textfeld fest, welches der grösste Grenzwert ist, für welchen die rote Klasse (die Stürme) vorhergesagt wird (d.h. wo HIT und FAR nicht gleich 0% sind). Versuche auch den zugehörigen kleinen roten Punkt in der ROC (Liniengrafik) zu finden. {{gem/plain?0=N4IgLgpgHmIFwgCoAsBOEDOyD2AbAJnAAQA6AdgBICSiRd9x5AYgIIBK9DRIAvkA#ea4198502e91da18}} 
-  - Starte ein neues, vollständiges Training und beobachte, wie sich die ROC während des Trainings verändert. Halte am Ende des Trainings fest, für welchen Threshold gemäss ROC deiner Meinung nach das beste Resultat erzielt wird (das darf gerne subjektiv sein). {{gem/plain?0=N4IgLgpgHmIFwgCoAsBOEDOyD2AbAJnAAQA6AdgBICSiRd9x5AYgIIBK9DRIAvkA#d1fddef7d8f3c61e}}+  - Starte ein neues, vollständiges Training und beobachte, wie sich die ROC während des Trainings verändert. Halte am Ende des Trainings fest, für welchen Grenzwert gemäss ROC deiner Meinung nach das beste Resultat erzielt wird (das darf gerne subjektiv sein). {{gem/plain?0=N4IgLgpgHmIFwgCoAsBOEDOyD2AbAJnAAQA6AdgBICSiRd9x5AYgIIBK9DRIAvkA#d1fddef7d8f3c61e}}
   - Warum ist das perfekte Resultat: //Hit Rate 100% und False Alarm Rate 0%// für die hier verwendeten Daten nicht möglich? Halte deine Vermutung im Textfeld fest. {{gem/plain?0=N4XyA#8fa65a81026216af}}   - Warum ist das perfekte Resultat: //Hit Rate 100% und False Alarm Rate 0%// für die hier verwendeten Daten nicht möglich? Halte deine Vermutung im Textfeld fest. {{gem/plain?0=N4XyA#8fa65a81026216af}}
 </WRAP> </WRAP>