Informatik @ Exorciser

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:machinelearning2 [2026/07/09 13:49] – [3. Die Näherung der Näherung algorithmisch annähern] Ralf Kretzschmarp:ki:machinelearning2 [2026/07/11 10:27] (aktuell) – [4.3 Stochastische Lösungsansätze] Ralf Kretzschmar
Zeile 9: Zeile 9:
  
 <WRAP center round important 80%> <WRAP center round important 80%>
-Beim Machine Learning wird nicht das Problem selbstsondern die Fehlerfunktion einer mathematischen Beschreibung basierend auf endlich vielen (kaum je idealen) Daten näherungsweise minimiertSomit werden Machine-Learning-Lösungen nie 100 % fehlerfrei funktionieren und es muss geprüft werden, inwieweit eine gefundene Machine-Learning-Lösung zum eigentlichen Problem passt.+Machine Learning löst ein reales Problem nicht direkt, sondern nähert zuerst das Problem, dann diese Näherung mithilfe von Daten und schliesslich deren Lösung durch Annahmen und Verfahren anDeshalb sind Machine-Learning-Lösungen nie garantiert fehlerfrei.
 </WRAP> </WRAP>
  
Zeile 17: Zeile 17:
 \\ Abb.1: Fehlerfunktion((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])).</WRAP> \\ Abb.1: Fehlerfunktion((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])).</WRAP>
  
-Im Teil 1 hast du gelernt, dass mit Machine Learning Probleme gelöst werden können, bei welchen eine Eingabe in eine Ausgabe überführt werden soll. Dazu muss zuerst entschieden werden, welcher Ausschnitt der Wirklichkeit überhaupt betrachtet wird: Was gilt als Eingabe $x$? Was gilt als gewünschte Ausgabe $y$? Und woran soll gemessen werden, ob eine Ausgabe gut oder schlecht ist?+Im Teil 1 hast du gelernt, dass mit Machine Learning Probleme gelöst werden können, bei welchen eine Eingabe in eine Ausgabe überführt werden soll. Dazu muss zuerst entschieden werden, welcher Ausschnitt der Wirklichkeit überhaupt betrachtet wird: Was gilt als **Eingabe** $x$? Was gilt als **Ausgabe** $y$? Und woran soll gemessen werden, ob eine Ausgabe gut oder schlecht ist?
  
-Beim Machine Learning wird nicht direkt die Wirklichkeit gelernt. Stattdessen wird eine Stellvertreter-Funktion $f_{ML}(x)$ verwendet, um den Zusammenhang zwischen $x$ und $y$ zu modellieren: $y=f_{ML}(x)$. Dadurch wird das Problem für den Computer zugänglich gemacht. +Beim Machine Learning wird nicht direkt die Wirklichkeit gelernt. Stattdessen wird eine **Stellvertreter-Funktion** $f_{ML}(x)$ verwendet, um den Zusammenhang zwischen $x$ und $y$ zu modellieren: $y=f_{ML}(x)$. Dadurch wird das Problem für den Computer zugänglich gemacht. 
  
-Die Stellvertreter-Funktion $f_{ML}(x)$ beinhaltet verschiedene Parameter, die häufig als Gewichte $w$ bezeichnet werden((Gewicht heisst im Englischen "weight", daher das $w$.))Damit der Computer beurteilen kann, ob eine Einstellung der Gewichte $w$ gut oder schlecht ist, braucht es eine Fehlerfunktion $J$, welche die Qualität der Machine-Learning-Beschreibung $y=f_{ML}(x)$ in eine Zahl, den Fehler $e$, übersetzt.((Alternativ kann auch eine "Score"dh. eine Punktzahl verwendet werden, welche am Ende möglichst gross sein soll.)) +Die Stellvertreter-Funktion $f_{ML}(x)$ enthält verschiedene veränderbare Parameter. In diesem Kurs bezeichnen wir diese Parameter bei allen Machine-Learning-Verfahren vereinfachend als **Gewichte** $w$.((Gewicht heisst im Englischen "weight", daher das $w$.)) 
 + 
 +Damit der Computer beurteilen kann, ob eine Einstellung der Gewichte $w$ gut oder schlecht ist, braucht es eine Beurteilungsfunktion, welche die Qualität der Lösung in eine Zahl übersetzt. Diese Qualität kann als Fehler oder als Score angegeben werden. In diesem Kurs verwenden wir durchgehend die **Fehlerfunktion** $J$. Sie ordnet einer Stellvertreter-Funktion $y=f_{ML}(x)$ einen **Fehler** $e$ zuJe kleiner $e$desto besser ist die Lösung gemäss der gewählten Fehlerfunktion.
  
 Da die Fehlerfunktion vom Machine-Learning-Verfahren und der Einstellung dessen Gewichte $w$ abhängt, wird dieser Zusammenhang als $e = J(w)$ formuliert. Dies ist in  Abb.1 dargestellt. Beim Machine Learning wird eine Einstellung der Gewichte $w^{*}$ gesucht, für welche der Fehler möglichst klein wird, d. h. es wird ein $w^{*}$ gesucht, für welches $e_{min} = J(w^{*})$ gilt. Da die Fehlerfunktion vom Machine-Learning-Verfahren und der Einstellung dessen Gewichte $w$ abhängt, wird dieser Zusammenhang als $e = J(w)$ formuliert. Dies ist in  Abb.1 dargestellt. Beim Machine Learning wird eine Einstellung der Gewichte $w^{*}$ gesucht, für welche der Fehler möglichst klein wird, d. h. es wird ein $w^{*}$ gesucht, für welches $e_{min} = J(w^{*})$ gilt.
Zeile 31: Zeile 33:
 ===== - Die Näherung mithilfe von Daten annähern ===== ===== - Die Näherung mithilfe von Daten annähern =====
  
-Im vorangehenden Kapitel haben wir als Näherung das Problem durch $f_{ML}(x)$ und die Problemlösung durch $e_{min}=J(w^*)$ ersetzt. Um die Gewicht-Einstellung $w^*$ finden zu können, müssen wir zumindest in der Lage sein, für eine beliebige, gegebene Gewicht-Einstellung $\hat{w}$ den Fehlerwert $\hat{e} = J(\hat{w})$ zu berechnen. Der Fehlerwert $\hat{e}$ soll dabei nicht nur für ein einzelnes Datenbeispiel ausgerechnet werden, sondern am besten für alle möglichen Datenbeispiele hinwegZ.Bsollte bei einer Gesichtserkennung der Fehlerwert nicht nur mit dem Gesicht von Peter bestimmt werdensondern basierend auf allen möglichen Gesichtern.+Im vorangehenden Abschnitt wurde zuerst das reale Problem in eine Stellvertreterfunktion $f_{ML}(x)$ und eine Fehlerfunktion $J(w)$ übersetzt. Um am Ende eine gute Gewicht-Einstellung $w^*$ finden zu können, für welche $e_{min}=J(w^*)$ gilt, müssen wir zuerst wissenwie wir für eine beliebige Gewicht-Einstellung $\hat{w}$ den Fehler $\hat{e}= J(\hat{w})$ berechnen können. 
 + 
 +Dabei müssen wir zwischen dem **wahren Fehler** und dem **empirischen Fehler** unterscheiden. Den wahren Fehler würden wir bekommen, wenn wir unser Machine-Learning-Verfahren mit der fixen Gewicht-Einstellung $w^*$ unendlich lange in der Praxis einsetzen würden und den Fehler $\hat{e}= J(\hat{w})über alle dabei gesehenen Anwendungsbeispiele mitteln würden. So würden wir alle vorkommenden Varianten mit ihren echten Häufigkeiten berücksichtigenDas können wir jedoch nichtBeim Machine-Learning wird dafür stellvertretend ein endlicher Datensatz verwendetDer empirische Fehler ist derjenige Fehler $\hat{e}= J(\hat{w})$ der mithilfe der vorhandenen Daten bestimmt wird. Je besser dieser Datensatz die Realität abbildetdesto besser kann der Fehler bestimmt werden.
  
-🫣 In der Vergangenheit wurden Gesichtserkennungsverfahren relativ unkritisch mit Bildern aus dem Internet trainiert. Da es im Internet viel mehr Bilder von hellhäutigen Männern als von dunkelhäutigen Frauen gibt, wurden in der Folge Gesichter von dunkelhäutigen Frauen deutlich schlechter erkannt – eine unbeabsichtigte, algorithmische Diskriminierung. Seit dem wird versucht, mit Gesichtern zu trainieren, welche möglichst alle Alter, Ethnien etc. abdecken. Für die perfekte Gesichtserkennung müsste man eigentlich mit unendlich vielen Gesichtern trainieren, welche alle denkbaren Gesichtsvarianten abdecken+🫣 In der Vergangenheit wurden Gesichtserkennungsverfahren relativ unkritisch mit Bildern aus dem Internet trainiert. Da es im Internet viel mehr Bilder von hellhäutigen Männern als von dunkelhäutigen Frauen gibt, wurden in der Folge Gesichter von dunkelhäutigen Frauen deutlich schlechter erkannt – eine unbeabsichtigte, algorithmische Diskriminierung. Für eine perfekte Gesichtserkennung müsste man eigentlich alle relevanten Gesichtsvarianten, Beleuchtungen, Kamerawinkel, Altersgruppen, Hauttöne, Bildqualitäten und deren Auftretenshäufigkeiten in realen Anwendungssituationen berücksichtigen
  
-😭 Jetzt die schlechte Nachricht, wir können nur schon aus praktischen Gründen nie unendlich viele Daten berücksichtigen und wir werden kaum je alle denkbaren Datenvarianten für ein Problem zusammentragen könnenSomit können wir die wahren Fehlerwerte nur mit den Daten annähern, die wir haben. Je mehr Daten verfügbar sind (und je besser diese alle denkbaren Varianten abdecken), desto besser kann der wahre Fehlerwert $\hat{e} = J(\hat{w})$ angenähert werden. Da $f_{ML}(x)$ und $J(w)$ selbst nur Näherungen der Wirklichkeit darstellenwird damit "nureine Näherung der Näherung berechnet.+⚠️ Der wahre Fehler kann bei realen Problemen fast nie exakt berechnet werden. Er wird mithilfe vorhandener Daten angenähert. Je mehr geeignete Daten verfügbar sind und je besser diese Daten die reale Anwendungssituation abdecken, desto zuverlässiger kann der wahre Fehler geschätzt werden. Da $f_{ML}(x)$ und $J(w)$ bereits nur eine mathematische Näherung des realen Problems sindberechnen wir mit den vorhandenen Daten nur eine datenbasierte Schätzung des Fehlers dieser mathematischen Näherung.
  
 \\  \\ 
 <WRAP center round box > <WRAP center round box >
 == ✍ Auftrag Mehr ist mehr == == ✍ Auftrag Mehr ist mehr ==
