Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
p:ki:seltene_ereignisse [2023/09/29 11:43] Tscherter, Vincentp:ki:seltene_ereignisse [2024/05/02 08:57] (aktuell) Tscherter, Vincent
Zeile 15: Zeile 15:
 💡 Für die folgenden Betrachtungen schauen wir 500 Tage an und gehen davon aus, dass sich 5 Sturmereignisse darin befinden (d.h. im Mittel 1 Sturmereignis alle 100 Tage). Uns interessieren die beiden Klassen "Sturmtag" und "Normaler Tag" 💡 Für die folgenden Betrachtungen schauen wir 500 Tage an und gehen davon aus, dass sich 5 Sturmereignisse darin befinden (d.h. im Mittel 1 Sturmereignis alle 100 Tage). Uns interessieren die beiden Klassen "Sturmtag" und "Normaler Tag"
  
-☹️ Die Klassifikationsrate beschreibt, wie viele Tage richtig klassifiziert werden. Ein Verfahren, dass nie einen Sturm voraussagt, hat in unserem Fall eine Klassifikationsrate von 99%, ist jedoch unbrauchbar. Somit eignet sich die Klassifikationsrate nicht dafür um festzustellen, wie gut seltene Ereignisse vorhergesagt werden.+🙁 Die Klassifikationsrate beschreibt, wie viele Tage richtig klassifiziert werden. Ein Verfahren, dass nie einen Sturm voraussagt, hat in unserem Fall eine Klassifikationsrate von 99%, ist jedoch unbrauchbar. Somit eignet sich die Klassifikationsrate nicht dafür um festzustellen, wie gut seltene Ereignisse vorhergesagt werden.
  
 🩺 Wie stelle ich aber fest, ob ein Sturmprognoseverfahren gut oder schlecht ist? Da müssen wir genauer hinschauen. Bewährt hat sich das Zählen der Grössen $A$, $B$, $C$ und $D$ in der nachfolgenden Tabelle. Z.B. ist $A$ die Anzahl Tage, für die ein Sturm vorhergesagt und dann auch beobachtet wurde. Die anderen Grössen werden analog gezählt. 🩺 Wie stelle ich aber fest, ob ein Sturmprognoseverfahren gut oder schlecht ist? Da müssen wir genauer hinschauen. Bewährt hat sich das Zählen der Grössen $A$, $B$, $C$ und $D$ in der nachfolgenden Tabelle. Z.B. ist $A$ die Anzahl Tage, für die ein Sturm vorhergesagt und dann auch beobachtet wurde. Die anderen Grössen werden analog gezählt.
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%2Fcdn.jsdelivr.net%2Fnpm%2Fp5%22%3E%3C%2Fscript%3E%0A%3Cscript%20src%3D%22https%3A%2F%2Fcdn.jsdelivr.net%2Fnpm%2F%40tensorflow%2Ftfjs%40latest%2Fdist%2Ftf.min.js%22%3E%3C%2Fscript%3E&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%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}}
 </WRAP> </WRAP>
  
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 für welchen Threshold erzielt wurden.+  - 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.
 {{gem/plain?0=N4IgLgpgHmIFwgKIAcD2BjAFhAdgAgLjwB0cBZAZUQJsJJwBVMAnCAZ01QBsATPI0gAkAkg1o0BOAGIBBAEri6IAL5A#b067e97f95ddad92}} {{gem/plain?0=N4IgLgpgHmIFwgKIAcD2BjAFhAdgAgLjwB0cBZAZUQJsJJwBVMAnCAZ01QBsATPI0gAkAkg1o0BOAGIBBAEri6IAL5A#b067e97f95ddad92}}
 </WRAP> </WRAP>
Zeile 87: Zeile 87:
 == ✍ 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%2Fcdn.jsdelivr.net%2Fnpm%2Fp5%22%3E%3C%2Fscript%3E%0A%3Cscript%20src%3D%22https%3A%2F%2Fcdn.jsdelivr.net%2Fnpm%2F%40tensorflow%2Ftfjs%40latest%2Fdist%2Ftf.min.js%22%3E%3C%2Fscript%3E&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%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}}
 </WRAP> </WRAP>
  
Zeile 120: Zeile 120:
   * **Alternative Loss-Funktionen**: Es werden andere Loss-Funktionen genutzt, welche die seltene Klasse stärker gewichten. Dieses Vorgehen weist ähnliche Vor- und Nachteile auf wie das Resampling.   * **Alternative Loss-Funktionen**: Es werden andere Loss-Funktionen genutzt, welche die seltene Klasse stärker gewichten. Dieses Vorgehen weist ähnliche Vor- und Nachteile auf wie das Resampling.
   * **Alternative Verfahren**: Es wird versucht neue, spezielle Verfahren für ein gegebenes Problem zu entwickeln oder mehrere der hier angeführten Techniken zu kombinieren. Das kann bessere Resultate bringen, weist häufig aber auch die gleichen Nachteile wie das Resampling auf und ist in der Regel sehr aufwändig umzusetzen.   * **Alternative Verfahren**: Es wird versucht neue, spezielle Verfahren für ein gegebenes Problem zu entwickeln oder mehrere der hier angeführten Techniken zu kombinieren. Das kann bessere Resultate bringen, weist häufig aber auch die gleichen Nachteile wie das Resampling auf und ist in der Regel sehr aufwändig umzusetzen.
-  * **Aufgeben**: Kommt häufiger vor als man denkt. Das Problem wird dann entweder beschrieben oder manchmal leider auch schlicht ignoriert...+  * **Aufgeben**: Kommt häufiger vor als man denkt. Das Problem wird dann entweder nur beschrieben oder manchmal leider auch schlicht ignoriert...
  
 <WRAP center round box > <WRAP center round box >