| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung |
| p:ki:machinelearning2 [2026/07/10 11:02] – [4.2 Statistische Lösungsansätze] Ralf Kretzschmar | p:ki:machinelearning2 [2026/07/11 10:27] (aktuell) – [4.3 Stochastische Lösungsansätze] Ralf Kretzschmar |
|---|
| \\ 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", d. h. 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$ zu. Je 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. |
| 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. | 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$ der gewünschte 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. | 💡 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. | Alle der nachfolgenden Beispiele beziehen sich auf Supervised Learning. |
| \\ 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 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 beinhaltet. Die Gewichte $w$ werden so gewählt, dass die angenommene Verteilung möglichst gut an die verfügbaren Daten angepasst wird. Dies passiert in der Regel in einem oder mehreren Rechnungsschritten, welche den gesamten Datensatz berücksichtigen. Die Fehlerfunktion $J$ wird bei den statistischen Lösungsansätzen als **Risiko** bezeichnet, das minimiert 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 $J$ im Rahmen der getroffenen Annahmen möglichst klein wird. Diese Minimierung bleibt näherungsweise, weil 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 Risiko, der empirische Fehler von $J$ als empirisches Risiko bezeichnet.) |
| |
| Ein einfaches statistisches Verfahren ist der histogrammbasierte 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 (es wird beim histogrammbasierten Naive-Bayes-Klassifikator angenommen, dass sich die Datenverteilungen als Histogramme darstellen lassen). | Ein einfaches statistisches Verfahren ist der histogrammbasierte 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 (es wird beim histogrammbasierten Naive-Bayes-Klassifikator angenommen, dass sich die Datenverteilungen als Histogramme darstellen lassen). |
| 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. | 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)}$ |
| |
| |
| \\ | \\ |
| 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)$: Das 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. |
| |
| \\ | \\ |
| 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)]$ |
| |
| |
| \\ | \\ |
| 💡 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$ 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ündender Vergleichbarkeit werden als Fehlerfunktionen das Bayes-Risiko und der MSE 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. |
| {{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ätzen, im 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. |
| |
| \\ | \\ |
| 👉 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). |
| == 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 (hier, wie 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 (Histogramme, unabhänige Eingangsgrössen) kompatibel sind. Passt 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 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. | * 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ä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. |
| |
| ++++ | ++++ |
| |
| | |
| | 🤩 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> |
| |