-👉 Hier lernst du, dass viele Daten meist bessere Näherungen ergeben als wenige+👉 Hier lernst du, dass mehr Daten in der Regel zu besseren Näherungen führen
-  * Wenn du auf den Button ''Würfle!'' klickst, wird 100 Mal gewürfelt und die Anzahl Sechser wird gezähltTheoretisch müssten 1/6 aller Würfe Sechsen sein, d.h. 16.66... also rund 17 Sechsen. Diese Zahl wird bei ''Erwarteten Anzahl Sechsen'' (auch "Erwartungswert" genannt) angegeben. Klicke mehrfach auf den Button ''Würfle!'' und beobachte wie stark die tatsächlich ''Gewürfelte Anzahl Sechsen'' von der ''Erwartete Anzahl Sechsen'' prozentual abweicht. +  * Mit dem Regler legst du die ''Anzahl Würfe'' mit einem 6er-Würfel fest. Dabei wird auch gleich die Anzahl ''Erwarteten Anzahl Sechsen'' angegeben (auch "Erwartungswert" genannt)Bei 100 Würfen müssten theoretisch 1/6 aller Würfe Sechsen sein, d. h. der Erwartungswert wäre 16.66... Sechsen.  
-  * Mit dem Slider kannst du die "Anzahl Würfe" verstellen (von 100 bis 1'000'000). Damit änderst du auch die ''Erwartete Anzahl Sechsen''Würfle mehrmals mit verschiedenen Slider-Einstellungen. Wie gut wird die ''Erwartete Anzahl Sechsen'' bei wenigen Würfen getroffen? Wie gut wird die ''Erwartete Anzahl Sechsen'' bei vielen Würfen getroffen?+  * Bei einem Klick auf den Button ''Würfle!'' wird so oft zufällig gewürfelt, wie eingestellt. Dabei wird die tatsächlich ''Gewürfelte Anzahl Sechsen'' gezählt und ausgerechnet, wie viele Prozent diese Zahl von der ''Erwartete Anzahl Sechsen'' abweicht. 
 +  * Würfle mehrmals mit verschiedenen Slider-Einstellungen. Wie gut wird die ''Erwartete Anzahl Sechsen'' bei wenigen Würfen getroffen? Wie gut wird die ''Erwartete Anzahl Sechsen'' bei vielen Würfen getroffen?
   * Was bedeutet das dafür, wie gut der Fehler $e=J(w)$ anhand von Daten abgeschätzt werden kann? Halte deine Überlegungen im Textfeld fest. {{gem/plain?0=N4XyA#2a2d1614368f8273}}   * Was bedeutet das dafür, wie gut der Fehler $e=J(w)$ anhand von Daten abgeschätzt werden kann? Halte deine Überlegungen im Textfeld fest. {{gem/plain?0=N4XyA#2a2d1614368f8273}}
   * Vergleiche danach deine Antwort mit der unseren am Ende dieses Auftrags.   * Vergleiche danach deine Antwort mit der unseren am Ende dieses Auftrags.
 {{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%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%2F%2F%20global%20variables%0Alet%20button%3B%0Alet%20slider%3B%0Alet%20drawSize%3B%0Alet%20drawnNoOfSix%3B%0Alet%20expectedNoOfSix%3B%0Alet%20difference%3B%0A%2F%2Fnoprotect%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%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%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%0A%2F%2F%20Calculate%20drawnNoOfSix%2C%20expectedNoOfSix%20and%20difference%0A%2F%2F%0Afunction%20calulateEverything%28%29%20%7B%0A%09%2F%2F%20draw%20and%20count%20sixes%0A%09drawnNoOfSix%20%3D%200%3B%0A%09for%20%28let%20diceThrows%20%3D%200%3B%20diceThrows%20%3C%20drawSize%3B%20diceThrows%20%3D%20diceThrows%20%2B%201%29%20%7B%0A%09%09if%20%28Math.floor%28Math.random%28%29%20%2a%20%286%29%20%2B%201%29%20%3D%3D%3D%206%29%20%7B%0A%09%09%09drawnNoOfSix%20%3D%20drawnNoOfSix%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%0A%09difference%20%3D%20Math.abs%28%28expectedNoOfSix%20-%20drawnNoOfSix%29%20%2F%20expectedNoOfSix%20%2a%20100%29.toFixed%283%29%20%2B%20%22%20%25%22%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20Reset%20results%20and%20update%20draw%20size%0A%2F%2F%0Afunction%20resetResults%28%29%20%7B%0A%09%2F%2F%20reset%20results%0A%09drawnNoOfSix%20%3D%20%22%F0%9F%8E%B2%22%3B%0A%09difference%20%3D%20%22%F0%9F%8E%B2%22%3B%0A%0A%09%2F%2F%20update%20draw%20size%0A%09drawSize%20%3D%20round%2810%20%2a%2a%20slider.value%28%29%29%3B%0A%0A%09%2F%2F%20calculate%20expectation%20value%20and%20difference%0A%09expectedNoOfSix%20%3D%20%28drawSize%20%2F%206.0%29.toFixed%282%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%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Afunction%20setup%28%29%20%7B%0A%09%2F%2F%20default%20values%0A%09drawSize%20%3D%20100%3B%0A%09expectedNoOfSix%20%3D%20%28drawSize%20%2F%206.0%29.toFixed%282%29%3B%0A%09drawnNoOfSix%20%3D%20%22%F0%9F%8E%B2%22%3B%0A%09difference%20%3D%20%22%F0%9F%8E%B2%22%3B%0A%0A%09%2F%2F%20create%20canvas%20%0A%09createCanvas%28400%2C%20200%29%3B%0A%0A%09%2F%2F%20set%20text%20properties%0A%09textAlign%28LEFT%2C%20CENTER%29%3B%0A%0A%09%2F%2F%20create%20button%0A%09button%20%3D%20createButton%28%22W%C3%BCrfle%21%22%29%3B%0A%09button.size%2880%2C%2030%29%3B%0A%09button.position%2810%2C%2050%29%3B%0A%09button.style%28%22font-size%22%2C%20%2220px%22%29%3B%0A%09%2F%2F%20add%20button%20functionality%0A%09button.mouseClicked%28calulateEverything%29%3B%0A%0A%09%2F%2F%20create%20Slider%0A%09slider%20%3D%20createSlider%282%2C%206%2C%202%2C%200.001%29%3B%0A%09slider.position%28100%2C%2050%29%3B%20%2F%2F%20x%20and%20y%0A%09slider.size%28290%2C%2030%29%3B%20%2F%2F%20width%20and%20height%0A%09%2F%2F%20add%20slider%20functionality%0A%09slider.input%28resetResults%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20draw%28%29%0A%2F%2F%0Afunction%20draw%28%29%20%7B%0A%09%2F%2F%20clear%20everything%0A%09background%28%22white%22%29%3B%0A%0A%09%2F%2F%20create%20title%0A%09strokeWeight%280%29%3B%0A%09fill%28%22black%22%29%3B%0A%09textSize%2824%29%0A%09text%28%22%F0%9F%8E%B2%20%20Je%20mehr%20desto%20besser%22%2C%2010%2C%2015%29%3B%0A%0A%09%2F%2F%20print%20results%0A%09textSize%2820%29%3B%0A%09strokeWeight%280%29%3B%0A%09fill%28%22black%22%29%3B%0A%09text%28%22Anzahl%20W%C3%BCrfe%22%2C%2010%2C%20110%29%3B%0A%09text%28drawSize%2C%20300%2C%20110%29%3B%0A%09fill%28%22green%22%29%3B%0A%09text%28%22Erwartete%20Anzahl%20Sechsen%22%2C%2010%2C%20135%29%3B%0A%09text%28expectedNoOfSix%2C%20300%2C%20135%29%3B%0A%09fill%28%22blue%22%29%3B%0A%09text%28%22Gew%C3%BCrfelte%20Anzahl%20Sechsen%22%2C%2010%2C%20160%29%3B%0A%09text%28drawnNoOfSix%2C%20300%2C%20160%29%3B%0A%09fill%28%22red%22%29%3B%0A%09text%28%22Abweichung%20in%20Prozent%22%2C%2010%2C%20185%29%3B%0A%09text%28difference%2C%20300%2C%20185%29%3B%0A%7D&css=&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&height=360px#Erwartungswert}} {{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%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%2F%2F%20global%20variables%0Alet%20button%3B%0Alet%20slider%3B%0Alet%20drawSize%3B%0Alet%20drawnNoOfSix%3B%0Alet%20expectedNoOfSix%3B%0Alet%20difference%3B%0A%2F%2Fnoprotect%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%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%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%0A%2F%2F%20Calculate%20drawnNoOfSix%2C%20expectedNoOfSix%20and%20difference%0A%2F%2F%0Afunction%20calulateEverything%28%29%20%7B%0A%09%2F%2F%20draw%20and%20count%20sixes%0A%09drawnNoOfSix%20%3D%200%3B%0A%09for%20%28let%20diceThrows%20%3D%200%3B%20diceThrows%20%3C%20drawSize%3B%20diceThrows%20%3D%20diceThrows%20%2B%201%29%20%7B%0A%09%09if%20%28Math.floor%28Math.random%28%29%20%2a%20%286%29%20%2B%201%29%20%3D%3D%3D%206%29%20%7B%0A%09%09%09drawnNoOfSix%20%3D%20drawnNoOfSix%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%0A%09difference%20%3D%20Math.abs%28%28expectedNoOfSix%20-%20drawnNoOfSix%29%20%2F%20expectedNoOfSix%20%2a%20100%29.toFixed%283%29%20%2B%20%22%20%25%22%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20Reset%20results%20and%20update%20draw%20size%0A%2F%2F%0Afunction%20resetResults%28%29%20%7B%0A%09%2F%2F%20reset%20results%0A%09drawnNoOfSix%20%3D%20%22%F0%9F%8E%B2%22%3B%0A%09difference%20%3D%20%22%F0%9F%8E%B2%22%3B%0A%0A%09%2F%2F%20update%20draw%20size%0A%09drawSize%20%3D%20round%2810%20%2a%2a%20slider.value%28%29%29%3B%0A%0A%09%2F%2F%20calculate%20expectation%20value%20and%20difference%0A%09expectedNoOfSix%20%3D%20%28drawSize%20%2F%206.0%29.toFixed%282%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%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Afunction%20setup%28%29%20%7B%0A%09%2F%2F%20default%20values%0A%09drawSize%20%3D%20100%3B%0A%09expectedNoOfSix%20%3D%20%28drawSize%20%2F%206.0%29.toFixed%282%29%3B%0A%09drawnNoOfSix%20%3D%20%22%F0%9F%8E%B2%22%3B%0A%09difference%20%3D%20%22%F0%9F%8E%B2%22%3B%0A%0A%09%2F%2F%20create%20canvas%20%0A%09createCanvas%28400%2C%20200%29%3B%0A%0A%09%2F%2F%20set%20text%20properties%0A%09textAlign%28LEFT%2C%20CENTER%29%3B%0A%0A%09%2F%2F%20create%20button%0A%09button%20%3D%20createButton%28%22W%C3%BCrfle%21%22%29%3B%0A%09button.size%2880%2C%2030%29%3B%0A%09button.position%2810%2C%2050%29%3B%0A%09button.style%28%22font-size%22%2C%20%2220px%22%29%3B%0A%09%2F%2F%20add%20button%20functionality%0A%09button.mouseClicked%28calulateEverything%29%3B%0A%0A%09%2F%2F%20create%20Slider%0A%09slider%20%3D%20createSlider%282%2C%206%2C%202%2C%200.001%29%3B%0A%09slider.position%28100%2C%2050%29%3B%20%2F%2F%20x%20and%20y%0A%09slider.size%28290%2C%2030%29%3B%20%2F%2F%20width%20and%20height%0A%09%2F%2F%20add%20slider%20functionality%0A%09slider.input%28resetResults%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20draw%28%29%0A%2F%2F%0Afunction%20draw%28%29%20%7B%0A%09%2F%2F%20clear%20everything%0A%09background%28%22white%22%29%3B%0A%0A%09%2F%2F%20create%20title%0A%09strokeWeight%280%29%3B%0A%09fill%28%22black%22%29%3B%0A%09textSize%2824%29%0A%09text%28%22%F0%9F%8E%B2%20%20Je%20mehr%20desto%20besser%22%2C%2010%2C%2015%29%3B%0A%0A%09%2F%2F%20print%20results%0A%09textSize%2820%29%3B%0A%09strokeWeight%280%29%3B%0A%09fill%28%22black%22%29%3B%0A%09text%28%22Anzahl%20W%C3%BCrfe%22%2C%2010%2C%20110%29%3B%0A%09text%28drawSize%2C%20300%2C%20110%29%3B%0A%09fill%28%22green%22%29%3B%0A%09text%28%22Erwartete%20Anzahl%20Sechsen%22%2C%2010%2C%20135%29%3B%0A%09text%28expectedNoOfSix%2C%20300%2C%20135%29%3B%0A%09fill%28%22blue%22%29%3B%0A%09text%28%22Gew%C3%BCrfelte%20Anzahl%20Sechsen%22%2C%2010%2C%20160%29%3B%0A%09text%28drawnNoOfSix%2C%20300%2C%20160%29%3B%0A%09fill%28%22red%22%29%3B%0A%09text%28%22Abweichung%20in%20Prozent%22%2C%2010%2C%20185%29%3B%0A%09text%28difference%2C%20300%2C%20185%29%3B%0A%7D&css=&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&height=360px#Erwartungswert}}
-++++Unsere Antwort| Der wahre Wert ist die ''Erwartete Anzahl Sechsen'' (das Pendant dazu ist der wahre Fehlerwert $e_{min}=J(w^*)$ ).\\ Die ''Gewürfelte Anzahl Sechsen'', basierend auf endlich vielen Würfen, ist eine Schätzung davon (das Pendant dazu ist der mit den verfügbaren Daten berechnete Fehlerwert $\hat{e} = J(\hat{w})$ ).\\ Je höher die Anzahl Würfe, desto besser ist die Schätzung der ''Erwarteten Anzahl Sechsen'' (je mehr repräsentative Daten verwendet werden, desto besser nähert sich der berechnete Fehlerwert $\hat{e} = J(\hat{w})$ dem wahren Fehlerwert $e_{min}=J(w^*)$ an)  +++++Unsere Antwort| Die ''Erwartete Anzahl Sechsen'' entspricht dem **wahren Fehler** von $\hat{e}= J(\hat{w})$.\\ Die ''Gewürfelte Anzahl Sechsen'' entspricht dem **empirischen Fehler** von $\hat{e}= J(\hat{w})$, der basierend auf den getätigten Würfen berechnet wurde.\\ Je höher die Anzahl der Würfe, desto besser nähert sich der empirische Fehler dem wahren Fehler an.
 ++++ ++++
 </WRAP> </WRAP>
 \\  \\ 
-===== - Die Näherung der Näherung algorithmisch annähern  =====+===== - Die Näherung der Näherung mit Annahmen und Verfahren annähern  =====
  
-In den beiden vergangenen Kapitel wurde als Näherung das Problem durch $f_{ML}(x)$ und die Problemlösung durch $e_{min}=J(w^*)$ ersetzt und gezeigt, dass der wahre Fehlerwert $\hat{e}$ für eine gegebene Gewicht-Einstellung $\hat{w}$ mit einer beschränkten Anzahl Datenpunkte nur näherungsweise berechnet werden kann. Jetzt geht es darum, für eine gegebene Fehlerfunktion $J(w)$ mithilfe der verfügbaren Anzahl Datenpunkte diejenige Gewicht-Einstellung $\hat{w}^*$ zu finden, für welche  $\hat{e}_{min} = J(\hat{w}^*)$ gilt. Zur Vereinfachung schreiben wir jedoch $e_{min} = J(w^*)$ und merken uns, dass es sich dabei nur um eine Berechnung mit endlich vielen Daten handelt.+In den beiden vergangenen Abschnitten wurde das Problem durch $f_{ML}(x)$ und $J(w)$ und der wahre Fehler $\hat{e} = J(\hat{w})durch den empirischen Fehler ersetzt. Jetzt geht es darum, diejenige Gewichtseinstellung $w^*$ zu finden, für welche $e_{min} = J(w^*)$ gilt. 
  
-🫣 Leider lässt sich auch bezüglich endlich vieler Daten die Gewicht-Einstellung $w^*$ in den wenigsten Fällen exakt bestimmen. Der Grund liegt darin, dass sich die Lösungen zu den zugrundeliegenden Gleichungen oft nicht oder nicht mit vernünftigem Aufwand berechnen lassen. D. h. die in der Praxis üblichen mathematischen Verfahren berechnen $w^*$ nur näherungsweise. Somit kann Machine Learning im Endeffekt nur Näherungen der Näherungen eines Problems annähern. Erstaunlicherweise führt das Ganze trotzdem häufig zu bemerkenswerten Resultaten.+🫣 Leider lässt sich für die meisten Machine-Learning-Stellvertreter-Funktionen $f_{ML}(x)$ und Fehlerfunktionen $J$ diejenige Gewichtseinstellung $w^*$, für welche bezüglich der zur Verfügung stehenden Daten $e_{min} = J(w^*)$ gilt, nicht ohne Weiteres exakt bestimmen. Die Gründe dafür können unterschiedlich sein: Die verwendeten Gleichungen lassen sich nicht geschlossen lösen, die exakten Berechnungen wären zu aufwändig, oder das Verfahren liefert nur dann eine eindeutige Lösung, wenn zusätzliche, die Allgemeinheit einschränkende Annahmen getroffen werden. Somit wird $w^*$ in der Praxis oft nicht einfach exakt „gefunden“, sondern durch die verwendeten Verfahren geschätzt, angenähert oder erst durch einschränkende Annahmen eindeutig bestimmbar gemacht.
  
-Im Folgenden werden drei gängige Strategien vorgestelltmit welchen die gesuchte Gewicht-Einstellung $w^*$ angenähert werden kann. Jedes dieser Verfahren basiert dabei auf einer durch mehrere Gewichte $w$ anpassbaren Funktion $f_{ML}(x)$ und einer Fehlerfunktion $J(w)$.+⚠️ Machine-Learning bedeutet in der Praxis, die Näherung (endlich viele Daten) einer Näherung (mathematisches Abbild der Realitätanzunähern (das Fehlerminimum näherungsweise oder durch Annahmen zu bestimmen). Umso erstaunlicher ist es, wie gut diese Verfahren in der Praxis funktionieren können. Aufgrund dieser Näherungen sind Machine-Learning-Verfahren prinzipiell nicht fehlerfrei. Zudem können sie statt des realen Problems nur ein mathematisches Ersatzproblem lösen. Deshalb muss stets geprüft werden, ob die resultierende Machine-Learning-Anwendung auch tatsächlich dasjenige Problem löst, für welches sie erstellt wurde
  
-💡 Manche Fehlerfunktionen $J(w)$ brauchen für die Berechnung des Fehlers Datenpaare $(x, d)$, wobei $x$ die Eingabe darstellt und $d$ den zugehörigen "desired Output" (die zugehörige "erwünschte Ausgabe"). Bei solchen Fehlerfunktionen wird von "supervised Learning" (überwachten Lernen) gesprochen. Andere Fehlerfunktionen kommen nur mit den Eingangswerten $x$ aus. Hierbei wird von "unsupervised Learning" (unüberwachten Lernen) gesprochen. Alle der nachfolgenden Beispiele beziehen sich auf supervised Learning.+\\  
 +===== - Beispiele gebräuchlicher Machine-Lerning-Ansätze =====
  
 +Im Folgenden werden drei gängige Lösungsstrategienansätze vorgestellt: Iterative Ansätze, statistische Ansätze und 
 +stochastische Ansätze. Das ZIel dieser Ansätze besteht darin, basierend auf einer durch mehrere Gewichte $w$ anpassbaren Funktion $f_{ML}(x)$ und einer Fehlerfunktion $J$ mithilfe von endlich vielen Daten ein $w^*$ zu finden, das $e_{min} = J(w^*)$ möglichst gut erfüllt. Diese drei Ansätze sind nicht trennscharf und können miteinander kombiniert werden.
 +
 +💡 Manche Fehlerfunktionen $J$ brauchen für die Berechnung des Fehlers Datenpaare $(x,d)$. Dabei ist $x$ die Eingabe und $d$ die gewünschte Ausgabe, d.h. der **Desired Output**. In diesem Fall spricht man von **Supervised Learning** (überwachtem Lernen). **Unsupervised Learning** (unüberwachtes Lernen) nutzt nur die Eingangswerte $x$ (und keine Desired Outputs). Diese Verfahren gehen von einer bestimmten Art von Struktur der Eingangsdaten aus (Gruppen, Gitter etc.) und passen diese Struktur an die Daten an. Die Fehlerfunktion misst dabei, wie gut die vorgegebene Struktur an die Daten angepasst werden kann. Eine dritte Variante stellt das **Reinforcement Learning** (verstärkendes Lernen) dar. Dabei geht ein System von einem Anfangszustand $x$ aus, durchläuft einen oder mehrere Schritte und erhält dafür Belohnungen $r$. Dabei wird versucht, möglichst hohe Belohnungen zu erzielen. Die negative, erwartete Belohnung kann dabei als Fehlerfunktion aufgefasst werden, die minimiert wird.
 +
 +Alle der nachfolgenden Beispiele beziehen sich auf Supervised Learning.
 \\  \\ 
-==== - Iterative Verfahren ====+==== - Iterative Lösungsansätze ==== 
 + 
 +Bei iterativen Lösungsansätzen wird ausgehend von einer ersten Gewichtseinstellung $w_0$ versucht, die Gewichte in mehreren Schritten in Richtung einer möglichst guten Gewichtseinstellung $w^*$ anzupassen. Bei neuronalen Netzen wird diese erste Gewichtseinstellung häufig zufällig erzeugt. 
 + 
 +Besonders wichtig sind sogenannte Gradientenverfahren. Sie können verwendet werden, wenn die Stellvertreter-Funktion $f_{ML}(x)$ und die Fehlerfunktion $J(w)$ bestimmte mathematische Bedingungen erfüllen((Konkret müssen die relevanten Teile von $f_{ML}(x)$ und $J(w)$ nach den Gewichten $w$ ableitbar sein.)). Dann kann berechnet werden, in welche Richtung die Gewichte verändert werden sollten, damit der Fehler kleiner wird.
  
-Bei den iterativen Verfahren wird ausgehend von einer zufällig erzeugten Gewicht-Einstellung $w_0$ versucht, die Gewichte in mehreren Schritten in Richtung $w^*$ zu verändern. Iterativ bedeutet in mehreren Wiederholungen. Für die iterativen Verfahren eignen sich viele Stellvertreter-Funktionen $f_{ML}(x)$ und Fehlerfunktionen $J(w)$, jedoch nicht alle. Damit eine gezielte, schrittweise Verbesserung berechnet werden kannmüssen $f_{ML}(x)und $J(w)gewissen mathematischen Bedingungen genügen ((Konkret müssen $f_{ML}(x)und $J(w)$ nach den Gewichten $w$ ableitbar sein.)).+Neuronale Netze werden meist mit solchen iterativen Verfahren trainiert. Dabei wird als anpassbare Funktion $f_{ML}(x)$ eine neuronale Netz-Funktion verwendet. Als Fehlerfunktion $J$ wird mehrheitlich eine Funktion verwendetwelche für jeden Dateneingang $x$ den Ausgang $ydes neuronalen Netzes mit dem desired Output $dvergleicht
  
-Neuronale Netze werden meist mit iterativen Verfahren trainiert. Dabei wird als anpassbare Funktion $f_{ML}(x)$ eine neuronale Netz-Funktion verwendet. Als Fehlerfunktion $J(w)$ wird mehrheitlich eine Funktion verwendet, welche für jeden Dateneingang $x$ den Ausgangswert des neuronalen Netzes $y$ mit dem desired Output $d$ vergleicht. Um von einer Einstellung der Gewichte zu einer besseren zu kommen, wird häufig ein "Gradientenverfahren" genutzt. Was das genau ist und wie das genau funktioniert, wird in den Teilen 3 und 4 dieser Reihe erklärt. +Neuronale Netze und Gradientenverfahren werden in den Teilen 3 und 4 dieser Reihe genauer erklärt. 
  
 \\  \\ 
 <WRAP center round box > <WRAP center round box >
 == ✍ Auftrag neuronales Netz iterativ trainieren == == ✍ Auftrag neuronales Netz iterativ trainieren ==
-👉 Hier erfährst du, wie ein iteratives Verfahren arbeitet.+👉 Hier erfährst du, wie ein iterativer Lösungsansatz arbeitet.
  
-💡 Das folgende neuronale Netz besitzt zwei Eingänge, die x- und die y-Koordinaten der abgebildeten Kreise und Kreuze. Weiter besitzt es einen einzigen Ausgang $y$ der Werte von 0 bis 1 annehmen kann. Alle Ausgangswerte $y>0.5$ werden als Kreuze erkannt, alle Ausgangswerte $y\le0.5$ als Kreise. Als Fehlerfunktion wird der mean squared error (MSE) genutzt, welcher den Mittelwert aller Differenzquadrate $(y - d)^2$ bezeichnet. Der desired Output $d$ wird dabei für einen Kreis auf $d=1$ gesetzt und für ein Kreuz auf $d=0$. Die rote Linie stellt die Ausgangswerte $y = 0.5$ dar und wird als "decision Boundarybezeichnet. +💡 Das folgende neuronale Netz besitzt zwei Eingänge, die x- und die y-Koordinaten der abgebildeten Kreise und Kreuze. Weiter besitzt es einen einzigen Ausgang $y$ der Werte von 0 bis 1 annehmen kann. Alle Ausgangswerte $y>0.5$ werden als Kreuze erkannt, alle Ausgangswerte $y\le0.5$ als Kreise. Als Fehlerfunktion wird der **Mean Squared Error** (MSE) genutzt, welcher den Mittelwert aller Differenzquadrate $(y - d)^2$ bezeichnet. Der desired Output $d$ wird dabei für einen Kreis auf $d=1$ gesetzt und für ein Kreuz auf $d=0$. Die rote Linie stellt die Ausgangswerte $y = 0.5$ dar und wird als **Decision Boundary** bezeichnet. Zusätzlich zum MSE wird auch die Klassifikationsrate (Prozentsatz korrekt) erhoben und die Qualität des neuronalen Netzes beschrieben. Achtung, die Klassifikationsrate wird nicht dazu verwendet, das neuronale Netz zu trainineren((die Klassifikationsrate lässt sich nicht wie verlangt nach den Gewichten $w$ ableiten)).
  
-  * Starte das neuronale Netz ein paar mal. Das neuronale Netz wird mit den Daten links trainiert. Wie gut das trainierte neuronale Netz ist, wird mit den nicht für das Training verwendeten "Validationsdaten" rechts geprüft. Eine Epoche bezeichnet einen Trainingsdurchgang. Beachte wie schrittweise der MSE (in der Console) und somit auch die Klassifikationsrate (Prozentsatz korrekt) verbessert werden. Beachte auch, dass jedes Training von anderen zufällig gewählten Gewicht-Einstellungen aus gestartet wird und somit zu einem anderen Trainingsverlauf führt. +  * Starte das neuronale Netz ein paar Mal. Das neuronale Netz wird mit den Daten links trainiert. Wie gut das trainierte neuronale Netz ist, wird mit den nicht für das Training verwendeten "Validationsdaten" rechts geprüft. Eine Epoche bezeichnet einen Trainingsdurchgang. Beachtewie schrittweise der MSE (in der Console) und damit auch tendenziell die Klassifikationsrate verbessert werden. Beachte auch, dass jedes Training von anderen zufällig gewählten Gewichtseinstellungen aus gestartet wird und somit zu einem anderen Trainingsverlauf führt. 
-  * Verändere die Trainings- und Updateparameter oben im Programmcode. Versuche ein paar Minuten lang zu erreichen, dass die Trainings- und Validationsergebnisse möglichst gleich und möglichst gut sind. Wenn du genug hast, halte deine besten Resultate im Textfeld fest.+  * Verändere die Trainings- und Updateparameter oben im Programmcode. Versucheein paar Minuten lang zu erreichen, dass die Trainings- und Validationsergebnisse am Ende möglichst gleich und möglichst gut sind. Wenn du genug hast, halte deine besten Resultate im Textfeld fest.
     * Die ''LERNRATE'' bestimmt die Lerngeschwindigkeit, wobei bei einer zu hohen Lernrate das neuronale Netz "wild hin und her springt".     * Die ''LERNRATE'' bestimmt die Lerngeschwindigkeit, wobei bei einer zu hohen Lernrate das neuronale Netz "wild hin und her springt".
-    * Die ''ANZAHL_HIDDEN_NEURONEN'' ist mit der Anzahl Gewichte verknüpft. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt "Overfitting" auf, d.h. die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate).+    * Die ''ANZAHL_HIDDEN_NEURONEN'' ist mit der Anzahl Gewichte verknüpft. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt "Overfitting" auf, d. h. die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate).
     * Mit ''ANZAHL_EPOCHEN'' und ''EPOCHEN_FUER_GRAFIK_UPDATE'' kann eingestellt werden, wie lange trainiert und wie oft die Resultate und die Grafik aktualisiert werden soll.     * Mit ''ANZAHL_EPOCHEN'' und ''EPOCHEN_FUER_GRAFIK_UPDATE'' kann eingestellt werden, wie lange trainiert und wie oft die Resultate und die Grafik aktualisiert werden soll.
 {{gem/plain?0=N4XyA#2853c02d7e52e73e}} {{gem/plain?0=N4XyA#2853c02d7e52e73e}}
Zeile 84: Zeile 100:
  
 \\  \\ 
-==== - Statistische Verfahren ====+==== - Statistische Lösungsansätze ====
 <WRAP right box width=341px>{{gdraw>1w5RCPEApyUwg7CCcSrNNGP6k-h53kM-cUTxSX70b9E0 width=236 center}} <WRAP right box width=341px>{{gdraw>1w5RCPEApyUwg7CCcSrNNGP6k-h53kM-cUTxSX70b9E0 width=236 center}}
 \\ Abb.2: Illustration Naive Bayes((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])).</WRAP> \\ Abb.2: Illustration Naive Bayes((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])).</WRAP>
  
-Bei den statistischen Verfahren wird ermittelt, wie die Daten wertmässig verteilt sind. Dabei wird eine bestimmte, vorgegebene "Form" der Verteilung als Funktion $f_{ML}(x)$ genutzt und diese mithilfe der Einstellung mehrerer Gewichte $w$ möglichst gut an die Daten angepasst. Für die Anpassung der Gewichte $w$ werden in der Regel die Eingangsgrössen $x$ jedes Datenpunktes und die zugehörigen desired Outputs $d$ berücksichtigt. Die statistischen Verfahren sind so konstruiert, dass durch die Hinzunahme aller Daten direkt die Gewicht-Einstellung $w^*geschätzt wird, für welche $e_{min}=J(w^*)giltwobei $J(w)$ als "Risiko", das es zu minimieren gilt, bezeichnet wird+Bei den statistischen Lösungsansätzen wird ermittelt, wie die Daten wertmässig verteilt sind. Dazu wird eine Stellvertreter-Funktion $f_{ML}(x)$ verwendet, welche bestimmte Annahmen über die "Form" der Verteilung und weitere Annahmen beinhaltet. Basierend auf den verfügbaren Daten werden die Gewichte $w$ mithilfe statistischer Formeln so berechnet, dass die Fehlerfunktion $Jim Rahmen der getroffenen Annahmen möglichst klein wird. Diese Minimierung bleibt näherungsweiseweil sie auf endlichen Daten und vereinfachenden Annahmen beruht. (Wir verwenden auch bei statistischen Lösungsansätzen weiterhin den Begriff Fehlerfunktion $J$. Der wahre Fehler von $J$ wird dort häufig als Risikoder empirische Fehler von $J$ als empirisches Risiko bezeichnet.
  
-Da die wahre Verteilung der Daten normalerweise nicht bekannt iststellt die Wahl einer vorgegebenen "Form" für die Verteilung eine Näherung darWeiter treffen die gängigen statistischen Verfahren für ihre Berechnungen zusätzliche vereinfachende Annahmenwelche ebenfalls als Näherungen angesehen werden können.+Ein einfaches statistisches Verfahren ist der histogrammbasierte Naive-Bayes-Klassifikatorwelcher verschiedene Klassen unterscheiden kannDabei wird für jede Klasse deren Häufigkeit ermittelt und für jede Klasse und jede Eingangsgrösse ein eigenes Histogramm aus den Daten erstellt (es wird beim histogrammbasierten Naive-Bayes-Klassifikator angenommendass sich die Datenverteilungen als Histogramme darstellen lassen)
  
-Ein einfaches statistisches Verfahren ist der Naive Bayes Klassifikator, welcher verschiedene Klassen unterscheiden kann. Dabei wird für jede Klasse deren Häufigkeit ermittelt und für jede Klasse und jede Eingangsgrösse ein eigenes Histogramm aus den Daten erstellt. Ein Beispiel ist in Abb.2 illustriert. Es geht darum, mit zwei Eingangsgrössen $x_1$ und $x_2$ die beiden Klassen $A$ und $B$ zu unterscheiden. Das Histogramm in der Abbildung oben zeigt die Eingangsgrösse $x_1$ für die Datenpunkte, welche zur Klasse $A$ gehören. Ebenso (aber hier nicht abgebildet) werden drei weitere Histogramme für die Eingangsgrössen der Datenpunkte der Klasse $A$ sowie für die Eingangsgrössen $x_1$ und $x_2$ der Datenpunkte der Klasse $B$ erstellt. Die Abbildung unten zeigt, wie der Datenraum durch die Histogramme in "Zellen" unterteilt wird. Für jede Zelle wird basierend auf den Histogrammen Auftretenswahrscheinlichkeiten der Klassen $A$ und $B$ berechnet. Daraufhin wird jede Zelle derjenigen Klasse zugeordnet, welche den höheren Wahrscheinlichkeitswert aufweist.+Ein Beispiel ist in Abb.2 illustriert. Dabei werden mit zwei Eingangsgrössen $x_1$ und $x_2$ die beiden Klassen $A$ und $B$ unterschieden. Das Histogramm in der Abbildung oben zeigt die Eingangsgrösse $x_1$ für die Datenpunkte, welche zur Klasse $A$ gehören. Ebenso (aber hier nicht abgebildet) werden drei weitere Histogramme berechnet, eines für die Eingangsgrösse $x_2$ der Klasse $A$ sowie zwei weitere für die Eingangsgrössen $x_1$ und $x_2$ der Datenpunkte der Klasse $B$ erstellt. Die Abbildung unten zeigt, wie der Datenraum durch die Histogramme in "Zellen" unterteilt wird. Für jede Zelle werden basierend auf den Histogrammen die Auftretenswahrscheinlichkeiten der Klassen $A$ und $B$ berechnet. Daraufhin wird jede Zelle derjenigen Klasse zugeordnet, welche den höheren Wahrscheinlichkeitswert aufweist.
  
-Die Häufigkeit der Klassen und die Höhen der einzelnen Histogramm-Balken stellen im Naive Bayes Klassifikator die Gewichte $w$ dar. Durch "Zählen" der Daten wird so direkt die Gewicht-Einstellung $w^*$ geschätzt, für welche $e_{min}=J(w^*)$ gilt. Für das Zählen genügt es, alle Trainingsdaten einmal anzusehen, d. h., es genügt eine Epoche für das Training.+Die Häufigkeit der Klassen und die Höhen der einzelnen Histogramm-Balken stellen im histogrammbasierten Naive-Bayes-Klassifikator die Gewichte $w$ dar. Durch "Zählen" der Daten wird so direkt die Gewicht-Einstellung $w^*$ geschätzt, für welche $e_{min}=J(w^*)$ gilt. Für das Zählen genügt es, alle Trainingsdaten einmal anzusehen, d. h., es genügt eine Epoche für das Training.
  
 <WRAP clear/> <WRAP clear/>
-++++Falls du wissen möchtest, wie der Naive Bayes Klassifikator genau aufgebaut ist und das Bayes-Risiko aussieht, klicke hier!|+++++Wenn du wissen willst, wie der histogrammbasierte Naive-Bayes-Klassifikator im Detail aussieht, klicke hier!|
 \\  \\ 
-Der Naive Bayes Klassifikator nutzt die folgende Formel (eine Abwandlung der [[wpde>Satz_von_Bayes|Bayesischen Formel]] aus der Wahrscheinlichkeitstheorie):+Der histogrammbasierte Naive-Bayes-Klassifikator nutzt die folgende Formel (eine Abwandlung der [[wpde>Satz_von_Bayes|Bayesischen Formel]] aus der Wahrscheinlichkeitstheorie):
  
-\\  
 $P(C_j|x) = \displaystyle\frac{P(C_j)\:\displaystyle\prod^n_{i=1}\:p(x_i|C_j)}{p(x)}$ $P(C_j|x) = \displaystyle\frac{P(C_j)\:\displaystyle\prod^n_{i=1}\:p(x_i|C_j)}{p(x)}$
  
Zeile 112: Zeile 127:
 \\  \\ 
 Training, so werden alle "Gewichte" aus den Trainingsdaten berechnet: Training, so werden alle "Gewichte" aus den Trainingsdaten berechnet:
-  * $P(C_j)$ dafür wird gezählt, wie viele Datenpunkte zur Klasse $C_j$ gehören und diese Anzahl durch die Anzahl Datenpunkte geteilt. +  * $P(C_j)$: Dafür wird gezählt, wie viele Datenpunkte zur Klasse $C_j$ gehörenund diese Anzahl durch die Anzahl der Datenpunkte geteilt. 
-  * $p(x_i|C_j)$ das ist das Histogramm für die Eingangsgrösse $x_i$ aller Datenpunkte der Klasse $C_j$, wobei die Anzahl Datenpunkte in jedem Intervall durch die Anzahl Datenpunkte in der Klasse $C_j$ geteilt wird. Die Intervalle sind alle gleich breit und fangen beim kleinsten Wert der jeweiligen Eingangsgrösse im Datenset an (unabhängig von der Klasse) und hören beim grössten Wert auf (wie in der Abbildung gezeigt). +  * $p(x_i|C_j)$: Ist das Histogramm für die Eingangsgrösse $x_i$ aller Datenpunkte der Klasse $C_j$, wobei die Anzahl der Datenpunkte in jedem Intervall durch die Anzahl der Datenpunkte in der Klasse $C_j$ geteilt wird. Die Intervalle sind alle gleich breit und fangen beim kleinsten Wert der jeweiligen Eingangsgrösse im Datenset an (unabhängig von der Klasse) und hören beim grössten Wert auf (wie in der Abbildung gezeigt). 
-  * $p(x)$ kann weggelassen werden, da für einen gegebenen Datenpunkt $x$ dieser Wert für alle $P(C_j|x)$ gleich ist. Am Ende werden für einen zu klassifizierten Datenpunkt $x$ die $P(C_j|x)$ für alle Klassen $C_j$ ausgerechnet und so skaliert, dass die Summe aller $P(C_j|x)$ genau $1$ ergibt.+  * $p(x)$: Wird weggelassen, da für einen gegebenen Datenpunkt $x$ dieser Wert für alle $P(C_j|x)$ gleich ist. Am Ende werden für einen zu klassifizierenden Datenpunkt $x$ die $P(C_j|x)$ für alle Klassen $C_j$ ausgerechnet und so skaliert, dass die Summe aller $P(C_j|x)$ genau $1$ ergibt.
  
 \\  \\ 
-Anwendung des fertigen Naive Bayes Klassifikators, d.h. so werden für den Datenpunkt $x$ die Wahrscheinlichkeiten $P(C_j|x)$ ausgerechnet: +Anwendung des fertigen histogrammbasierten Naive-Bayes-Klassifikators, d. h. so werden für den Datenpunkt $x$ die Wahrscheinlichkeiten $P(C_j|x)$ ausgerechnet: 
-  * $p(x_i|C_j)$ dafür wird im Histogramm, das zur Eingangsgrösse $x_i$ und Klasse $C_j$ gehört, nachgeschaut, in welchem Intervall der Wert der Eingangsgrösse $x_i$ des Datenpunkts $x$ zu liegen kommt. Dieser Wert (die Höhe) dieses Intervalls wird als $p(x_i|C_j)$ genommen. +  * $p(x_i|C_j)$: Dafür wird im Histogramm, das zur Eingangsgrösse $x_i$ und Klasse $C_j$ gehört, nachgeschaut, in welchem Intervall der Wert der Eingangsgrösse $x_i$ des Datenpunkts $x$ zu liegen kommt. Dieser Wert (die Höhe) dieses Intervalls wird als $p(x_i|C_j)$ genommen. 
-  * $\Pi^n_{i=1}\:p(x_i|C_j)$ ist das Produkt aller Werte $p(x_i|C_j)$ für den Datenpunkt $x$, welche zur Klasse $C_j$ gehören. +  * $\Pi^n_{i=1}\:p(x_i|C_j)$: Das ist das Produkt aller Werte $p(x_i|C_j)$ für den Datenpunkt $x$, welche zur Klasse $C_j$ gehören. 
-  * $P(C_j)$ wird direkt verwendet +  * $P(C_j)$: Das wird direkt verwendet. 
-  * $p(x)$ wird ignoriert +  * $p(x)$: Wird weggelassen (Begründung siehe oben). 
-  * Mit der Formel des Naive Bayes Klassifikators werden die $P(C_j|x)$ für alle Klassen $C_j$ für den Datenpunkt $x$ ausgerechnet. Am Ende wird jedes $P(C_j|x)$ noch durch die Summe aller $P(C_j|x)$ geteilt, um echte Wahrscheinlichkeiten zu erhalten. +  * Mit der Formel des Naive-Bayes-Klassifikators werden die $P(C_j|x)$ für alle Klassen $C_j$ für den Datenpunkt $x$ ausgerechnet. Am Ende wird jedes $P(C_j|x)$ noch durch die Summe aller $P(C_j|x)$ geteilt, um echte Wahrscheinlichkeiten zu erhalten. 
   * Dasjenige $P(C_j|x)$ mit dem höchsten Wert zeigt an, welches die wahrscheinlichste Klasse für den Datenpunkt $x$ ist und mit welcher Wahrscheinlichkeit das zutrifft.   * Dasjenige $P(C_j|x)$ mit dem höchsten Wert zeigt an, welches die wahrscheinlichste Klasse für den Datenpunkt $x$ ist und mit welcher Wahrscheinlichkeit das zutrifft.
  
 \\  \\ 
-Der Naive Bayes Klassifikator minimiert das Bayes-Risiko+Als Fehlerfunktion dient beim histogrammbasierten Naive-Bayes-Klassifikator das Bayes-Risiko:
  
-\\ 
 $Bayes\text{-}Risiko = 1 - E_x[P(C_{max}|x)]$ $Bayes\text{-}Risiko = 1 - E_x[P(C_{max}|x)]$
  
-  * $P(C_{max}|x)$ ist die Wahrscheinlichkeit, mit welcher die vorhergesagte Klasse $C$ für den Datenpunkt $x$ korrekt ist. Das $max$ kommt daher, dass immer diejenige Klasse mit der höchsten Wahrscheinlichkeit $P(C_j|x)$ auswählt wird.+  * $P(C_{max}|x)$ ist die Wahrscheinlichkeit, mit welcher die vorhergesagte Klasse $C$ für den Datenpunkt $x$ korrekt ist. Das $max$ kommt daher, dass immer diejenige Klasse mit der höchsten Wahrscheinlichkeit $P(C_j|x)$ ausgewählt wird.
   * $E_x$ ist der Erwartungswert, d. h. der Durchschnitt aller $P(C_{max}|x)$ aller Datenpunkte $x$.   * $E_x$ ist der Erwartungswert, d. h. der Durchschnitt aller $P(C_{max}|x)$ aller Datenpunkte $x$.
   * Das $1 -$ macht aus dem Erwartungswert der Wahrscheinlichkeit ein Risiko, das umso kleiner, umso besser ist.   * Das $1 -$ macht aus dem Erwartungswert der Wahrscheinlichkeit ein Risiko, das umso kleiner, umso besser ist.
  
 \\  \\ 
-💡 Der Naive Bayes Klassifikator geht von der Annahme aus, dass alle Eingangsgrössen $x_i$ statistisch voneinander unabhängig sind, was in der Praxis kaum je zutrifft. Z.B. sind für das Unterscheiden verschiedener Fischarten die beiden Eingangsgrössen "Masse" und "Länge" nicht unabhängig, da längere Fische meist auch eine grössere Masse aufweisen. Aufgrund dieser zugrundeliegenden "naiven" Annahme und der Verwendung einer Variante der Bayesischen Formel, heisst dieses Verfahren "Naive Bayes".+💡 Alle Varianten des Naive-Bayes-Klassifikators gehen von der Annahme aus, dass alle Eingangsgrössen $x_i$ statistisch voneinander unabhängig sind, was in der Praxis kaum je zutrifft. Z. B. sind für das Unterscheiden verschiedener Fischarten die beiden Eingangsgrössen "Masse" und "Länge" nicht unabhängig, da längere Fische meist auch eine grössere Masse aufweisen. Aufgrund dieser zugrundeliegenden "naiven" Annahme und der Verwendung einer Variante der Bayesischen Formel haben diese Verfahren den Namenszusatz "Naive Bayes" erhalten.
 ++++ ++++
  
 \\  \\ 
 <WRAP center round box > <WRAP center round box >
-== ✍ Auftrag Naive Bayes Klassifikator ==+== ✍ Auftrag histogrammbasierter Naive-Bayes-Klassifikator ==
 👉 Hier erfährst du, wie ein statistisches Verfahren arbeitet. 👉 Hier erfährst du, wie ein statistisches Verfahren arbeitet.
  
-💡 Um den statistischen Naive Bayes Klassifikator mit dem neuronalen Netz aus Kapitel 3.1 vergleichen zu können, werden hierfür dieselben Daten wie in 3.1. versendet. D.h. zwei Eingangsgrössen (die x- und die y-Koordinaten der Kreise und Kreuze) und als Ausgang $y$ die Wahrscheinlichkeit, dass ein Datenpunkt $x$ zur Klasse der Kreuze gehört. Somit werden auch hier alle Ausgangswerte $y>0.5$ werden als Kreuze erkannt (und blau eingefärbt) und alle Ausgangswerte $y<0.5$ als Kreise erkannt (und grün eingefärbt).+💡 Um den histogrammbasierten Naive-Bayes-Klassifikator mit dem neuronalen Netz aus Kapitel 3.1 vergleichen zu können, werden hierfür dieselben Daten wie in 3.1. versendet. D. h. zwei Eingangsgrössen (die x- und die y-Koordinaten der Kreise und Kreuze) und als Ausgang $y$ die Wahrscheinlichkeit, dass ein Datenpunkt $x$ zur Klasse der Kreuze gehört. Somit werden auch hier alle Ausgangswerte $y>0.5$ als Kreuze erkannt (und blau eingefärbt) und alle Ausgangswerte $y<0.5$ als Kreise erkannt (und grün eingefärbt).
  
 💡 Speziell ist, dass alle Ausgangswerte mit $y = 0.5$ weiss eingefärbt werden. Hier kann sich der Klassifikator für keine der beiden Klassen entscheiden. Die Anzahl der betroffenen Kreise oder Kreuze wird im Programm mit zwei ''??'' gekennzeichnet und nicht für die Berechnung der Klassifikationsrate oder der Anzahl falsch klassifizierter Datenpunkte berücksichtigt. 💡 Speziell ist, dass alle Ausgangswerte mit $y = 0.5$ weiss eingefärbt werden. Hier kann sich der Klassifikator für keine der beiden Klassen entscheiden. Die Anzahl der betroffenen Kreise oder Kreuze wird im Programm mit zwei ''??'' gekennzeichnet und nicht für die Berechnung der Klassifikationsrate oder der Anzahl falsch klassifizierter Datenpunkte berücksichtigt.
  
-💡 Aus Gründen der Vergleichbarkeitwerdend alsFehlerfunktionenn das Bayes-Risiko und der MSE berechnet und angegeben. +💡 Aus Gründen der Vergleichbarkeit werden als Fehlerfunktionen das Bayes-Risiko und der MSE angegeben. 
  
-  * Starte den Naive Bayes Klassifikator ein paar mal. Es wird immer dasselbe Resultat ausgegeben und das Training dauert immer nur 1 Epoche.  +  * Starte den Naive-Bayes-Klassifikator ein paar Mal. Es wird immer dasselbe Resultat ausgegeben und das Training dauert immer nur 1 Epoche.  
-  * Verändere den einzigen Trainingsparameter im Programmcode und suche das Resultat, bei dem die Trainings- und Validationsergebnisse möglichst gleich und möglichst gut sind. Wie vergleicht sich der Naive Bayes Klassifikator für dieses Problem mit dem neuronalen Netz aus 3.1? Halte deine besten Resultate im Textfeld fest. +  * Verändere den einzigen Trainingsparameter im Programmcode und suche das Resultat, bei dem die Trainings- und Validationsergebnisse möglichst gleich und möglichst gut sind. Wie vergleicht sich der Naive-Bayes-Klassifikator für dieses Problem mit dem neuronalen Netz aus 3.1? Halte deine besten Resultate im Textfeld fest. 
-    * Die ''ANZAHL_INTERVALLE'' bestimmt die Feinheit der Histogramme, mit welchen die Daten statistisch ausgewertet werden. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt „Overfitting“ auf, d.h. die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate).+    * Die ''ANZAHL_INTERVALLE'' bestimmt die Feinheit der Histogramme, mit welchen die Daten statistisch ausgewertet werden. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt „Overfitting“ auf, d. h.die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate).
 {{gem/plain?0=N4XyA#37b6a8c6d650c881}} {{gem/plain?0=N4XyA#37b6a8c6d650c881}}
  
-{{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%20ANZAHL_INTERVALLE%20%3D%208%3B%20%2F%2F%20ganzzahliger%20Wert%20zwischen%202%20und%20100%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%20MIN_NO_OF_INTERVALS%20%3D%201%3B%0Aconst%20MAX_NO_OF_INTERVALS%20%3D%20100%3B%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20200%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%20100%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%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0Aconst%20NoOfClasses%20%3D%202%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20global%20variables%0Alet%20testProbabilities%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%3B%0Aconst%20BayesTable%20%3D%20%5B%5D%3B%0Aconst%20BayesPriors%20%3D%20%5B%5D%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%20Naive%20Bayes%20calculate%20histograms%20and%20priors%0A%2F%2F%0Afunction%20naiveBayesCalculateHistogramsPriors%28%29%20%7B%0A%0A%09%2F%2F%20Reset%20table%20and%20priors%0A%09%2F%2F%20for%20each%20class%20c%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesPriors.push%280%29%3B%0A%09%09BayesTable.push%28%5B%5D%29%3B%0A%09%09%2F%2F%20for%20each%20input%20feature%20f%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09BayesTable%5Bc%5D.push%28%5B%5D%29%3B%0A%09%09%09%2F%2F%20for%20each%20interval%20i%0A%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09BayesTable%5Bc%5D%5Bf%5D.push%280%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20Count%20Bayes%20table%20and%20priors%0A%09%2F%2F%20for%20each%20sample%20s%0A%09for%20%28let%20s%20%3D%200%3B%20s%20%3C%20trainInputArray.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20interval%20%3D%20%5B%5D%3B%0A%09%09%2F%2F%20get%20intervals%20of%20current%20sample%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09interval.push%28Math.floor%28%28trainInputArray%5Bs%5D%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20increase%20Bayes%20table%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09if%20%28trainOutputArray%5Bs%5D%20%3D%3D%3D%201%29%20%7B%20%2F%2F%20sample%20belongs%20to%20first%20class%0A%09%09%09%09BayesTable%5B0%5D%5Bf%5D%5Binterval%5Bf%5D%5D%20%2B%3D%201%3B%0A%09%09%09%7D%20else%20%7B%20%2F%2F%20sample%20belongs%20to%20second%20class%0A%09%09%09%09BayesTable%5B1%5D%5Bf%5D%5Binterval%5Bf%5D%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20increase%20Bayes%20priors%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09if%20%28trainOutputArray%5Bs%5D%20%3D%3D%3D%201%29%20%7B%20%2F%2F%20sample%20belongs%20to%20first%20class%0A%09%09%09%09BayesPriors%5B1%5D%20%2B%3D%201.0%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09BayesPriors%5B0%5D%20%2B%3D%201.0%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20Scale%20Bayes%20table%20and%20table%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%3D%20BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%2F%20BayesPriors%5Bc%5D%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09BayesPriors%5Bc%5D%20%3D%20BayesPriors%5Bc%5D%20%2F%20trainInputArray.length%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20determine%20probability%20that%20sample%20belongs%20to%20first%20class%0A%2F%2F%0Afunction%20naiveBayesProbabilityOfFirstClass%28inputSample%29%20%7B%0A%09%2F%2F%20local%20variables%0A%09let%20BayesProbabilities%20%3D%20%5B%5D%3B%0A%09let%20BayesSum%20%3D%200.0%3B%0A%09let%20interval%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20get%20interval%20for%20each%20input%20feature%20f%0A%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09interval.push%28Math.floor%28%28inputSample%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%7D%0A%09%09if%20%28interval%5Bf%5D%20%3C%200%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%200%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20unscaled%20Bayes%20probabilities%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%2F%2F%20calculate%20product%20of%20p%28xi%7CCj%29%20over%20all%20features%0A%09%09let%20product%20%3D%201%3B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09product%20%3D%20product%20%2a%20BayesTable%5Bc%5D%5Bf%5D%5Binterval%5Bf%5D%5D%3B%0A%09%09%7D%0A%09%09BayesProbabilities.push%28BayesPriors%5Bc%5D%20%2a%20product%29%3B%0A%09%09BayesSum%20%3D%20BayesSum%20%2B%20BayesProbabilities%5Bc%5D%3B%0A%09%7D%0A%09%2F%2F%20if%20no%20probability%20is%20assigned%20choose%20uniform%0A%09if%20%28BayesSum%20%3D%3D%3D%200%29%20%7B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09BayesProbabilities%5Bc%5D%20%3D%201%20%2F%20NoOfClasses%3B%0A%09%09%7D%0A%09%09BayesSum%20%3D%201%3B%0A%09%7D%0A%0A%09%2F%2F%20scale%20Bayes%20probabilites%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesProbabilities%5Bc%5D%20%3D%20BayesProbabilities%5Bc%5D%20%2F%20BayesSum%3B%0A%09%7D%0A%0A%09%2F%2F%20return%20probability%20of%20first%20class%0A%09return%20BayesProbabilities%5B0%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20Bayes%20risk%20and%20mean%20squared%20error%0A%2F%2F%0Afunction%20calculateLoss%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20mse%20%3D%200.0%3B%0A%09let%20bayesRisk%20%3D%200.0%3B%0A%09let%20sum%20%3D%200.0%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09mse%20%3D%20mse%20%2B%20%28probabilityFirstClass%20-%20desiredOutput%5Bs%5D%29%20%2a%2a%202%3B%0A%09%09sum%20%3D%20sum%20%2B%20max%281-probabilityFirstClass%2C%20probabilityFirstClass%29%3B%0A%09%7D%0A%09bayesRisk%20%3D%201%20-%20sum%2FinputData.length%3B%0A%09mse%20%3D%20mse%20%2F%20inputData.length%3B%0A%09return%20%5BbayesRisk%2C%20mse%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09let%20equally%20%3D%200%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09if%20%28%28desiredOutput%5Bs%5D%20%3D%3D%3D%201%20%26%26%20probabilityFirstClass%20%3E%200.5%29%20%7C%7C%20%28desiredOutput%5Bs%5D%20%3D%3D%3D%200%20%26%26%20probabilityFirstClass%20%3C%200.5%29%29%20%7B%0A%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%7D%0A%09%09if%20%28probabilityFirstClass%20%3D%3D%3D%200.5%29%20%7B%0A%09%09%09equally%20%3D%20equally%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09samples%3A%20inputData.length%2C%0A%09%09correct%3A%20correct%2C%0A%09%09wrong%3A%20inputData.length%20-%20correct%20-%20equally%2C%0A%09%09equally%3A%20equally%2C%0A%09%09accuracy%3A%20Math.round%28100%20%2a%20correct%20%2F%20%28inputData.length%20-%20equally%29%29%2C%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%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28%29%20%7B%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20%5BriskTrain%2C%20mseTrain%5D%20%3D%20calculateLoss%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20%5BriskValid%2C%20mseValid%5D%20%3D%20calculateLoss%28validInputArray%2C%20validOutputArray%29%3B%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validInputArray%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09decisionBuffer.noStroke%28%29%3B%0A%09for%20%28x%20%3D%200%3B%20x%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20x%20%3D%20x%20%2B%201%29%20%7B%0A%09%09for%20%28y%20%3D%200%3B%20y%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20y%20%3D%20y%20%2B%201%29%20%7B%0A%09%09%09let%20probabilityOfClass1%20%3D%20naiveBayesProbabilityOfFirstClass%28%5Bx%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%2C%20y%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%5D%29%3B%0A%09%09%09if%20%28probabilityOfClass1%20%3E%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20255%2C%20200%29%3B%20%2F%2F%20green%0A%09%09%09%7D%20else%20if%20%28probabilityOfClass1%20%3C%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20200%2C%20255%29%3B%20%2F%2F%20blue%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09decisionBuffer.fill%28255%2C%20255%2C%20255%29%3B%20%2F%2F%20white%0A%09%09%09%7D%0A%09%09%09decisionBuffer.rect%28DATA_SCALE%20%2a%20x%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20y%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%7D%0A%09%7D%0A%0A%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20labels%20to%20training%20and%20validation%20feature%20space%20%2F%2F%20wrong%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20trainCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20trainCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20validCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20validCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%20DATA_WINDOW_SIZE%20%2B%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%20%20%20%20%201%20%7C%7C%20%22%20%2B%20trainCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20riskTrain.toFixed%286%29%20%2B%20%22%20%7C%20%22%20%2B%20mseTrain.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20validCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%20%2B%20riskValid.toFixed%286%29%20%2B%20%22%20%7C%20%22%20%2B%20mseValid.toFixed%286%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%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%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%20circle%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%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%204%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%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%0Afunction%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20check%20for%20number%20of%20intervals%0A%09if%20%28ANZAHL_INTERVALLE%20%3C%202%20%7C%7C%20ANZAHL_INTERVALLE%20%3E%20100%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Die%20ANZAHL_INTERVALLE%20darf%20nur%20von%202%20bis%20100%20gehen.%22%29%3B%0A%09%09return%20false%3B%0A%09%7D%0A%0A%09%2F%2F%20initial%20console%20output%20%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20Training%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20Validation%20%20%20%20%20%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20%20%20Risiko%20%7C%20%20%20%20%20%20MSE%20%7C%7C%20korrekt%20%7C%20%20%20Risiko%20%7C%20%20%20%20%20%20MSE%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%20%2B%2040%29%3B%0A%0A%09%2F%2F%20text%20below%20networks%0A%09fill%28%22black%22%29%3B%0A%09noStroke%28%29%3B%0A%09textSize%2820%29%3B%0A%09text%28%22Naive%20Bayes%20%2B%20Statistik%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09textSize%28PIXEL_SIZE%20%2a%206%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%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%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20train%20model%0A%09naiveBayesCalculateHistogramsPriors%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09drawPrediction%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%0A%7D&css=&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&autorun=off&height=400px#NaiveBayes}}+{{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%20ANZAHL_INTERVALLE%20%3D%208%3B%20%2F%2F%20ganzzahliger%20Wert%20zwischen%202%20und%20100%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%20MIN_NO_OF_INTERVALS%20%3D%201%3B%0Aconst%20MAX_NO_OF_INTERVALS%20%3D%20100%3B%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20200%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%20100%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%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0Aconst%20NoOfClasses%20%3D%202%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20global%20variables%0Alet%20testProbabilities%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%3B%0Aconst%20BayesTable%20%3D%20%5B%5D%3B%0Aconst%20BayesPriors%20%3D%20%5B%5D%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%20Naive%20Bayes%20calculate%20histograms%20and%20priors%0A%2F%2F%0Afunction%20naiveBayesCalculateHistogramsPriors%28%29%20%7B%0A%0A%09%2F%2F%20Reset%20table%20and%20priors%0A%09%2F%2F%20for%20each%20class%20c%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesPriors.push%280%29%3B%0A%09%09BayesTable.push%28%5B%5D%29%3B%0A%09%09%2F%2F%20for%20each%20input%20feature%20f%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09BayesTable%5Bc%5D.push%28%5B%5D%29%3B%0A%09%09%09%2F%2F%20for%20each%20interval%20i%0A%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09BayesTable%5Bc%5D%5Bf%5D.push%280%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20Count%20Bayes%20table%20and%20priors%0A%09%2F%2F%20for%20each%20sample%20s%0A%09for%20%28let%20s%20%3D%200%3B%20s%20%3C%20trainInputArray.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20interval%20%3D%20%5B%5D%3B%0A%09%09%2F%2F%20get%20intervals%20of%20current%20sample%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09interval.push%28Math.floor%28%28trainInputArray%5Bs%5D%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20increase%20Bayes%20table%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09if%20%28trainOutputArray%5Bs%5D%20%3D%3D%3D%201%29%20%7B%20%2F%2F%20sample%20belongs%20to%20first%20class%0A%09%09%09%09BayesTable%5B0%5D%5Bf%5D%5Binterval%5Bf%5D%5D%20%2B%3D%201%3B%0A%09%09%09%7D%20else%20%7B%20%2F%2F%20sample%20belongs%20to%20second%20class%0A%09%09%09%09BayesTable%5B1%5D%5Bf%5D%5Binterval%5Bf%5D%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20increase%20Bayes%20priors%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09if%20%28trainOutputArray%5Bs%5D%20%3D%3D%3D%201%29%20%7B%20%2F%2F%20sample%20belongs%20to%20first%20class%0A%09%09%09%09BayesPriors%5B1%5D%20%2B%3D%201.0%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09BayesPriors%5B0%5D%20%2B%3D%201.0%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20Scale%20Bayes%20table%20and%20table%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%3D%20BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%2F%20BayesPriors%5Bc%5D%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09BayesPriors%5Bc%5D%20%3D%20BayesPriors%5Bc%5D%20%2F%20trainInputArray.length%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20determine%20probability%20that%20sample%20belongs%20to%20first%20class%0A%2F%2F%0Afunction%20naiveBayesProbabilityOfFirstClass%28inputSample%29%20%7B%0A%09%2F%2F%20local%20variables%0A%09let%20BayesProbabilities%20%3D%20%5B%5D%3B%0A%09let%20BayesSum%20%3D%200.0%3B%0A%09let%20interval%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20get%20interval%20for%20each%20input%20feature%20f%0A%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09interval.push%28Math.floor%28%28inputSample%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%7D%0A%09%09if%20%28interval%5Bf%5D%20%3C%200%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%200%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20unscaled%20Bayes%20probabilities%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%2F%2F%20calculate%20product%20of%20p%28xi%7CCj%29%20over%20all%20features%0A%09%09let%20product%20%3D%201%3B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09product%20%3D%20product%20%2a%20BayesTable%5Bc%5D%5Bf%5D%5Binterval%5Bf%5D%5D%3B%0A%09%09%7D%0A%09%09BayesProbabilities.push%28BayesPriors%5Bc%5D%20%2a%20product%29%3B%0A%09%09BayesSum%20%3D%20BayesSum%20%2B%20BayesProbabilities%5Bc%5D%3B%0A%09%7D%0A%09%2F%2F%20if%20no%20probability%20is%20assigned%20choose%20uniform%0A%09if%20%28BayesSum%20%3D%3D%3D%200%29%20%7B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09BayesProbabilities%5Bc%5D%20%3D%201%20%2F%20NoOfClasses%3B%0A%09%09%7D%0A%09%09BayesSum%20%3D%201%3B%0A%09%7D%0A%0A%09%2F%2F%20scale%20Bayes%20probabilites%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesProbabilities%5Bc%5D%20%3D%20BayesProbabilities%5Bc%5D%20%2F%20BayesSum%3B%0A%09%7D%0A%0A%09%2F%2F%20return%20probability%20of%20first%20class%0A%09return%20BayesProbabilities%5B0%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20Bayes%20risk%20and%20mean%20squared%20error%0A%2F%2F%0Afunction%20calculateLoss%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20mse%20%3D%200.0%3B%0A%09let%20bayesRisk%20%3D%200.0%3B%0A%09let%20sum%20%3D%200.0%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09mse%20%3D%20mse%20%2B%20%28probabilityFirstClass%20-%20desiredOutput%5Bs%5D%29%20%2a%2a%202%3B%0A%09%09sum%20%3D%20sum%20%2B%20max%281-probabilityFirstClass%2C%20probabilityFirstClass%29%3B%0A%09%7D%0A%09bayesRisk%20%3D%201%20-%20sum%2FinputData.length%3B%0A%09mse%20%3D%20mse%20%2F%20inputData.length%3B%0A%09return%20%5BbayesRisk%2C%20mse%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09let%20equally%20%3D%200%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09if%20%28%28desiredOutput%5Bs%5D%20%3D%3D%3D%201%20%26%26%20probabilityFirstClass%20%3E%200.5%29%20%7C%7C%20%28desiredOutput%5Bs%5D%20%3D%3D%3D%200%20%26%26%20probabilityFirstClass%20%3C%200.5%29%29%20%7B%0A%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%7D%0A%09%09if%20%28probabilityFirstClass%20%3D%3D%3D%200.5%29%20%7B%0A%09%09%09equally%20%3D%20equally%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09samples%3A%20inputData.length%2C%0A%09%09correct%3A%20correct%2C%0A%09%09wrong%3A%20inputData.length%20-%20correct%20-%20equally%2C%0A%09%09equally%3A%20equally%2C%0A%09%09accuracy%3A%20Math.round%28100%20%2a%20correct%20%2F%20%28inputData.length%20-%20equally%29%29%2C%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%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28%29%20%7B%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20%5BriskTrain%2C%20mseTrain%5D%20%3D%20calculateLoss%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20%5BriskValid%2C%20mseValid%5D%20%3D%20calculateLoss%28validInputArray%2C%20validOutputArray%29%3B%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validInputArray%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09decisionBuffer.noStroke%28%29%3B%0A%09for%20%28x%20%3D%200%3B%20x%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20x%20%3D%20x%20%2B%201%29%20%7B%0A%09%09for%20%28y%20%3D%200%3B%20y%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20y%20%3D%20y%20%2B%201%29%20%7B%0A%09%09%09let%20probabilityOfClass1%20%3D%20naiveBayesProbabilityOfFirstClass%28%5Bx%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%2C%20y%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%5D%29%3B%0A%09%09%09if%20%28probabilityOfClass1%20%3E%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20255%2C%20200%29%3B%20%2F%2F%20green%0A%09%09%09%7D%20else%20if%20%28probabilityOfClass1%20%3C%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20200%2C%20255%29%3B%20%2F%2F%20blue%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09decisionBuffer.fill%28255%2C%20255%2C%20255%29%3B%20%2F%2F%20white%0A%09%09%09%7D%0A%09%09%09decisionBuffer.rect%28DATA_SCALE%20%2a%20x%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20y%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%7D%0A%09%7D%0A%0A%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20labels%20to%20training%20and%20validation%20feature%20space%20%2F%2F%20wrong%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20trainCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20trainCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20validCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20validCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%20DATA_WINDOW_SIZE%20%2B%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%20%20%20%20%201%20%7C%7C%20%22%20%2B%20trainCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%20%20%20%20%22%20%2B%20riskTrain.toFixed%286%29%20%2B%20%22%20%7C%20%22%20%2B%20mseTrain.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20validCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%20%20%20%20%22%20%20%2B%20riskValid.toFixed%286%29%20%2B%20%22%20%7C%20%22%20%2B%20mseValid.toFixed%286%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%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%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%20circle%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%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%204%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%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%0Afunction%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20check%20for%20number%20of%20intervals%0A%09if%20%28ANZAHL_INTERVALLE%20%3C%202%20%7C%7C%20ANZAHL_INTERVALLE%20%3E%20100%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Die%20ANZAHL_INTERVALLE%20darf%20nur%20von%202%20bis%20100%20gehen.%22%29%3B%0A%09%09return%20false%3B%0A%09%7D%0A%0A%09%2F%2F%20initial%20console%20output%20%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20Training%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20%20Validation%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20Bayes-Risiko%20%7C%20%20%20%20%20%20MSE%20%7C%7C%20korrekt%20%7C%20Bayes-Risiko%20%7C%20%20%20%20%20%20MSE%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%20%2B%2040%29%3B%0A%0A%09%2F%2F%20text%20below%20networks%0A%09fill%28%22black%22%29%3B%0A%09noStroke%28%29%3B%0A%09textSize%2820%29%3B%0A%09text%28%22Naive%20Bayes%20%2B%20Statistik%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09textSize%28PIXEL_SIZE%20%2a%206%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%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%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20train%20model%0A%09naiveBayesCalculateHistogramsPriors%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09drawPrediction%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%0A%7D&css=&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&autorun=off&height=400px#NaiveBayes}}
  
 </WRAP> </WRAP>
  
 \\  \\ 
-==== - Stochastische Verfahren ====+==== - Stochastische Lösungsansätze ====
  
-Bei den stochastischen Verfahren werden die Werte aller Gewichte $w$ zufällig gewürfelt (Zufallszahlen) und anschliessend der Fehler mit den verfügbaren Daten berechnet. Dies wird viele Male wiederholt und am Ende die Gewichte-Einstellung mit dem kleinsten erzielten Fehler verwendet. Somit wird die Gewichte-Einstellung $w^*$ für welche $e_{min}=J(w^*)$ gilt, durch Zufall angenähert. +Bei den stochastischen Lösungsansätzen werden die Werte aller Gewichte $w$ zufällig gewürfelt (Zufallszahlen) und anschliessend der Fehler mit den verfügbaren Daten berechnet. Dies wird viele Male wiederholt und am Ende die Gewichte-Einstellung mit dem kleinsten erzielten Fehler verwendet. Somit wird die Gewichte-Einstellung $w^*$ für welche $e_{min}=J(w^*)$ gilt, durch Zufall angenähert. 
  
-Mit dieser Vorgehensweise können, im Gegensatz zu den in den Kapiteln 3.1 und 3.2 vorgestellten Verfahren, alle Varianten von Stellvertreter-Funktionen $f_{ML}(x)$ und Fehlerfunktionen $J(w)ohne Einschränkung verwendet werden.+Mit dieser Vorgehensweise können, im Gegensatz zu den in den Kapiteln 3.1 und 3.2 vorgestellten Lösungsansätzenim Prinzip alle Varianten von Stellvertreter-Funktionen $f_{ML}(x)$ und Fehlerfunktionen $J$ verwendet werden. Voraussetzung ist lediglich, dass zufällige Gewichtseinstellungen erzeugt und die zugehörigen Fehlerwerte mit den verfügbaren Daten berechnet werden können.
  
 Bekannte stochastische Verfahren sind Bekannte stochastische Verfahren sind
   * **Monte-Carlo**: Hier werden alle Gewichte rein zufällig gewürfelt.   * **Monte-Carlo**: Hier werden alle Gewichte rein zufällig gewürfelt.
   * **Simulated Annealing**: Hier wird eine vereinfachte Variante beschrieben: In einer ersten Runde werden alle Gewichte mehrfach, ohne Einschränkung zufällig gewürfelt. In mehreren weiteren Runden wird jeweils die beste Gewicht-Einstellung aus der vorangehenden Runde als Grundeinstellung genommen. Im Vergleich zur vorangehenden Runde wird jedoch nur noch ein kleinerer Teil der Gewichte neu gewürfelt, die anderen werden unverändert belassen.    * **Simulated Annealing**: Hier wird eine vereinfachte Variante beschrieben: In einer ersten Runde werden alle Gewichte mehrfach, ohne Einschränkung zufällig gewürfelt. In mehreren weiteren Runden wird jeweils die beste Gewicht-Einstellung aus der vorangehenden Runde als Grundeinstellung genommen. Im Vergleich zur vorangehenden Runde wird jedoch nur noch ein kleinerer Teil der Gewichte neu gewürfelt, die anderen werden unverändert belassen. 
-  * **Genetische Algorithmen**: Das funktioniert ähnlich wie simulated Annealung mit dem Unterschied, dass nach jeder Runde nicht nur mit der besten Gewicht-Einstellung weitergefahren wird, sondern mit mehreren. Zusätzlich werden immer wieder zwei solcher guten Einstellungen zufällig miteinander kombiniert.+  * **Genetische Algorithmen**: Das funktioniert ähnlich wie Simulated Annealing mit dem Unterschied, dass nach jeder Runde nicht nur mit der besten Gewicht-Einstellung weitergefahren wird, sondern mit mehreren. Zusätzlich werden immer wieder zwei solcher guten Einstellungen zufällig miteinander kombiniert.
  
 \\  \\ 
Zeile 176: Zeile 190:
 👉 Hier erfährst du, wie ein stochastisches Verfahren arbeitet. 👉 Hier erfährst du, wie ein stochastisches Verfahren arbeitet.
  
-💡 Um alle Resultate mit dem Neuronalen Netz aus 3.1 und dem Naive Bayes Klassifikator aus 3.2 vergleichen zu können, werden hier wiederum dieselben Daten verwendet. Im ersten Programm wird das Monte-Carlo Verfahren dazu verwendet, die Gewichte im neuronalen Netz aus 3.1 zu würfeln. Im zweiten Programm werden damit die Gewichte des Naive Bayes Klassifikators aus 3.2 gewürfelt. In beiden Experimenten kann gewählt werden, ob die Gewicht-Einstellung mit dem kleinsten MSE oder die Gewicht-Einstellung mit der höchsten Klassifikationsrate gesucht werden soll.  +💡 Um alle Resultate mit dem neuronalen Netz aus 3.1 und dem histogrammbasierten Naive-Bayes-Klassifikator aus 3.2 vergleichen zu können, werden hier wiederum dieselben Daten verwendet. Im ersten Programm wird das Monte-Carlo-Verfahren dazu verwendet, die Gewichte im neuronalen Netz aus 3.1 zu würfeln. Im zweiten Programm werden damit die Gewichte des histogrammbasierten Naive-Bayes-Klassifikators aus 3.2 gewürfelt. In beiden Experimenten kann gewählt werden, ob die Gewicht-Einstellung mit dem kleinsten MSE oder die Gewicht-Einstellung mit der höchsten Klassifikationsrate gesucht werden soll.  
  
-  * Teste das "Monte-Carlo neuronale Netz" und den "Monte-Carlo Naive Bayes Klassifikator" und beachte dabei Folgendes.+  * Teste das "Monte-Carlo neuronale Netz" und den "Monte-Carlo Naive-Bayes-Klassifikator" und beachte dabei Folgendes.
     * Neuronales Netz und Naive Bayes: Bei der ''OBJEKTIVE'' ''mse'' wird jeweils die Gewicht-Einstellung mit dem tiefsten MSE genommen, bei ''korrekt'' dasjenige mit der höchsten Klassifikationsrate.     * Neuronales Netz und Naive Bayes: Bei der ''OBJEKTIVE'' ''mse'' wird jeweils die Gewicht-Einstellung mit dem tiefsten MSE genommen, bei ''korrekt'' dasjenige mit der höchsten Klassifikationsrate.
     * Neuronales Netz: Mit ''MIN_WEIGHT'' und ''MAX_WEIGHT'' kann eingestellt werden, im welchem Zahlenbereich die Gewichte $w$ gewürfelt werden sollen (die Default-Einstellung sollte einigermassen ok sein).      * Neuronales Netz: Mit ''MIN_WEIGHT'' und ''MAX_WEIGHT'' kann eingestellt werden, im welchem Zahlenbereich die Gewichte $w$ gewürfelt werden sollen (die Default-Einstellung sollte einigermassen ok sein). 
Zeile 189: Zeile 203:
 == Monte-Carlo neuronales Netz == == Monte-Carlo neuronales Netz ==
  
-{{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%20MIN_WEIGHT%20%3D%20-5.0%3B%20%2F%2F%20ganzzahliger%20Wert%0Aconst%20MAX_WEIGHT%20%3D%205.0%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%20MIN_WEIGHT%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%203%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%201000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20100%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0Aconst%20OBJEKTIVE%20%3D%20%22mse%22%3B%20%2F%2F%20entweder%20%22mse%22%20oder%20%22korrekt%22%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%20200%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%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20store%20best%20weights%0Alet%20best_w11%2C%20best_w12%2C%20best_b1%2C%20best_w2%2C%20best_b2%3B%0A%2F%2F%20store%20best%20mse%20train%0Alet%20lowest_mseTrain%20%3D%20Number.MAX_VALUE%3B%0Alet%20highest_accuracy%20%3D%20-1%3B%0A%0A%2F%2F%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20validInput%2C%20validOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%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%20normalizedValidInputArray%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%09normalizedValidInputArray.push%28%5B%28validInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28validInputArray%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%20let%20trainOutput%20%3D%20tf.oneHot%28tf.tensor1d%28trainOutputArray%29.toInt%28%29%2C%202%29%3B%0A%09%2F%2F%20trainInput.print%28%29%3B%20%2F%2F%20Print%20Tensor%0A%0A%09%2F%2F%20generate%20validation%20input%20and%20output%20tensors%0A%09validInput%20%3D%20tf.tensor2d%28normalizedValidInputArray%2C%20%5BnormalizedValidInputArray.length%2C%202%5D%29%3B%0A%09validOutput%20%3D%20tf.tensor2d%28validOutputArray%2C%20%5BvalidOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20let%20validOutput%20%3D%20tf.oneHot%28tf.tensor1d%28validOutputArray%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%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%281%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%09%2F%2F%20there%20is%20no%20training%2C%20the%20model%20is%20just%20randomly%20initialized%0A%09%2F%2F%20the%20best%20initialization%20result%20is%20stored%20and%20drawn%0A%09for%20%28let%20epoch%20%3D%201%3B%20epoch%20%3C%20ANZAHL_EPOCHEN%3B%20epoch%20%3D%20epoch%20%2B%201%29%20%7B%0A%09%09%2F%2F%20generate%20random%20weights%0A%09%09let%20w11%20%3D%20%5B%5D%2C%0A%09%09%09w12%20%3D%20%5B%5D%2C%0A%09%09%09b1%20%3D%20%5B%5D%2C%0A%09%09%09w2%20%3D%20%5B%5D%2C%0A%09%09%09b2%20%3D%20%5B%5D%3B%0A%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_HIDDEN_NEURONS%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09%09w11.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%09w12.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%09b1.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%09w2.push%28%5B%5D%29%3B%0A%09%09%09w2%5Bi%5D.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%7D%0A%09%09b2.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%2F%2F%20write%20random%20weight%20tensors%0A%09%09model.layers%5B0%5D.setWeights%28%5Btf.tensor%28%5Bw11%2C%20w12%5D%29%2C%20tf.tensor%28b1%29%5D%29%3B%0A%09%09model.layers%5B1%5D.setWeights%28%5Btf.tensor%28w2%29%2C%20tf.tensor%28b2%29%5D%29%3B%0A%09%09%2F%2F%20calculate%20mse%20over%20training%20set%0A%09%09let%20training%20%3D%20model.predict%28trainInput%29.arraySync%28%29%3B%0A%09%09%2F%2F%20new%20record%3F%0A%09%09if%20%28OBJEKTIVE%20%3D%3D%3D%20%22mse%22%29%20%7B%0A%09%09%09let%20mseTrain%20%3D%20calculateMSE%28training%2C%20trainOutputArray%29%3B%0A%09%09%09if%20%28mseTrain%20%3C%20lowest_mseTrain%29%20%7B%0A%09%09%09%09%2F%2F%20store%20new%20record%0A%09%09%09%09lowest_mseTrain%20%3D%20mseTrain%3B%0A%09%09%09%09%2F%2F%20store%20record%20weights%0A%09%09%09%09best_w11%20%3D%20w11%3B%0A%09%09%09%09best_w12%20%3D%20w12%3B%0A%09%09%09%09best_b1%20%3D%20b1%3B%0A%09%09%09%09best_w2%20%3D%20w2%3B%0A%09%09%09%09best_b2%20%3D%20b2%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20%7B%0A%09%09%09let%20accuracy%20%3D%20calculatePercentageCorrect%28training%2C%20trainOutputArray%29.accuracy%3B%0A%09%09%09if%20%28accuracy%20%3E%20highest_accuracy%29%20%7B%0A%09%09%09%09%2F%2F%20store%20new%20record%0A%09%09%09%09highest_accuracy%20%3D%20accuracy%3B%0A%09%09%09%09%2F%2F%20store%20record%20weights%0A%09%09%09%09best_w11%20%3D%20w11%3B%0A%09%09%09%09best_w12%20%3D%20w12%3B%0A%09%09%09%09best_b1%20%3D%20b1%3B%0A%09%09%09%09best_w2%20%3D%20w2%3B%0A%09%09%09%09best_b2%20%3D%20b2%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20draw%20record%0A%09%09if%20%28%28epoch%20%25%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%3D%3D%200%29%20%7C%7C%20%28epoch%20%3D%3D%3D%201%29%29%20%7B%0A%09%09%09%2F%2F%20load%20record%20model%0A%09%09%09model.layers%5B0%5D.setWeights%28%5Btf.tensor%28%5Bbest_w11%2C%20best_w12%5D%29%2C%20tf.tensor%28best_b1%29%5D%29%3B%0A%09%09%09model.layers%5B1%5D.setWeights%28%5Btf.tensor%28best_w2%29%2C%20tf.tensor%28best_b2%29%5D%29%3B%0A%09%09%09%2F%2F%20draw%20prediction%20and%20wait%20for%20it%0A%09%09%09await%20drawPrediction%28epoch%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20mean%20squared%20error%0A%2F%2F%0Afunction%20calculateMSE%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09let%20mse%20%3D%200.0%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09mse%20%3D%20mse%20%2B%20%28predictedOutput%5Bi%5D%20-%20trueOutput%5Bi%5D%29%20%2a%2a%202%3B%0A%09%7D%0A%09return%20mse%20%2F%20predictedOutput.length%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28%28trueOutput%5Bi%5D%20%3D%3D%3D%201%20%26%26%20predictedOutput%5Bi%5D%20%3E%3D%200.5%29%20%7C%7C%20%28trueOutput%5Bi%5D%20%3D%3D%3D%200%20%26%26%20predictedOutput%5Bi%5D%20%3C%200.5%29%29%20%7B%0A%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09accuracy%3A%20Math.round%28correct%20%2a%20100%20%2F%20predictedOutput.length%29%2C%0A%09%09wrong%3A%20predictedOutput.length%20-%20correct%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%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Aasync%20function%20drawPrediction%28epoch%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%20validation%20%3D%20model.predict%28validInput%29.arraySync%28%29%3B%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20mseTrain%20%3D%20calculateMSE%28training%2C%20trainOutputArray%29%3B%0A%09let%20mseValid%20%3D%20calculateMSE%28validation%2C%20validOutputArray%29%3B%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28training%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validation%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20draw%20decision%20boundary%0A%09decisionBuffer.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%09decisionBuffer.fill%28Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%2C%20255%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%09decisionBuffer.fill%28Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%2C%20Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%2C%20255%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%09decisionBuffer.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%09decisionBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09decisionBuffer.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%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20labels%20to%20training%20and%20validation%20feature%20space%20%2F%2F%20wrong%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20trainCorrect.wrong%20%2B%20%22%20falsch%29%22%2C%202%20%2a%20PIXEL_SIZE%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%28%22%20%2B%20validCorrect.wrong%20%2B%20%22%20falsch%29%22%2C%20DATA_WINDOW_SIZE%20%2B%202%20%2a%20PIXEL_SIZE%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20epoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20trainCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20mseTrain.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20validCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20mseValid.toFixed%286%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20it%20is%20enough%20to%20wait%20for%201%20millisecond%20to%20make%0A%09%2F%2F%20the%20programm%20stop%20until%20the%20canvas%20is%20completed%0A%09return%20await%20waiting%281%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20wait%20for%20some%20milliseconds%0A%2F%2F%0Afunction%20waiting%28milliseconds%29%20%7B%0A%09return%20new%20Promise%28%28resolve%29%20%3D%3E%20%7B%0A%09%09setTimeout%28%28%29%20%3D%3E%20%7B%0A%09%09%09resolve%28%27resolved%27%29%3B%0A%09%09%7D%2C%20milliseconds%29%3B%0A%09%7D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%20%2F%202%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%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%20circle%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%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%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%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%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%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%20initial%20console%20output%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20Training%20%20%20%20%20%20%7C%7C%20%20%20%20%20Validation%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20%20%20%20%20%20MSE%20%7C%7C%20korrekt%20%7C%20%20%20%20%20%20MSE%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%20%2B%2040%29%3B%0A%0A%09%2F%2F%20text%20below%20networks%0A%09fill%28%22black%22%29%3B%0A%09noStroke%28%29%3B%0A%09textSize%2820%29%3B%0A%09if%20%28OBJEKTIVE%20%3D%3D%3D%20%22mse%22%29%20%7B%0A%09%09text%28%22Neuronales%20Netz%20%2B%20Monte%20Carlo%20%28MSE%29%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09%7D%20else%20%7B%0A%09%09text%28%22Neuronales%20Netz%20%2B%20Monte%20Carlo%20%28Korrekt%29%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09%7D%0A%09textSize%28PIXEL_SIZE%20%2a%203%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%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%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%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%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20%3D%20emergency%20stop%0A%2F%2F%0Afunction%20keyPressed%28%29%20%7B%0A%09if%20%28keyCode%20%3D%3D%3D%2027%29%20%7B%20%2F%2F%20ESC%20key%0A%09%09%2F%2F%20initiate%20stop%20of%20training%20after%20next%20epoch%0A%09%09model.stopTraining%20%3D%20true%3B%0A%09%09%2F%2F%20response%20to%20user%0A%09%09console.log%28%22Training%20wurde%20Abgebrochen%21%20Finales%20Resultat%3A%22%29%3B%0A%09%09%2F%2F%20draw%20final%20Prediction%0A%09%09drawPrediction%28actualEpoch%2C%20actualLogs.loss%29%3B%0A%09%7D%0A%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=400px#MonteCarloNN}}+{{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%20MIN_WEIGHT%20%3D%20-5.0%3B%20%2F%2F%20ganzzahliger%20Wert%0Aconst%20MAX_WEIGHT%20%3D%205.0%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%20MIN_WEIGHT%0Aconst%20ANZAHL_HIDDEN_NEURONS%20%3D%203%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20ANZAHL_EPOCHEN%20%3D%201000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20100%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0Aconst%20OBJEKTIVE%20%3D%20%22mse%22%3B%20%2F%2F%20entweder%20%22mse%22%20oder%20%22korrekt%22%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%20200%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%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20store%20best%20weights%0Alet%20best_w11%2C%20best_w12%2C%20best_b1%2C%20best_w2%2C%20best_b2%3B%0A%2F%2F%20store%20best%20mse%20train%0Alet%20lowest_mseTrain%20%3D%20Number.MAX_VALUE%3B%0Alet%20highest_accuracy%20%3D%20-1%3B%0A%0A%2F%2F%20global%20variables%0Alet%20model%2C%20trainInput%2C%20trainOutput%2C%20validInput%2C%20validOutput%2C%20testInput%2C%20actualEpoch%2C%20actualLogs%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%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%20normalizedValidInputArray%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%09normalizedValidInputArray.push%28%5B%28validInputArray%5Bi%5D%5B0%5D%20-%20trainInputMin%5B0%5D%29%20%2F%20%28trainInputMax%5B0%5D%20-%20trainInputMin%5B0%5D%29%2C%20%28validInputArray%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%20let%20trainOutput%20%3D%20tf.oneHot%28tf.tensor1d%28trainOutputArray%29.toInt%28%29%2C%202%29%3B%0A%09%2F%2F%20trainInput.print%28%29%3B%20%2F%2F%20Print%20Tensor%0A%0A%09%2F%2F%20generate%20validation%20input%20and%20output%20tensors%0A%09validInput%20%3D%20tf.tensor2d%28normalizedValidInputArray%2C%20%5BnormalizedValidInputArray.length%2C%202%5D%29%3B%0A%09validOutput%20%3D%20tf.tensor2d%28validOutputArray%2C%20%5BvalidOutputArray.length%2C%201%5D%29%3B%0A%09%2F%2F%20let%20validOutput%20%3D%20tf.oneHot%28tf.tensor1d%28validOutputArray%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%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%281%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%09%2F%2F%20there%20is%20no%20training%2C%20the%20model%20is%20just%20randomly%20initialized%0A%09%2F%2F%20the%20best%20initialization%20result%20is%20stored%20and%20drawn%0A%09for%20%28let%20epoch%20%3D%201%3B%20epoch%20%3C%20ANZAHL_EPOCHEN%20%2B%201%3B%20epoch%20%3D%20epoch%20%2B%201%29%20%7B%0A%09%09%2F%2F%20generate%20random%20weights%0A%09%09let%20w11%20%3D%20%5B%5D%2C%0A%09%09%09w12%20%3D%20%5B%5D%2C%0A%09%09%09b1%20%3D%20%5B%5D%2C%0A%09%09%09w2%20%3D%20%5B%5D%2C%0A%09%09%09b2%20%3D%20%5B%5D%3B%0A%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_HIDDEN_NEURONS%3B%20i%20%3D%20i%20%2B%201%29%20%7B%0A%09%09%09w11.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%09w12.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%09b1.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%09w2.push%28%5B%5D%29%3B%0A%09%09%09w2%5Bi%5D.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%7D%0A%09%09b2.push%28Math.floor%28Math.random%28%29%20%2a%20%28MAX_WEIGHT%20-%20MIN_WEIGHT%20%2B%201%29%20%2B%20MIN_WEIGHT%29%29%3B%0A%09%09%2F%2F%20write%20random%20weight%20tensors%0A%09%09model.layers%5B0%5D.setWeights%28%5Btf.tensor%28%5Bw11%2C%20w12%5D%29%2C%20tf.tensor%28b1%29%5D%29%3B%0A%09%09model.layers%5B1%5D.setWeights%28%5Btf.tensor%28w2%29%2C%20tf.tensor%28b2%29%5D%29%3B%0A%09%09%2F%2F%20calculate%20mse%20over%20training%20set%0A%09%09let%20training%20%3D%20model.predict%28trainInput%29.arraySync%28%29%3B%0A%09%09%2F%2F%20new%20record%3F%0A%09%09if%20%28OBJEKTIVE%20%3D%3D%3D%20%22mse%22%29%20%7B%0A%09%09%09let%20mseTrain%20%3D%20calculateMSE%28training%2C%20trainOutputArray%29%3B%0A%09%09%09if%20%28mseTrain%20%3C%20lowest_mseTrain%29%20%7B%0A%09%09%09%09%2F%2F%20store%20new%20record%0A%09%09%09%09lowest_mseTrain%20%3D%20mseTrain%3B%0A%09%09%09%09%2F%2F%20store%20record%20weights%0A%09%09%09%09best_w11%20%3D%20w11%3B%0A%09%09%09%09best_w12%20%3D%20w12%3B%0A%09%09%09%09best_b1%20%3D%20b1%3B%0A%09%09%09%09best_w2%20%3D%20w2%3B%0A%09%09%09%09best_b2%20%3D%20b2%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20%7B%0A%09%09%09let%20accuracy%20%3D%20calculatePercentageCorrect%28training%2C%20trainOutputArray%29.accuracy%3B%0A%09%09%09if%20%28accuracy%20%3E%20highest_accuracy%29%20%7B%0A%09%09%09%09%2F%2F%20store%20new%20record%0A%09%09%09%09highest_accuracy%20%3D%20accuracy%3B%0A%09%09%09%09%2F%2F%20store%20record%20weights%0A%09%09%09%09best_w11%20%3D%20w11%3B%0A%09%09%09%09best_w12%20%3D%20w12%3B%0A%09%09%09%09best_b1%20%3D%20b1%3B%0A%09%09%09%09best_w2%20%3D%20w2%3B%0A%09%09%09%09best_b2%20%3D%20b2%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20draw%20record%0A%09%09if%20%28%28epoch%20%25%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%3D%3D%200%29%20%7C%7C%20%28epoch%20%3D%3D%3D%201%29%29%20%7B%0A%09%09%09%2F%2F%20load%20record%20model%0A%09%09%09model.layers%5B0%5D.setWeights%28%5Btf.tensor%28%5Bbest_w11%2C%20best_w12%5D%29%2C%20tf.tensor%28best_b1%29%5D%29%3B%0A%09%09%09model.layers%5B1%5D.setWeights%28%5Btf.tensor%28best_w2%29%2C%20tf.tensor%28best_b2%29%5D%29%3B%0A%09%09%09%2F%2F%20draw%20prediction%20and%20wait%20for%20it%0A%09%09%09await%20drawPrediction%28epoch%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20mean%20squared%20error%0A%2F%2F%0Afunction%20calculateMSE%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09let%20mse%20%3D%200.0%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09mse%20%3D%20mse%20%2B%20%28predictedOutput%5Bi%5D%20-%20trueOutput%5Bi%5D%29%20%2a%2a%202%3B%0A%09%7D%0A%09return%20mse%20%2F%20predictedOutput.length%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28predictedOutput%2C%20trueOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20predictedOutput.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28%28trueOutput%5Bi%5D%20%3D%3D%3D%201%20%26%26%20predictedOutput%5Bi%5D%20%3E%3D%200.5%29%20%7C%7C%20%28trueOutput%5Bi%5D%20%3D%3D%3D%200%20%26%26%20predictedOutput%5Bi%5D%20%3C%200.5%29%29%20%7B%0A%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09accuracy%3A%20Math.round%28correct%20%2a%20100%20%2F%20predictedOutput.length%29%2C%0A%09%09wrong%3A%20predictedOutput.length%20-%20correct%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%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Aasync%20function%20drawPrediction%28epoch%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%20validation%20%3D%20model.predict%28validInput%29.arraySync%28%29%3B%0A%09let%20prediction%20%3D%20model.predict%28testInput%29.arraySync%28%29%3B%0A%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20mseTrain%20%3D%20calculateMSE%28training%2C%20trainOutputArray%29%3B%0A%09let%20mseValid%20%3D%20calculateMSE%28validation%2C%20validOutputArray%29%3B%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28training%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validation%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20draw%20decision%20boundary%0A%09decisionBuffer.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%09decisionBuffer.fill%28Math.round%28%281%20-%20prediction%5Belement%5D%5B0%5D%29%20%2a%20100%20%2B%20200.5%29%2C%20255%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%09decisionBuffer.fill%28Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%2C%20Math.round%28prediction%5Belement%5D%5B0%5D%20%2a%20100%20%2B%20200.5%29%2C%20255%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%09decisionBuffer.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%09decisionBuffer.fill%28%27red%27%29%3B%0A%09%09%09%7D%0A%09%09%09decisionBuffer.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%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20labels%20to%20training%20and%20validation%20feature%20space%20%2F%2F%20wrong%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20trainCorrect.wrong%20%2B%20%22%20falsch%29%22%2C%202%20%2a%20PIXEL_SIZE%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%28%22%20%2B%20validCorrect.wrong%20%2B%20%22%20falsch%29%22%2C%20DATA_WINDOW_SIZE%20%2B%202%20%2a%20PIXEL_SIZE%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20epoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20trainCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20mseTrain.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20validCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20mseValid.toFixed%286%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20it%20is%20enough%20to%20wait%20for%201%20millisecond%20to%20make%0A%09%2F%2F%20the%20programm%20stop%20until%20the%20canvas%20is%20completed%0A%09return%20await%20waiting%281%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20wait%20for%20some%20milliseconds%0A%2F%2F%0Afunction%20waiting%28milliseconds%29%20%7B%0A%09return%20new%20Promise%28%28resolve%29%20%3D%3E%20%7B%0A%09%09setTimeout%28%28%29%20%3D%3E%20%7B%0A%09%09%09resolve%28%27resolved%27%29%3B%0A%09%09%7D%2C%20milliseconds%29%3B%0A%09%7D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%20%2F%202%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%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%20circle%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%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%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%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%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%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%20initial%20console%20output%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20Training%20%20%20%20%20%20%7C%7C%20%20%20%20%20Validation%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20%20%20%20%20%20MSE%20%7C%7C%20korrekt%20%7C%20%20%20%20%20%20MSE%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%20%2B%2040%29%3B%0A%0A%09%2F%2F%20text%20below%20networks%0A%09fill%28%22black%22%29%3B%0A%09noStroke%28%29%3B%0A%09textSize%2820%29%3B%0A%09if%20%28OBJEKTIVE%20%3D%3D%3D%20%22mse%22%29%20%7B%0A%09%09text%28%22Neuronales%20Netz%20%2B%20Monte%20Carlo%20%28MSE%29%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09%7D%20else%20%7B%0A%09%09text%28%22Neuronales%20Netz%20%2B%20Monte%20Carlo%20%28Korrekt%29%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09%7D%0A%09textSize%28PIXEL_SIZE%20%2a%203%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%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%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%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%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20keyPressed%28%29%20ESC%20%3D%20emergency%20stop%0A%2F%2F%0Afunction%20keyPressed%28%29%20%7B%0A%09if%20%28keyCode%20%3D%3D%3D%2027%29%20%7B%20%2F%2F%20ESC%20key%0A%09%09%2F%2F%20initiate%20stop%20of%20training%20after%20next%20epoch%0A%09%09model.stopTraining%20%3D%20true%3B%0A%09%09%2F%2F%20response%20to%20user%0A%09%09console.log%28%22Training%20wurde%20Abgebrochen%21%20Finales%20Resultat%3A%22%29%3B%0A%09%09%2F%2F%20draw%20final%20Prediction%0A%09%09drawPrediction%28actualEpoch%2C%20actualLogs.loss%29%3B%0A%09%7D%0A%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=400px#MonteCarloNN}} 
  
 \\  \\ 
 == Monte-Carlo Naive Bayes == == Monte-Carlo Naive Bayes ==
  
-{{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%20ANZAHL_INTERVALLE%20%3D%208%3B%20%2F%2F%20ganzzahliger%20Wert%20zwischen%202%20und%20100%0Aconst%20ANZAHL_EPOCHEN%20%3D%201000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20100%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0Aconst%20OBJEKTIVE%20%3D%20%22mse%22%3B%20%2F%2F%20entweder%20%22mse%22%20oder%20%22korrekt%22%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%20MIN_NO_OF_INTERVALS%20%3D%201%3B%0Aconst%20MAX_NO_OF_INTERVALS%20%3D%20100%3B%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20200%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%20100%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0Aconst%20MILISEKUNDEN_GRAFIK_UPDATE%20%3D%20200%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0Aconst%20NoOfClasses%20%3D%202%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20global%20variables%0Alet%20testProbabilities%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%3B%0Alet%20BayesTable%20%3D%20%5B%5D%3B%0Alet%20BayesPriors%20%3D%20%5B%5D%3B%0A%0A%2F%2F%20store%20best%20priors%20and%20table%0Alet%20best_BayesTable%2C%20best_BayesPriors%3B%0Alet%20lowest_mseTrain%20%3D%20Number.MAX_VALUE%3B%0Alet%20highest_accuracy%20%3D%20-1%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%20Uniform%20random%20distributed%20number%20from%200%20including%201%0A%2F%2F%0Afunction%20randomPlus%28%29%20%7B%0A%09return%20random%28%29%20%3E%3D%200.5%20%3F%20Math.random%28%29%20%3A%201%20-%20Math.random%28%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20calculate%20histograms%20and%20priors%0A%2F%2F%0Afunction%20naiveBayesDrawHistogramsPriors%28%29%20%7B%0A%09%2F%2F%20many%20draws%0A%09for%20%28let%20e%20%3D%200%3B%20e%20%3C%20EPOCHEN_FUER_GRAFIK_UPDATE%3B%20e%20%3D%20e%20%2B%201%29%20%7B%0A%0A%09%09%2F%2F%20For%20each%20draw%2C%20reset%20table%20and%20priors%0A%09%09%2F%2F%20for%20each%20class%20c%0A%09%09BayesPriors%20%3D%20%5B%5D%3B%0A%09%09BayesTable%20%3D%20%5B%5D%3B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09BayesPriors.push%28randomPlus%28%29%29%3B%0A%09%09%09BayesTable.push%28%5B%5D%29%3B%0A%09%09%09%2F%2F%20for%20each%20input%20feature%20f%0A%09%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09%09let%20entrySum%20%3D%200%3B%0A%09%09%09%09BayesTable%5Bc%5D.push%28%5B%5D%29%3B%0A%09%09%09%09%2F%2F%20for%20each%20interval%20i%0A%09%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09%09BayesTable%5Bc%5D%5Bf%5D.push%28randomPlus%28%29%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%0A%09%09%2F%2F%20Scale%20Bayes%20table%20and%20table%0A%09%09let%20priorsSum%20%3D%200%3B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09priorsSum%20%3D%20priorsSum%20%2B%20BayesPriors%5Bc%5D%3B%0A%09%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09%09let%20intervalSum%20%3D%200%3B%0A%09%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09%09intervalSum%20%3D%20intervalSum%20%2B%20BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%3B%0A%09%09%09%09%7D%0A%09%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09%09if%20%28intervalSum%20%3E%200%29%20%7B%0A%09%09%09%09%09%09BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%3D%20BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%2F%20intervalSum%3B%0A%09%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09%09BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%3D%201%20%2F%20ANZAHL_INTERVALLE%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09if%20%28priorsSum%20%3E%200%29%20%7B%0A%09%09%09%09BayesPriors%5Bc%5D%20%3D%20BayesPriors%5Bc%5D%20%2F%20priorsSum%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09BayesPriors%5Bc%5D%20%3D%201%20%2F%20NoOfClasses%3B%0A%09%09%09%7D%0A%09%09%7D%0A%0A%09%09%2F%2F%20check%20for%20new%20record%20and%20store%20new%20record%0A%09%09if%20%28OBJEKTIVE%20%3D%3D%3D%20%22mse%22%29%20%7B%0A%09%09%09let%20mse%20%3D%20calculateMSE%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09%09%09if%20%28mse%20%3C%20lowest_mseTrain%29%20%7B%0A%09%09%09%09lowest_mseTrain%20%3D%20mse%3B%0A%09%09%09%09best_BayesTable%20%3D%20JSON.parse%28JSON.stringify%28BayesTable%29%29%3B%0A%09%09%09%09best_BayesPriors%20%3D%20JSON.parse%28JSON.stringify%28BayesPriors%29%29%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20%7B%0A%09%09%09let%20accuracy%20%3D%20calculatePercentageCorrect%28trainInputArray%2C%20trainOutputArray%29.accuracy%3B%0A%09%09%09if%20%28accuracy%20%3E%20highest_accuracy%29%20%7B%0A%09%09%09%09highest_accuracy%20%3D%20accuracy%3B%0A%09%09%09%09best_BayesTable%20%3D%20JSON.parse%28JSON.stringify%28BayesTable%29%29%3B%0A%09%09%09%09best_BayesPriors%20%3D%20JSON.parse%28JSON.stringify%28BayesPriors%29%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20determine%20probability%20that%20sample%20belongs%20to%20first%20class%0A%2F%2F%0Afunction%20naiveBayesProbabilityOfFirstClass%28inputSample%29%20%7B%0A%09%2F%2F%20local%20variables%0A%09let%20BayesProbabilities%20%3D%20%5B%5D%3B%0A%09let%20BayesSum%20%3D%200.0%3B%0A%09let%20interval%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20get%20interval%20for%20each%20input%20feature%20f%0A%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09interval.push%28Math.floor%28%28inputSample%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%7D%0A%09%09if%20%28interval%5Bf%5D%20%3C%200%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%200%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20unscaled%20Bayes%20probabilities%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%2F%2F%20calculate%20product%20of%20p%28xi%7CCj%29%20over%20all%20features%0A%09%09let%20product%20%3D%201%3B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09product%20%3D%20product%20%2a%20BayesTable%5Bc%5D%5Bf%5D%5Binterval%5Bf%5D%5D%3B%0A%09%09%7D%0A%09%09BayesProbabilities.push%28BayesPriors%5Bc%5D%20%2a%20product%29%3B%0A%09%09BayesSum%20%3D%20BayesSum%20%2B%20BayesProbabilities%5Bc%5D%3B%0A%09%7D%0A%09%2F%2F%20if%20no%20probability%20is%20assigned%20choose%20uniform%0A%09if%20%28BayesSum%20%3D%3D%3D%200%29%20%7B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09BayesProbabilities%5Bc%5D%20%3D%201%20%2F%20NoOfClasses%3B%0A%09%09%7D%0A%09%09BayesSum%20%3D%201%3B%0A%09%7D%0A%0A%09%2F%2F%20scale%20Bayes%20probabilites%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesProbabilities%5Bc%5D%20%3D%20BayesProbabilities%5Bc%5D%20%2F%20BayesSum%3B%0A%09%7D%0A%09%0A%09%2F%2F%20return%20probability%20of%20first%20class%0A%09return%20BayesProbabilities%5B0%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20mean%20squared%20error%0A%2F%2F%0Afunction%20calculateMSE%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20mse%20%3D%200.0%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09mse%20%3D%20mse%20%2B%20%28probabilityFirstClass%20-%20desiredOutput%5Bs%5D%29%20%2a%2a%202%3B%0A%09%7D%0A%09return%20mse%20%2F%20inputData.length%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09let%20equally%20%3D%200%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09if%20%28%28desiredOutput%5Bs%5D%20%3D%3D%3D%201%20%26%26%20probabilityFirstClass%20%3E%200.5%29%20%7C%7C%20%28desiredOutput%5Bs%5D%20%3D%3D%3D%200%20%26%26%20probabilityFirstClass%20%3C%200.5%29%29%20%7B%0A%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%7D%0A%09%09if%20%28probabilityFirstClass%20%3D%3D%3D%200.5%29%20%7B%0A%09%09%09equally%20%3D%20equally%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09samples%3A%20inputData.length%2C%0A%09%09correct%3A%20correct%2C%0A%09%09wrong%3A%20inputData.length%20-%20correct%20-%20equally%2C%0A%09%09equally%3A%20equally%2C%0A%09%09accuracy%3A%20Math.round%28100%20%2a%20correct%20%2F%20%28inputData.length%20-%20equally%29%29%2C%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%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28epoch%29%20%7B%0A%09%2F%2F%20restore%20best%20model%0A%09BayesTable%20%3D%20JSON.parse%28JSON.stringify%28best_BayesTable%29%29%3B%0A%09BayesPriors%20%3D%20JSON.parse%28JSON.stringify%28best_BayesPriors%29%29%3B%0A%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20mseTrain%20%3D%20calculateMSE%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20mseValid%20%3D%20calculateMSE%28validInputArray%2C%20validOutputArray%29%3B%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validInputArray%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09decisionBuffer.noStroke%28%29%3B%0A%09for%20%28x%20%3D%200%3B%20x%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20x%20%3D%20x%20%2B%201%29%20%7B%0A%09%09for%20%28y%20%3D%200%3B%20y%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20y%20%3D%20y%20%2B%201%29%20%7B%0A%09%09%09let%20probabilityOfClass1%20%3D%20naiveBayesProbabilityOfFirstClass%28%5Bx%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%2C%20y%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%5D%29%3B%0A%09%09%09if%20%28probabilityOfClass1%20%3E%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20255%2C%20200%29%3B%20%2F%2F%20green%0A%09%09%09%7D%20else%20if%20%28probabilityOfClass1%20%3C%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20200%2C%20255%29%3B%20%2F%2F%20blue%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09decisionBuffer.fill%28255%2C%20255%2C%20255%29%3B%20%2F%2F%20white%0A%09%09%09%7D%0A%09%09%09decisionBuffer.rect%28DATA_SCALE%20%2a%20x%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20y%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%7D%0A%09%7D%0A%0A%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20labels%20to%20training%20and%20validation%20feature%20space%20%2F%2F%20wrong%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20trainCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20trainCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20validCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20validCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%20DATA_WINDOW_SIZE%20%2B%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20%28epoch%2aEPOCHEN_FUER_GRAFIK_UPDATE%29.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20trainCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20mseTrain.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20validCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20mseValid.toFixed%286%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%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%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%20circle%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%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%204%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20wait%20for%20some%20milliseconds%0A%2F%2F%0Afunction%20waiting%28milliseconds%29%20%7B%0A%09return%20new%20Promise%28%28resolve%29%20%3D%3E%20%7B%0A%09%09setTimeout%28%28%29%20%3D%3E%20%7B%0A%09%09%09resolve%28%27resolved%27%29%3B%0A%09%09%7D%2C%20milliseconds%29%3B%0A%09%7D%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%20check%20for%20number%20of%20intervals%0A%09if%20%28ANZAHL_INTERVALLE%20%3C%202%20%7C%7C%20ANZAHL_INTERVALLE%20%3E%20100%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Die%20ANZAHL_INTERVALLE%20darf%20nur%20von%202%20bis%20100%20gehen.%22%29%3B%0A%09%09return%20false%3B%0A%09%7D%0A%0A%09%2F%2F%20initial%20console%20output%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20Training%20%20%20%20%20%20%7C%7C%20%20%20%20%20Validation%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20%20%20%20%20%20MSE%20%7C%7C%20korrekt%20%7C%20%20%20%20%20%20MSE%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%20%2B%2040%29%3B%0A%0A%09%2F%2F%20text%20below%20networks%0A%09fill%28%22black%22%29%3B%0A%09noStroke%28%29%3B%0A%09textSize%2820%29%3B%0A%09if%20%28OBJEKTIVE%20%3D%3D%3D%20%22mse%22%29%20%7B%0A%09%09text%28%22Naive%20Bayes%20%2B%20Monte%20Carlo%20%28MSE%29%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09%7D%20else%20%7B%0A%09%09text%28%22Naive%20Bayes%20%2B%20Monte%20Carlo%20%28Korrekt%29%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09%7D%0A%09textSize%28PIXEL_SIZE%20%2a%206%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%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%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20and%20evaluate%20models%0A%09for%20%28let%20e%20%3D%201%3B%20e%20%3C%20ANZAHL_EPOCHEN%20%2F%20EPOCHEN_FUER_GRAFIK_UPDATE%3B%20e%20%3D%20e%20%2B%201%29%20%7B%0A%09%09%2F%2F%20train%20model%0A%09%09naiveBayesDrawHistogramsPriors%28%29%3B%0A%0A%09%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09%09drawPrediction%28e%29%3B%0A%09%09await%20waiting%28MILISEKUNDEN_GRAFIK_UPDATE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20end%20of%20training%0A%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%0A%7D&css=&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&autorun=off&height=400px#MonteCarloNB}}+{{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%20ANZAHL_INTERVALLE%20%3D%208%3B%20%2F%2F%20ganzzahliger%20Wert%20zwischen%202%20und%20100%0Aconst%20ANZAHL_EPOCHEN%20%3D%201000%3B%20%2F%2F%20ganzzahliger%20Wert%20%3E%200%0Aconst%20EPOCHEN_FUER_GRAFIK_UPDATE%20%3D%20100%3B%20%2F%2F%20ganzzahlig%20Wert%20%3E%200%0Aconst%20OBJEKTIVE%20%3D%20%22mse%22%3B%20%2F%2F%20entweder%20%22mse%22%20oder%20%22korrekt%22%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%20MIN_NO_OF_INTERVALS%20%3D%201%3B%0Aconst%20MAX_NO_OF_INTERVALS%20%3D%20100%3B%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20200%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%20100%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0Aconst%20MILISEKUNDEN_GRAFIK_UPDATE%20%3D%20200%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0Aconst%20NoOfClasses%20%3D%202%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%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%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20global%20variables%0Alet%20testProbabilities%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%3B%0Alet%20BayesTable%20%3D%20%5B%5D%3B%0Alet%20BayesPriors%20%3D%20%5B%5D%3B%0A%0A%2F%2F%20store%20best%20priors%20and%20table%0Alet%20best_BayesTable%20%3D%20%5B%5D%3B%0Alet%20best_BayesPriors%20%3D%20%5B%5D%3B%0Alet%20lowest_mseTrain%20%3D%20Number.MAX_VALUE%3B%0Alet%20lowest_bayesRiskTrain%20%3D%20Number.MAX_VALUE%3B%0Alet%20highest_accuracy%20%3D%20-1%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%20Uniform%20random%20distributed%20number%20from%200%20including%201%0A%2F%2F%0Afunction%20randomPlus%28%29%20%7B%0A%09return%20random%28%29%20%3E%3D%200.5%20%3F%20Math.random%28%29%20%3A%201%20-%20Math.random%28%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20calculate%20histograms%20and%20priors%0A%2F%2F%0Afunction%20naiveBayesRandomHistogramsPriors%28%29%20%7B%0A%09%2F%2F%20many%20draws%0A%09for%20%28let%20e%20%3D%200%3B%20e%20%3C%20EPOCHEN_FUER_GRAFIK_UPDATE%3B%20e%20%3D%20e%20%2B%201%29%20%7B%0A%0A%09%09%2F%2F%20For%20each%20draw%2C%20reset%20table%20and%20priors%0A%09%09%2F%2F%20for%20each%20class%20c%0A%09%09BayesPriors%20%3D%20%5B%5D%3B%0A%09%09BayesTable%20%3D%20%5B%5D%3B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09BayesPriors.push%28randomPlus%28%29%29%3B%0A%09%09%09BayesTable.push%28%5B%5D%29%3B%0A%09%09%09%2F%2F%20for%20each%20input%20feature%20f%0A%09%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09%09let%20entrySum%20%3D%200%3B%0A%09%09%09%09BayesTable%5Bc%5D.push%28%5B%5D%29%3B%0A%09%09%09%09%2F%2F%20for%20each%20interval%20i%0A%09%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09%09BayesTable%5Bc%5D%5Bf%5D.push%28randomPlus%28%29%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%0A%09%09%2F%2F%20Scale%20Bayes%20table%20and%20table%0A%09%09let%20priorsSum%20%3D%200%3B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09priorsSum%20%3D%20priorsSum%20%2B%20BayesPriors%5Bc%5D%3B%0A%09%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09%09let%20intervalSum%20%3D%200%3B%0A%09%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09%09intervalSum%20%3D%20intervalSum%20%2B%20BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%3B%0A%09%09%09%09%7D%0A%09%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09%09if%20%28intervalSum%20%3E%200%29%20%7B%0A%09%09%09%09%09%09BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%3D%20BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%2F%20intervalSum%3B%0A%09%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09%09BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%3D%201%20%2F%20ANZAHL_INTERVALLE%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09if%20%28priorsSum%20%3E%200%29%20%7B%0A%09%09%09%09BayesPriors%5Bc%5D%20%3D%20BayesPriors%5Bc%5D%20%2F%20priorsSum%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09BayesPriors%5Bc%5D%20%3D%201%20%2F%20NoOfClasses%3B%0A%09%09%09%7D%0A%09%09%7D%0A%0A%09%09%2F%2F%20check%20for%20new%20record%20and%20store%20new%20record%0A%09%09if%20%28OBJEKTIVE%20%3D%3D%3D%20%22mse%22%29%20%7B%0A%09%09%09let%20mse%20%3D%20calculateMSE%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09%09%09if%20%28mse%20%3C%20lowest_mseTrain%29%20%7B%0A%09%09%09%09lowest_mseTrain%20%3D%20mse%3B%0A%09%09%09%09best_BayesTable%20%3D%20JSON.parse%28JSON.stringify%28BayesTable%29%29%3B%0A%09%09%09%09best_BayesPriors%20%3D%20JSON.parse%28JSON.stringify%28BayesPriors%29%29%3B%0A%09%09%09%7D%0A%09%09%7D%20else%20%7B%0A%09%09%09let%20accuracy%20%3D%20calculatePercentageCorrect%28trainInputArray%2C%20trainOutputArray%29.accuracy%3B%0A%09%09%09if%20%28accuracy%20%3E%20highest_accuracy%29%20%7B%0A%09%09%09%09highest_accuracy%20%3D%20accuracy%3B%0A%09%09%09%09best_BayesTable%20%3D%20JSON.parse%28JSON.stringify%28BayesTable%29%29%3B%0A%09%09%09%09best_BayesPriors%20%3D%20JSON.parse%28JSON.stringify%28BayesPriors%29%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20determine%20probability%20that%20sample%20belongs%20to%20first%20class%0A%2F%2F%20Use%20best%20Bayes%20table%20and%20priors%20found%20so%20far%20for%20this%0A%2F%2F%0Afunction%20naiveBayesProbabilityOfFirstClass%28inputSample%29%20%7B%0A%09%2F%2F%20local%20variables%0A%09let%20BayesProbabilities%20%3D%20%5B%5D%3B%0A%09let%20BayesSum%20%3D%200.0%3B%0A%09let%20interval%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20get%20interval%20for%20each%20input%20feature%20f%0A%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09interval.push%28Math.floor%28%28inputSample%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%7D%0A%09%09if%20%28interval%5Bf%5D%20%3C%200%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%200%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20unscaled%20Bayes%20probabilities%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%2F%2F%20calculate%20product%20of%20p%28xi%7CCj%29%20over%20all%20features%0A%09%09let%20product%20%3D%201%3B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09product%20%3D%20product%20%2a%20BayesTable%5Bc%5D%5Bf%5D%5Binterval%5Bf%5D%5D%3B%0A%09%09%7D%0A%09%09BayesProbabilities.push%28BayesPriors%5Bc%5D%20%2a%20product%29%3B%0A%09%09BayesSum%20%3D%20BayesSum%20%2B%20BayesProbabilities%5Bc%5D%3B%0A%09%7D%0A%09%2F%2F%20if%20no%20probability%20is%20assigned%20choose%20uniform%0A%09if%20%28BayesSum%20%3D%3D%3D%200%29%20%7B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09BayesProbabilities%5Bc%5D%20%3D%201%20%2F%20NoOfClasses%3B%0A%09%09%7D%0A%09%09BayesSum%20%3D%201%3B%0A%09%7D%0A%0A%09%2F%2F%20scale%20Bayes%20probabilites%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesProbabilities%5Bc%5D%20%3D%20BayesProbabilities%5Bc%5D%20%2F%20BayesSum%3B%0A%09%7D%0A%0A%09%2F%2F%20return%20probability%20of%20first%20class%0A%09return%20BayesProbabilities%5B0%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20Bayes%20risk%20and%20mean%20squared%20error%0A%2F%2F%0Afunction%20calculateMSE%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20mse%20%3D%200.0%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09mse%20%3D%20mse%20%2B%20%28probabilityFirstClass%20-%20desiredOutput%5Bs%5D%29%20%2a%2a%202%3B%0A%09%7D%0A%09mse%20%3D%20mse%20%2F%20inputData.length%3B%0A%09return%20mse%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09let%20equally%20%3D%200%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09if%20%28%28desiredOutput%5Bs%5D%20%3D%3D%3D%201%20%26%26%20probabilityFirstClass%20%3E%200.5%29%20%7C%7C%20%28desiredOutput%5Bs%5D%20%3D%3D%3D%200%20%26%26%20probabilityFirstClass%20%3C%200.5%29%29%20%7B%0A%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%7D%0A%09%09if%20%28probabilityFirstClass%20%3D%3D%3D%200.5%29%20%7B%0A%09%09%09equally%20%3D%20equally%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09samples%3A%20inputData.length%2C%0A%09%09correct%3A%20correct%2C%0A%09%09wrong%3A%20inputData.length%20-%20correct%20-%20equally%2C%0A%09%09equally%3A%20equally%2C%0A%09%09accuracy%3A%20Math.round%28100%20%2a%20correct%20%2F%20%28inputData.length%20-%20equally%29%29%2C%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%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28epoch%29%20%7B%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20mseTrain%20%3D%20calculateMSE%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20mseValid%20%3D%20calculateMSE%28validInputArray%2C%20validOutputArray%29%3B%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validInputArray%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09decisionBuffer.noStroke%28%29%3B%0A%09for%20%28x%20%3D%200%3B%20x%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20x%20%3D%20x%20%2B%201%29%20%7B%0A%09%09for%20%28y%20%3D%200%3B%20y%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20y%20%3D%20y%20%2B%201%29%20%7B%0A%09%09%09let%20probabilityOfClass1%20%3D%20naiveBayesProbabilityOfFirstClass%28%5Bx%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%2C%20y%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%5D%29%3B%0A%09%09%09if%20%28probabilityOfClass1%20%3E%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20255%2C%20200%29%3B%20%2F%2F%20green%0A%09%09%09%7D%20else%20if%20%28probabilityOfClass1%20%3C%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20200%2C%20255%29%3B%20%2F%2F%20blue%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09decisionBuffer.fill%28255%2C%20255%2C%20255%29%3B%20%2F%2F%20white%0A%09%09%09%7D%0A%09%09%09decisionBuffer.rect%28DATA_SCALE%20%2a%20x%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20y%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%7D%0A%09%7D%0A%0A%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20labels%20to%20training%20and%20validation%20feature%20space%20%2F%2F%20wrong%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20trainCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20trainCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20validCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20validCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%20DATA_WINDOW_SIZE%20%2B%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%22%20%2B%20epoch.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20trainCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20mseTrain.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20validCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20mseValid.toFixed%286%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%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%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%20circle%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%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%204%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20wait%20for%20some%20milliseconds%0A%2F%2F%0Afunction%20waiting%28milliseconds%29%20%7B%0A%09return%20new%20Promise%28%28resolve%29%20%3D%3E%20%7B%0A%09%09setTimeout%28%28%29%20%3D%3E%20%7B%0A%09%09%09resolve%28%27resolved%27%29%3B%0A%09%09%7D%2C%20milliseconds%29%3B%0A%09%7D%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%20check%20for%20number%20of%20intervals%0A%09if%20%28ANZAHL_INTERVALLE%20%3C%202%20%7C%7C%20ANZAHL_INTERVALLE%20%3E%20100%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Die%20ANZAHL_INTERVALLE%20darf%20nur%20von%202%20bis%20100%20gehen.%22%29%3B%0A%09%09return%20false%3B%0A%09%7D%0A%0A%09%2F%2F%20initial%20console%20output%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20Training%20%20%20%20%20%20%7C%7C%20%20%20%20%20Validation%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20%20%20%20%20%20MSE%20%7C%7C%20korrekt%20%7C%20%20%20%20%20%20MSE%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%20%2B%2040%29%3B%0A%0A%09%2F%2F%20text%20below%20networks%0A%09fill%28%22black%22%29%3B%0A%09noStroke%28%29%3B%0A%09textSize%2820%29%3B%0A%09if%20%28OBJEKTIVE%20%3D%3D%3D%20%22mse%22%29%20%7B%0A%09%09text%28%22Naive%20Bayes%20%2B%20Monte%20Carlo%20%28MSE%29%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09%7D%20else%20%7B%0A%09%09text%28%22Naive%20Bayes%20%2B%20Monte%20Carlo%20%28Klassifikationsrate%29%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09%7D%0A%09textSize%28PIXEL_SIZE%20%2a%206%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%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%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%09%2F%2F%20draw%20and%20evaluate%20models%0A%09for%20%28let%20e%20%3D%201%3B%20e%20%3C%20ANZAHL_EPOCHEN%20%2F%20EPOCHEN_FUER_GRAFIK_UPDATE%20%2B%201%3B%20e%20%3D%20e%20%2B%201%29%20%7B%0A%09%09%2F%2F%20train%20model%0A%09%09naiveBayesRandomHistogramsPriors%28%29%3B%0A%0A%09%09%2F%2F%20restore%20best%20result%20so%20far%0A%09%09BayesTable%20%3D%20JSON.parse%28JSON.stringify%28best_BayesTable%29%29%3B%0A%09%09BayesPriors%20%3D%20JSON.parse%28JSON.stringify%28best_BayesPriors%29%29%3B%0A%0A%09%09%2F%2F%20show%20best%20result%20so%20far%0A%09%09drawPrediction%28e%20%2a%20EPOCHEN_FUER_GRAFIK_UPDATE%29%3B%0A%09%09await%20waiting%28MILISEKUNDEN_GRAFIK_UPDATE%29%3B%0A%09%7D%0A%0A%09%2F%2F%20end%20of%20training%0A%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%0A%7D&css=&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&autorun=off&height=400px#MonteCarloNB}}
  
 ++++Unsere Meinung| ++++Unsere Meinung|
-Iterative Verfahren / Neuronale Netze+Iterative Lösungsansätze / Neuronale Netze
   * Neuronale Netze sind relativ gutmütige Verfahren, welche mit jeder Verteilung von Daten relativ gut zurechtkommen können.    * Neuronale Netze sind relativ gutmütige Verfahren, welche mit jeder Verteilung von Daten relativ gut zurechtkommen können. 
   * Das genaue Einstellen aller Parameter für ein neuronales Netz ist relativ aufwändig.    * Das genaue Einstellen aller Parameter für ein neuronales Netz ist relativ aufwändig. 
   * Ein Nachteil der neuronalen Netze besteht darin, dass nicht erklärt werden kann, warum ein neuronales Netz etwas entscheidet (Black Box).   * Ein Nachteil der neuronalen Netze besteht darin, dass nicht erklärt werden kann, warum ein neuronales Netz etwas entscheidet (Black Box).
-  * Für das Datenbeispiel mit den Kreisen und Kreuzen liefert das neuronale Netz normalerweise die besten Resultate+  * Für das Datenbeispiel mit den Kreisen und Kreuzen liefert das neuronale Netz bessere Resultate, als die anderen hier eingesetzten Verfahren
-Statistische Verfahren / Naive Bayes +Statistische Lösungsansätze / Naive Bayes 
-  * Die Qualität der Resultate eines statistischen Verfahrens hängt stark davon ab, wie gut die echte Verteilung der Daten mit der im Verfahren angenommenen "Form" der Verteilung übereinstimmt (hierwie gut sich die Daten mit mehreren Histogrammen beschreiben lassen). Passen die echte und die angenommene Verteilung gut zusammen, so lassen sich ähnlich gute oder bessere Resultate wie mit einem neuronalen Netz erzielen. Passen sie weniger gut zusammen, so wird in der Regel ein neuronales Netz bessere Resultate produzieren.+  * Die Qualität der Resultate eines statistischen Verfahrens hängt stark davon ab, wie gut die echten Daten mit den Modellannahmen (Histogrammeunabhänige Eingangsgrössenkompatibel sindPasst alles gut zusammen, so lassen sich ähnlich gute oder bessere Resultate wie mit einem neuronalen Netz erzielen. Passt alles weniger gut zusammen, so wird in der Regel ein neuronales Netz bessere Resultate produzieren.
   * Die meisten statistischen Verfahren lassen sich sehr schnell "trainieren"   * Die meisten statistischen Verfahren lassen sich sehr schnell "trainieren"
-  * Warum ein statistisches Verfahren etwas entscheidet, kann gut nachträglich aus den Gewichten herausgelesen werden. Inwieweit die angenommene Verteilung auf die echte Verteilung passt und inwieweit alle anderen vereinfachenden Annahmen des Verfahrens die Resultate beeinflussen, kann jedoch nur schlecht bestimmt werden. Diese Unsicherheit ist quasi die "Black Box" der statistischen Verfahren+  * Warum ein statistisches Verfahren etwas entscheidet, kann gut nachträglich aus den Gewichten herausgelesen werden.  
-  * Für das Datenbeispiel mit den Kreisen und Kreuzen liefert der Naive Bayes normalerweise leicht schlechtere Resultate. Insbesondere ist der Naive Bayes sehr anfällig auf Overfitting und produziert für einzelne Beispiele je 50% Wahrscheinlichkeiten für beide Klassen, d.h. es wird kein Entscheid gefällt.  +  * Für das Datenbeispiel mit den Kreisen und Kreuzen liefert der Naive Bayes normalerweise leicht schlechtere Resultate als das neuronale Netz. Insbesondere ist der Naive Bayes sehr anfällig auf Overfitting und produziert für einzelne Beispiele je 50 % Wahrscheinlichkeiten für beide Klassen, d. h. es wird kein Entscheid gefällt.  
-Stochastische Verfahren / Monte-Carlo neuronales Netz & Monte-Carlo Naive Bayes Klassifikator +Stochastische Lösungsansätze / Monte-Carlo neuronales Netz & Monte-Carlo Naive-Bayes-Klassifikator 
-  * Die Qualität der Resultate stochastischer Verfahren hängt von der Anzahl Versuche (hier Epochen) und vom Glück ab. Je nachdem können bessere, gleich gute oder schlechtere Resultate als mit anderen Verfahren erzeugt werden. Da die stochastischen Verfahren auch bezüglich Punktzahlen (hier  Klassifikationsrateoptimiert werden können, kann noch zielgerichteter nach geeigneten Lösungen gesucht werden. Für manche Anwendungen sind stochastische Verfahren die einzigen, welche überhaupt berechnet und somit eingesetzt werden können.+  * Die Qualität der Resultate stochastischer Verfahren hängt von der Anzahl Versuche (hier Epochen) und vom Glück ab. Je nachdem können bessere, gleich gute oder schlechtere Resultate als mit anderen Verfahren erzeugt werden. Da die stochastischen Verfahren auch bezüglich der Klassifikationsrate optimiert werden können, kann noch zielgerichteter nach geeigneten Lösungen gesucht werden. Für manche Anwendungen sind stochastische Verfahren die einzigen, welche überhaupt berechnet und somit eingesetzt werden können.
   * Das Training stochastischer Verfahren ist eine Frage der Rechnergeschwindigkeit, der Geduld und des Glücks.   * Das Training stochastischer Verfahren ist eine Frage der Rechnergeschwindigkeit, der Geduld und des Glücks.
-  * Der Blackbox-Charakter stochastischer Lösungen entspricht in etwa denjenigen der zugrundeliegenden Struktur (d.h. der verwendeten $f_{ML}(x)$ und $J(w)Varianten). Hinzu kommt noch, dass man sich nie sicher sein kann, ob bereits eine "gute" Lösung gefunden wurde. +  * Der Blackbox-Charakter stochastischer Lösungen entspricht denjenigen der zugrundeliegenden Struktur (d. h. der verwendeten $f_{ML}(x)$ und $J$). Hinzu kommt, dass man sich nie sicher sein kann, ob bereits eine "gute" Lösung gefunden wurde. 
-  *  Für das Datenbeispiel mit den Kreisen und Kreuzen liefern die beiden Monte-Carlo-Varianten vermutlich schlechtere Resultate. Was auffällt ist, dass es bei der Naive Bayes Variante für kaum einen Datenpunkt eine 50% Chance ausgegeben wird. D.h. für alle Datenpunkte wird ein eindeutiger Entscheid gefällt.+  * Für das Datenbeispiel mit den Kreisen und Kreuzen liefert die Monte-Carlo neuronale Netz Varianten vermutlich schlechtere Resultate, die Monte-Carlo Naive-Bayes-Klassifikator Variante je nach "Glück" vergleichbare Resultate. Was auffälltist, dass es bei der Naive-Bayes-Variante für kaum einen Datenpunkt eine 50% Chance ausgegeben wird. D. h.für alle Datenpunkte wird ein eindeutiger Entscheid gefällt.
  
 ++++ ++++
  
 +
 +🤩 Freiwillig für Schnelle oder Interessierte
 +  * 🐿️ Knacknuss: Vielleicht war dir aufgefallen, dass im Monte-Carlo Naive Bayes Programm das Bayes-Risiko gar nicht berechnet wird. Kannst du dir erklären, warum das Bayes-Risiko keine Aussagekraft für dieses Programm hat? ++Erklärung (hier klicken)|\\ \\ Beim Naive-Bayes-Klassifikator werden die Gewichte aus den Daten (hier die Kreise und Kreuze des Trainingssets) berechnet. Und zwar so, dass dabei automatisch das Bayes-Risiko bezüglich dieser Daten minimal wird. Werden die Gewichte zufällig gewählt, so passen diese Gewichte nicht mehr zum Trainingsset. D. h. die zufällig gewürfelten Gewichte stellen einen anderen, fiktiven Datensatz dar. Somit ist das zu diesen Gewichten gehörende Bayes-Risiko nicht minimal bezüglich des Trainingssets, sondern bezüglich des fiktiven Datensatzes. Da es aber immer um die Daten im Trainingsset geht, bringt eine Berechnung des Bayes-Risiko bei zufällig gewürfelten Gewichten nichts.\\ \\ Anders sieht es beim MSE und bei der Klasifikationsrate aus. Da diese beiden Grössen immer Bezug zu den Trainingsdaten nehmen (die Desired Outputs gehen im Gegensatz zum Bayes-Risiko in die Formeln mit ein), sind diese Grössen für die verschiedenen, zufälligen Gewichtskonfigurationen vergleichbar.\\ \\ ++
 </WRAP> </WRAP>
  
p/ki/machinelearning2.1783597743.txt.gz · Zuletzt geändert: von Ralf Kretzschmar