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 16:26] – [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 55: Zeile 57:
 ===== - Die NĂ€herung der NĂ€herung mit Annahmen und Verfahren 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 87: 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 115: 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 179: 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 192: 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.1783607162.txt.gz · Zuletzt geÀndert: von Ralf Kretzschmar