| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung |
| p:ki:machinelearning2 [2026/07/10 10:00] – [4.1 Iterative 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. |
| Neuronale Netze und Gradientenverfahren werden in den Teilen 3 und 4 dieser Reihe genauer erklärt. | Neuronale Netze und Gradientenverfahren werden in den Teilen 3 und 4 dieser Reihe genauer erklärt. |
| |
| | \\ |
| <WRAP center round box > | <WRAP center round box > |
| == ✍ Auftrag neuronales Netz iterativ trainieren == | == ✍ Auftrag neuronales Netz iterativ trainieren == |
| 👉 Hier erfährst du, wie ein iteratives Verfahren arbeitet. | 👉 Hier erfährst du, wie ein iterativer Lösungsansatz arbeitet. |
| |
| 💡 Das folgende neuronale Netz besitzt zwei Eingänge, die x- und die y-Koordinaten der abgebildeten Kreise und Kreuze. Weiter besitzt es einen einzigen Ausgang $y$ der Werte von 0 bis 1 annehmen kann. Alle Ausgangswerte $y>0.5$ werden als Kreuze erkannt, alle Ausgangswerte $y\le0.5$ als Kreise. Als Fehlerfunktion wird der mean squared error (MSE) genutzt, welcher den Mittelwert aller Differenzquadrate $(y - d)^2$ bezeichnet. Der desired Output $d$ wird dabei für einen Kreis auf $d=1$ gesetzt und für ein Kreuz auf $d=0$. Die rote Linie stellt die Ausgangswerte $y = 0.5$ dar und wird als "decision Boundary" bezeichnet. | 💡 Das folgende neuronale Netz besitzt zwei Eingänge, die x- und die y-Koordinaten der abgebildeten Kreise und Kreuze. Weiter besitzt es einen einzigen Ausgang $y$ der Werte von 0 bis 1 annehmen kann. Alle Ausgangswerte $y>0.5$ werden als Kreuze erkannt, alle Ausgangswerte $y\le0.5$ als Kreise. Als Fehlerfunktion wird der **Mean Squared Error** (MSE) genutzt, welcher den Mittelwert aller Differenzquadrate $(y - d)^2$ bezeichnet. Der desired Output $d$ wird dabei für einen Kreis auf $d=1$ gesetzt und für ein Kreuz auf $d=0$. Die rote Linie stellt die Ausgangswerte $y = 0.5$ dar und wird als **Decision Boundary** bezeichnet. Zusätzlich zum MSE wird auch die Klassifikationsrate (Prozentsatz korrekt) erhoben und die Qualität des neuronalen Netzes beschrieben. Achtung, die Klassifikationsrate wird nicht dazu verwendet, das neuronale Netz zu trainineren((die Klassifikationsrate lässt sich nicht wie verlangt nach den Gewichten $w$ ableiten)). |
| |
| * Starte das neuronale Netz ein paar mal. Das neuronale Netz wird mit den Daten links trainiert. Wie gut das trainierte neuronale Netz ist, wird mit den nicht für das Training verwendeten "Validationsdaten" rechts geprüft. Eine Epoche bezeichnet einen Trainingsdurchgang. Beachte wie schrittweise der MSE (in der Console) und somit auch die Klassifikationsrate (Prozentsatz korrekt) verbessert werden. Beachte auch, dass jedes Training von anderen zufällig gewählten Gewicht-Einstellungen aus gestartet wird und somit zu einem anderen Trainingsverlauf führt. | * Starte das neuronale Netz ein paar Mal. Das neuronale Netz wird mit den Daten links trainiert. Wie gut das trainierte neuronale Netz ist, wird mit den nicht für das Training verwendeten "Validationsdaten" rechts geprüft. Eine Epoche bezeichnet einen Trainingsdurchgang. Beachte, wie schrittweise der MSE (in der Console) und damit auch tendenziell die Klassifikationsrate verbessert werden. Beachte auch, dass jedes Training von anderen zufällig gewählten Gewichtseinstellungen aus gestartet wird und somit zu einem anderen Trainingsverlauf führt. |
| * Verändere die Trainings- und Updateparameter oben im Programmcode. Versuche ein paar Minuten lang zu erreichen, dass die Trainings- und Validationsergebnisse möglichst gleich und möglichst gut sind. Wenn du genug hast, halte deine besten Resultate im Textfeld fest. | * Verändere die Trainings- und Updateparameter oben im Programmcode. Versuche, ein paar Minuten lang zu erreichen, dass die Trainings- und Validationsergebnisse am Ende möglichst gleich und möglichst gut sind. Wenn du genug hast, halte deine besten Resultate im Textfeld fest. |
| * Die ''LERNRATE'' bestimmt die Lerngeschwindigkeit, wobei bei einer zu hohen Lernrate das neuronale Netz "wild hin und her springt". | * Die ''LERNRATE'' bestimmt die Lerngeschwindigkeit, wobei bei einer zu hohen Lernrate das neuronale Netz "wild hin und her springt". |
| * Die ''ANZAHL_HIDDEN_NEURONEN'' ist mit der Anzahl Gewichte verknüpft. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt "Overfitting" auf, d.h. die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate). | * Die ''ANZAHL_HIDDEN_NEURONEN'' ist mit der Anzahl Gewichte verknüpft. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt "Overfitting" auf, d. h. die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate). |
| * Mit ''ANZAHL_EPOCHEN'' und ''EPOCHEN_FUER_GRAFIK_UPDATE'' kann eingestellt werden, wie lange trainiert und wie oft die Resultate und die Grafik aktualisiert werden soll. | * Mit ''ANZAHL_EPOCHEN'' und ''EPOCHEN_FUER_GRAFIK_UPDATE'' kann eingestellt werden, wie lange trainiert und wie oft die Resultate und die Grafik aktualisiert werden soll. |
| {{gem/plain?0=N4XyA#2853c02d7e52e73e}} | {{gem/plain?0=N4XyA#2853c02d7e52e73e}} |
| |
| \\ | \\ |
| ==== - Statistische Verfahren ==== | ==== - Statistische Lösungsansätze ==== |
| <WRAP right box width=341px>{{gdraw>1w5RCPEApyUwg7CCcSrNNGP6k-h53kM-cUTxSX70b9E0 width=236 center}} | <WRAP right box width=341px>{{gdraw>1w5RCPEApyUwg7CCcSrNNGP6k-h53kM-cUTxSX70b9E0 width=236 center}} |
| \\ Abb.2: Illustration Naive Bayes((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])).</WRAP> | \\ Abb.2: Illustration Naive Bayes((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])).</WRAP> |
| |
| Bei den statistischen Verfahren wird ermittelt, wie die Daten wertmässig verteilt sind. Dabei wird eine bestimmte, vorgegebene "Form" der Verteilung als Funktion $f_{ML}(x)$ genutzt und diese mithilfe der Einstellung mehrerer Gewichte $w$ möglichst gut an die Daten angepasst. Für die Anpassung der Gewichte $w$ werden in der Regel die Eingangsgrössen $x$ jedes Datenpunktes und die zugehörigen desired Outputs $d$ berücksichtigt. Die statistischen Verfahren sind so konstruiert, dass durch die Hinzunahme aller Daten direkt die Gewicht-Einstellung $w^*$ geschätzt wird, für welche $e_{min}=J(w^*)$ gilt, wobei $J(w)$ als "Risiko", das es zu minimieren gilt, bezeichnet wird. | Bei den statistischen Lösungsansätzen wird ermittelt, wie die Daten wertmässig verteilt sind. Dazu wird eine Stellvertreter-Funktion $f_{ML}(x)$ verwendet, welche bestimmte Annahmen über die "Form" der Verteilung und weitere Annahmen beinhaltet. Basierend auf den verfügbaren Daten werden die Gewichte $w$ mithilfe statistischer Formeln so berechnet, dass die Fehlerfunktion $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.) |
| |
| Da die wahre Verteilung der Daten normalerweise nicht bekannt ist, stellt die Wahl einer vorgegebenen "Form" für die Verteilung eine Näherung dar. Weiter treffen die gängigen statistischen Verfahren für ihre Berechnungen zusätzliche vereinfachende Annahmen, welche ebenfalls als Näherungen angesehen werden können. | 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 Naive Bayes Klassifikator, welcher verschiedene Klassen unterscheiden kann. Dabei wird für jede Klasse deren Häufigkeit ermittelt und für jede Klasse und jede Eingangsgrösse ein eigenes Histogramm aus den Daten erstellt. Ein Beispiel ist in Abb.2 illustriert. Es geht darum, mit zwei Eingangsgrössen $x_1$ und $x_2$ die beiden Klassen $A$ und $B$ zu unterscheiden. Das Histogramm in der Abbildung oben zeigt die Eingangsgrösse $x_1$ für die Datenpunkte, welche zur Klasse $A$ gehören. Ebenso (aber hier nicht abgebildet) werden drei weitere Histogramme für die Eingangsgrössen der Datenpunkte der Klasse $A$ sowie für die Eingangsgrössen $x_1$ und $x_2$ der Datenpunkte der Klasse $B$ erstellt. Die Abbildung unten zeigt, wie der Datenraum durch die Histogramme in "Zellen" unterteilt wird. Für jede Zelle wird basierend auf den Histogrammen Auftretenswahrscheinlichkeiten der Klassen $A$ und $B$ berechnet. Daraufhin wird jede Zelle derjenigen Klasse zugeordnet, welche den höheren Wahrscheinlichkeitswert aufweist. | Ein Beispiel ist in Abb.2 illustriert. Dabei werden mit zwei Eingangsgrössen $x_1$ und $x_2$ die beiden Klassen $A$ und $B$ unterschieden. Das Histogramm in der Abbildung oben zeigt die Eingangsgrösse $x_1$ für die Datenpunkte, welche zur Klasse $A$ gehören. Ebenso (aber hier nicht abgebildet) werden drei weitere Histogramme berechnet, eines für die Eingangsgrösse $x_2$ der Klasse $A$ sowie zwei weitere für die Eingangsgrössen $x_1$ und $x_2$ der Datenpunkte der Klasse $B$ erstellt. Die Abbildung unten zeigt, wie der Datenraum durch die Histogramme in "Zellen" unterteilt wird. Für jede Zelle werden basierend auf den Histogrammen die Auftretenswahrscheinlichkeiten der Klassen $A$ und $B$ berechnet. Daraufhin wird jede Zelle derjenigen Klasse zugeordnet, welche den höheren Wahrscheinlichkeitswert aufweist. |
| |
| Die Häufigkeit der Klassen und die Höhen der einzelnen Histogramm-Balken stellen im Naive Bayes Klassifikator die Gewichte $w$ dar. Durch "Zählen" der Daten wird so direkt die Gewicht-Einstellung $w^*$ geschätzt, für welche $e_{min}=J(w^*)$ gilt. Für das Zählen genügt es, alle Trainingsdaten einmal anzusehen, d. h., es genügt eine Epoche für das Training. | Die Häufigkeit der Klassen und die Höhen der einzelnen Histogramm-Balken stellen im histogrammbasierten Naive-Bayes-Klassifikator die Gewichte $w$ dar. Durch "Zählen" der Daten wird so direkt die Gewicht-Einstellung $w^*$ geschätzt, für welche $e_{min}=J(w^*)$ gilt. Für das Zählen genügt es, alle Trainingsdaten einmal anzusehen, d. h., es genügt eine Epoche für das Training. |
| |
| <WRAP clear/> | <WRAP clear/> |
| ++++Falls du wissen möchtest, wie der Naive Bayes Klassifikator genau aufgebaut ist und das Bayes-Risiko aussieht, klicke hier!| | ++++Wenn du wissen willst, wie der histogrammbasierte Naive-Bayes-Klassifikator im Detail aussieht, klicke hier!| |
| \\ | \\ |
| Der Naive Bayes Klassifikator nutzt die folgende Formel (eine Abwandlung der [[wpde>Satz_von_Bayes|Bayesischen Formel]] aus der Wahrscheinlichkeitstheorie): | Der histogrammbasierte Naive-Bayes-Klassifikator nutzt die folgende Formel (eine Abwandlung der [[wpde>Satz_von_Bayes|Bayesischen Formel]] aus der Wahrscheinlichkeitstheorie): |
| |
| \\ | |
| $P(C_j|x) = \displaystyle\frac{P(C_j)\:\displaystyle\prod^n_{i=1}\:p(x_i|C_j)}{p(x)}$ | $P(C_j|x) = \displaystyle\frac{P(C_j)\:\displaystyle\prod^n_{i=1}\:p(x_i|C_j)}{p(x)}$ |
| |
| \\ | \\ |
| Training, so werden alle "Gewichte" aus den Trainingsdaten berechnet: | Training, so werden alle "Gewichte" aus den Trainingsdaten berechnet: |
| * $P(C_j)$ dafür wird gezählt, wie viele Datenpunkte zur Klasse $C_j$ gehören und diese Anzahl durch die Anzahl Datenpunkte geteilt. | * $P(C_j)$: Dafür wird gezählt, wie viele Datenpunkte zur Klasse $C_j$ gehören, und diese Anzahl durch die Anzahl der Datenpunkte geteilt. |
| * $p(x_i|C_j)$ das ist das Histogramm für die Eingangsgrösse $x_i$ aller Datenpunkte der Klasse $C_j$, wobei die Anzahl Datenpunkte in jedem Intervall durch die Anzahl Datenpunkte in der Klasse $C_j$ geteilt wird. Die Intervalle sind alle gleich breit und fangen beim kleinsten Wert der jeweiligen Eingangsgrösse im Datenset an (unabhängig von der Klasse) und hören beim grössten Wert auf (wie in der Abbildung gezeigt). | * $p(x_i|C_j)$: Ist das Histogramm für die Eingangsgrösse $x_i$ aller Datenpunkte der Klasse $C_j$, wobei die Anzahl der Datenpunkte in jedem Intervall durch die Anzahl der Datenpunkte in der Klasse $C_j$ geteilt wird. Die Intervalle sind alle gleich breit und fangen beim kleinsten Wert der jeweiligen Eingangsgrösse im Datenset an (unabhängig von der Klasse) und hören beim grössten Wert auf (wie in der Abbildung gezeigt). |
| * $p(x)$ kann weggelassen werden, da für einen gegebenen Datenpunkt $x$ dieser Wert für alle $P(C_j|x)$ gleich ist. Am Ende werden für einen zu klassifizierten Datenpunkt $x$ die $P(C_j|x)$ für alle Klassen $C_j$ ausgerechnet und so skaliert, dass die Summe aller $P(C_j|x)$ genau $1$ ergibt. | * $p(x)$: Wird weggelassen, da für einen gegebenen Datenpunkt $x$ dieser Wert für alle $P(C_j|x)$ gleich ist. Am Ende werden für einen zu klassifizierenden Datenpunkt $x$ die $P(C_j|x)$ für alle Klassen $C_j$ ausgerechnet und so skaliert, dass die Summe aller $P(C_j|x)$ genau $1$ ergibt. |
| |
| \\ | \\ |
| Anwendung des fertigen Naive Bayes Klassifikators, d.h. so werden für den Datenpunkt $x$ die Wahrscheinlichkeiten $P(C_j|x)$ ausgerechnet: | Anwendung des fertigen histogrammbasierten Naive-Bayes-Klassifikators, d. h. so werden für den Datenpunkt $x$ die Wahrscheinlichkeiten $P(C_j|x)$ ausgerechnet: |
| * $p(x_i|C_j)$ dafür wird im Histogramm, das zur Eingangsgrösse $x_i$ und Klasse $C_j$ gehört, nachgeschaut, in welchem Intervall der Wert der Eingangsgrösse $x_i$ des Datenpunkts $x$ zu liegen kommt. Dieser Wert (die Höhe) dieses Intervalls wird als $p(x_i|C_j)$ genommen. | * $p(x_i|C_j)$: Dafür wird im Histogramm, das zur Eingangsgrösse $x_i$ und Klasse $C_j$ gehört, nachgeschaut, in welchem Intervall der Wert der Eingangsgrösse $x_i$ des Datenpunkts $x$ zu liegen kommt. Dieser Wert (die Höhe) dieses Intervalls wird als $p(x_i|C_j)$ genommen. |
| * $\Pi^n_{i=1}\:p(x_i|C_j)$ ist das Produkt aller Werte $p(x_i|C_j)$ für den Datenpunkt $x$, welche zur Klasse $C_j$ gehören. | * $\Pi^n_{i=1}\:p(x_i|C_j)$: Das ist das Produkt aller Werte $p(x_i|C_j)$ für den Datenpunkt $x$, welche zur Klasse $C_j$ gehören. |
| * $P(C_j)$ wird direkt verwendet | * $P(C_j)$: Das wird direkt verwendet. |
| * $p(x)$ wird ignoriert | * $p(x)$: Wird weggelassen (Begründung siehe oben). |
| * Mit der Formel des Naive Bayes Klassifikators werden die $P(C_j|x)$ für alle Klassen $C_j$ für den Datenpunkt $x$ ausgerechnet. Am Ende wird jedes $P(C_j|x)$ noch durch die Summe aller $P(C_j|x)$ geteilt, um echte Wahrscheinlichkeiten zu erhalten. | * Mit der Formel des Naive-Bayes-Klassifikators werden die $P(C_j|x)$ für alle Klassen $C_j$ für den Datenpunkt $x$ ausgerechnet. Am Ende wird jedes $P(C_j|x)$ noch durch die Summe aller $P(C_j|x)$ geteilt, um echte Wahrscheinlichkeiten zu erhalten. |
| * Dasjenige $P(C_j|x)$ mit dem höchsten Wert zeigt an, welches die wahrscheinlichste Klasse für den Datenpunkt $x$ ist und mit welcher Wahrscheinlichkeit das zutrifft. | * Dasjenige $P(C_j|x)$ mit dem höchsten Wert zeigt an, welches die wahrscheinlichste Klasse für den Datenpunkt $x$ ist und mit welcher Wahrscheinlichkeit das zutrifft. |
| |
| \\ | \\ |
| Der Naive Bayes Klassifikator minimiert das Bayes-Risiko | Als Fehlerfunktion dient beim histogrammbasierten Naive-Bayes-Klassifikator das Bayes-Risiko: |
| |
| \\ | |
| $Bayes\text{-}Risiko = 1 - E_x[P(C_{max}|x)]$ | $Bayes\text{-}Risiko = 1 - E_x[P(C_{max}|x)]$ |
| |
| * $P(C_{max}|x)$ ist die Wahrscheinlichkeit, mit welcher die vorhergesagte Klasse $C$ für den Datenpunkt $x$ korrekt ist. Das $max$ kommt daher, dass immer diejenige Klasse mit der höchsten Wahrscheinlichkeit $P(C_j|x)$ auswählt wird. | * $P(C_{max}|x)$ ist die Wahrscheinlichkeit, mit welcher die vorhergesagte Klasse $C$ für den Datenpunkt $x$ korrekt ist. Das $max$ kommt daher, dass immer diejenige Klasse mit der höchsten Wahrscheinlichkeit $P(C_j|x)$ ausgewählt wird. |
| * $E_x$ ist der Erwartungswert, d. h. der Durchschnitt aller $P(C_{max}|x)$ aller Datenpunkte $x$. | * $E_x$ ist der Erwartungswert, d. h. der Durchschnitt aller $P(C_{max}|x)$ aller Datenpunkte $x$. |
| * Das $1 -$ macht aus dem Erwartungswert der Wahrscheinlichkeit ein Risiko, das umso kleiner, umso besser ist. | * Das $1 -$ macht aus dem Erwartungswert der Wahrscheinlichkeit ein Risiko, das umso kleiner, umso besser ist. |
| |
| \\ | \\ |
| 💡 Der Naive Bayes Klassifikator geht von der Annahme aus, dass alle Eingangsgrössen $x_i$ statistisch voneinander unabhängig sind, was in der Praxis kaum je zutrifft. Z.B. sind für das Unterscheiden verschiedener Fischarten die beiden Eingangsgrössen "Masse" und "Länge" nicht unabhängig, da längere Fische meist auch eine grössere Masse aufweisen. Aufgrund dieser zugrundeliegenden "naiven" Annahme und der Verwendung einer Variante der Bayesischen Formel, heisst dieses Verfahren "Naive Bayes". | 💡 Alle Varianten des Naive-Bayes-Klassifikators gehen von der Annahme aus, dass alle Eingangsgrössen $x_i$ statistisch voneinander unabhängig sind, was in der Praxis kaum je zutrifft. Z. B. sind für das Unterscheiden verschiedener Fischarten die beiden Eingangsgrössen "Masse" und "Länge" nicht unabhängig, da längere Fische meist auch eine grössere Masse aufweisen. Aufgrund dieser zugrundeliegenden "naiven" Annahme und der Verwendung einer Variante der Bayesischen Formel haben diese Verfahren den Namenszusatz "Naive Bayes" erhalten. |
| ++++ | ++++ |
| |
| \\ | \\ |
| <WRAP center round box > | <WRAP center round box > |
| == ✍ Auftrag Naive Bayes Klassifikator == | == ✍ Auftrag histogrammbasierter Naive-Bayes-Klassifikator == |
| 👉 Hier erfährst du, wie ein statistisches Verfahren arbeitet. | 👉 Hier erfährst du, wie ein statistisches Verfahren arbeitet. |
| |
| 💡 Um den statistischen Naive Bayes Klassifikator mit dem neuronalen Netz aus Kapitel 3.1 vergleichen zu können, werden hierfür dieselben Daten wie in 3.1. versendet. D.h. zwei Eingangsgrössen (die x- und die y-Koordinaten der Kreise und Kreuze) und als Ausgang $y$ die Wahrscheinlichkeit, dass ein Datenpunkt $x$ zur Klasse der Kreuze gehört. Somit werden auch hier alle Ausgangswerte $y>0.5$ werden als Kreuze erkannt (und blau eingefärbt) und alle Ausgangswerte $y<0.5$ als Kreise erkannt (und grün eingefärbt). | 💡 Um den histogrammbasierten Naive-Bayes-Klassifikator mit dem neuronalen Netz aus Kapitel 3.1 vergleichen zu können, werden hierfür dieselben Daten wie in 3.1. versendet. D. h. zwei Eingangsgrössen (die x- und die y-Koordinaten der Kreise und Kreuze) und als Ausgang $y$ die Wahrscheinlichkeit, dass ein Datenpunkt $x$ zur Klasse der Kreuze gehört. Somit werden auch hier alle Ausgangswerte $y>0.5$ als Kreuze erkannt (und blau eingefärbt) und alle Ausgangswerte $y<0.5$ als Kreise erkannt (und grün eingefärbt). |
| |
| 💡 Speziell ist, dass alle Ausgangswerte mit $y = 0.5$ weiss eingefärbt werden. Hier kann sich der Klassifikator für keine der beiden Klassen entscheiden. Die Anzahl der betroffenen Kreise oder Kreuze wird im Programm mit zwei ''??'' gekennzeichnet und nicht für die Berechnung der Klassifikationsrate oder der Anzahl falsch klassifizierter Datenpunkte berücksichtigt. | 💡 Speziell ist, dass alle Ausgangswerte mit $y = 0.5$ weiss eingefärbt werden. Hier kann sich der Klassifikator für keine der beiden Klassen entscheiden. Die Anzahl der betroffenen Kreise oder Kreuze wird im Programm mit zwei ''??'' gekennzeichnet und nicht für die Berechnung der Klassifikationsrate oder der Anzahl falsch klassifizierter Datenpunkte berücksichtigt. |
| |
| 💡 Aus Gründen der Vergleichbarkeitwerdend alsFehlerfunktionenn das Bayes-Risiko und der MSE berechnet und angegeben. | 💡 Aus Gründen der Vergleichbarkeit werden als Fehlerfunktionen das Bayes-Risiko und der MSE angegeben. |
| |
| * Starte den Naive Bayes Klassifikator ein paar mal. Es wird immer dasselbe Resultat ausgegeben und das Training dauert immer nur 1 Epoche. | * Starte den Naive-Bayes-Klassifikator ein paar Mal. Es wird immer dasselbe Resultat ausgegeben und das Training dauert immer nur 1 Epoche. |
| * Verändere den einzigen Trainingsparameter im Programmcode und suche das Resultat, bei dem die Trainings- und Validationsergebnisse möglichst gleich und möglichst gut sind. Wie vergleicht sich der Naive Bayes Klassifikator für dieses Problem mit dem neuronalen Netz aus 3.1? Halte deine besten Resultate im Textfeld fest. | * Verändere den einzigen Trainingsparameter im Programmcode und suche das Resultat, bei dem die Trainings- und Validationsergebnisse möglichst gleich und möglichst gut sind. Wie vergleicht sich der Naive-Bayes-Klassifikator für dieses Problem mit dem neuronalen Netz aus 3.1? Halte deine besten Resultate im Textfeld fest. |
| * Die ''ANZAHL_INTERVALLE'' bestimmt die Feinheit der Histogramme, mit welchen die Daten statistisch ausgewertet werden. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt „Overfitting“ auf, d.h. die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate). | * Die ''ANZAHL_INTERVALLE'' bestimmt die Feinheit der Histogramme, mit welchen die Daten statistisch ausgewertet werden. Je höher dieser Wert, desto mehr Gewichte. Bei zu wenigen Gewichten kann nicht genügend gelernt werden, bei zu vielen Gewichten tritt „Overfitting“ auf, d. h., die Trainingsdaten werden auswendig gelernt (= gute Trainingsresultate, aber schlechte Validationsresultate). |
| {{gem/plain?0=N4XyA#37b6a8c6d650c881}} | {{gem/plain?0=N4XyA#37b6a8c6d650c881}} |
| |
| {{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Diese%20Trainings-%20und%20Updateparameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0Aconst%20ANZAHL_INTERVALLE%20%3D%208%3B%20%2F%2F%20ganzzahliger%20Wert%20zwischen%202%20und%20100%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20constants%0Aconst%20MIN_NO_OF_INTERVALS%20%3D%201%3B%0Aconst%20MAX_NO_OF_INTERVALS%20%3D%20100%3B%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20200%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%20100%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0Aconst%20NoOfClasses%20%3D%202%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20global%20variables%0Alet%20testProbabilities%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%3B%0Aconst%20BayesTable%20%3D%20%5B%5D%3B%0Aconst%20BayesPriors%20%3D%20%5B%5D%3B%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20NEURAL%20NETWORK%20FUNCTIONS%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20calculate%20histograms%20and%20priors%0A%2F%2F%0Afunction%20naiveBayesCalculateHistogramsPriors%28%29%20%7B%0A%0A%09%2F%2F%20Reset%20table%20and%20priors%0A%09%2F%2F%20for%20each%20class%20c%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesPriors.push%280%29%3B%0A%09%09BayesTable.push%28%5B%5D%29%3B%0A%09%09%2F%2F%20for%20each%20input%20feature%20f%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09BayesTable%5Bc%5D.push%28%5B%5D%29%3B%0A%09%09%09%2F%2F%20for%20each%20interval%20i%0A%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09BayesTable%5Bc%5D%5Bf%5D.push%280%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20Count%20Bayes%20table%20and%20priors%0A%09%2F%2F%20for%20each%20sample%20s%0A%09for%20%28let%20s%20%3D%200%3B%20s%20%3C%20trainInputArray.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20interval%20%3D%20%5B%5D%3B%0A%09%09%2F%2F%20get%20intervals%20of%20current%20sample%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09interval.push%28Math.floor%28%28trainInputArray%5Bs%5D%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20increase%20Bayes%20table%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09if%20%28trainOutputArray%5Bs%5D%20%3D%3D%3D%201%29%20%7B%20%2F%2F%20sample%20belongs%20to%20first%20class%0A%09%09%09%09BayesTable%5B0%5D%5Bf%5D%5Binterval%5Bf%5D%5D%20%2B%3D%201%3B%0A%09%09%09%7D%20else%20%7B%20%2F%2F%20sample%20belongs%20to%20second%20class%0A%09%09%09%09BayesTable%5B1%5D%5Bf%5D%5Binterval%5Bf%5D%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20increase%20Bayes%20priors%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09if%20%28trainOutputArray%5Bs%5D%20%3D%3D%3D%201%29%20%7B%20%2F%2F%20sample%20belongs%20to%20first%20class%0A%09%09%09%09BayesPriors%5B1%5D%20%2B%3D%201.0%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09BayesPriors%5B0%5D%20%2B%3D%201.0%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20Scale%20Bayes%20table%20and%20table%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%3D%20BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%2F%20BayesPriors%5Bc%5D%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09BayesPriors%5Bc%5D%20%3D%20BayesPriors%5Bc%5D%20%2F%20trainInputArray.length%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20determine%20probability%20that%20sample%20belongs%20to%20first%20class%0A%2F%2F%0Afunction%20naiveBayesProbabilityOfFirstClass%28inputSample%29%20%7B%0A%09%2F%2F%20local%20variables%0A%09let%20BayesProbabilities%20%3D%20%5B%5D%3B%0A%09let%20BayesSum%20%3D%200.0%3B%0A%09let%20interval%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20get%20interval%20for%20each%20input%20feature%20f%0A%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09interval.push%28Math.floor%28%28inputSample%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%7D%0A%09%09if%20%28interval%5Bf%5D%20%3C%200%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%200%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20unscaled%20Bayes%20probabilities%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%2F%2F%20calculate%20product%20of%20p%28xi%7CCj%29%20over%20all%20features%0A%09%09let%20product%20%3D%201%3B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09product%20%3D%20product%20%2a%20BayesTable%5Bc%5D%5Bf%5D%5Binterval%5Bf%5D%5D%3B%0A%09%09%7D%0A%09%09BayesProbabilities.push%28BayesPriors%5Bc%5D%20%2a%20product%29%3B%0A%09%09BayesSum%20%3D%20BayesSum%20%2B%20BayesProbabilities%5Bc%5D%3B%0A%09%7D%0A%09%2F%2F%20if%20no%20probability%20is%20assigned%20choose%20uniform%0A%09if%20%28BayesSum%20%3D%3D%3D%200%29%20%7B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09BayesProbabilities%5Bc%5D%20%3D%201%20%2F%20NoOfClasses%3B%0A%09%09%7D%0A%09%09BayesSum%20%3D%201%3B%0A%09%7D%0A%0A%09%2F%2F%20scale%20Bayes%20probabilites%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesProbabilities%5Bc%5D%20%3D%20BayesProbabilities%5Bc%5D%20%2F%20BayesSum%3B%0A%09%7D%0A%0A%09%2F%2F%20return%20probability%20of%20first%20class%0A%09return%20BayesProbabilities%5B0%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20Bayes%20risk%20and%20mean%20squared%20error%0A%2F%2F%0Afunction%20calculateLoss%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20mse%20%3D%200.0%3B%0A%09let%20bayesRisk%20%3D%200.0%3B%0A%09let%20sum%20%3D%200.0%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09mse%20%3D%20mse%20%2B%20%28probabilityFirstClass%20-%20desiredOutput%5Bs%5D%29%20%2a%2a%202%3B%0A%09%09sum%20%3D%20sum%20%2B%20max%281-probabilityFirstClass%2C%20probabilityFirstClass%29%3B%0A%09%7D%0A%09bayesRisk%20%3D%201%20-%20sum%2FinputData.length%3B%0A%09mse%20%3D%20mse%20%2F%20inputData.length%3B%0A%09return%20%5BbayesRisk%2C%20mse%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09let%20equally%20%3D%200%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09if%20%28%28desiredOutput%5Bs%5D%20%3D%3D%3D%201%20%26%26%20probabilityFirstClass%20%3E%200.5%29%20%7C%7C%20%28desiredOutput%5Bs%5D%20%3D%3D%3D%200%20%26%26%20probabilityFirstClass%20%3C%200.5%29%29%20%7B%0A%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%7D%0A%09%09if%20%28probabilityFirstClass%20%3D%3D%3D%200.5%29%20%7B%0A%09%09%09equally%20%3D%20equally%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09samples%3A%20inputData.length%2C%0A%09%09correct%3A%20correct%2C%0A%09%09wrong%3A%20inputData.length%20-%20correct%20-%20equally%2C%0A%09%09equally%3A%20equally%2C%0A%09%09accuracy%3A%20Math.round%28100%20%2a%20correct%20%2F%20%28inputData.length%20-%20equally%29%29%2C%0A%09%7D%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28%29%20%7B%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20%5BriskTrain%2C%20mseTrain%5D%20%3D%20calculateLoss%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20%5BriskValid%2C%20mseValid%5D%20%3D%20calculateLoss%28validInputArray%2C%20validOutputArray%29%3B%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validInputArray%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09decisionBuffer.noStroke%28%29%3B%0A%09for%20%28x%20%3D%200%3B%20x%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20x%20%3D%20x%20%2B%201%29%20%7B%0A%09%09for%20%28y%20%3D%200%3B%20y%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20y%20%3D%20y%20%2B%201%29%20%7B%0A%09%09%09let%20probabilityOfClass1%20%3D%20naiveBayesProbabilityOfFirstClass%28%5Bx%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%2C%20y%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%5D%29%3B%0A%09%09%09if%20%28probabilityOfClass1%20%3E%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20255%2C%20200%29%3B%20%2F%2F%20green%0A%09%09%09%7D%20else%20if%20%28probabilityOfClass1%20%3C%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20200%2C%20255%29%3B%20%2F%2F%20blue%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09decisionBuffer.fill%28255%2C%20255%2C%20255%29%3B%20%2F%2F%20white%0A%09%09%09%7D%0A%09%09%09decisionBuffer.rect%28DATA_SCALE%20%2a%20x%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20y%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%29%20-%20PIXEL_SIZE%20%2F%202%2C%20PIXEL_SIZE%2C%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20labels%20to%20training%20and%20validation%20feature%20space%20%2F%2F%20wrong%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20trainCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20trainCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20validCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20validCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%20DATA_WINDOW_SIZE%20%2B%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%20%20%20%20%201%20%7C%7C%20%22%20%2B%20trainCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%2B%20riskTrain.toFixed%286%29%20%2B%20%22%20%7C%20%22%20%2B%20mseTrain.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20validCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%22%20%20%2B%20riskValid.toFixed%286%29%20%2B%20%22%20%7C%20%22%20%2B%20mseValid.toFixed%286%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%2F%2F%20green%20circle%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%22%29%3B%0A%09%09%09buffer.circle%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Afunction%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20check%20for%20number%20of%20intervals%0A%09if%20%28ANZAHL_INTERVALLE%20%3C%202%20%7C%7C%20ANZAHL_INTERVALLE%20%3E%20100%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Die%20ANZAHL_INTERVALLE%20darf%20nur%20von%202%20bis%20100%20gehen.%22%29%3B%0A%09%09return%20false%3B%0A%09%7D%0A%0A%09%2F%2F%20initial%20console%20output%20%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20Training%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20Validation%20%20%20%20%20%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20%20%20Risiko%20%7C%20%20%20%20%20%20MSE%20%7C%7C%20korrekt%20%7C%20%20%20Risiko%20%7C%20%20%20%20%20%20MSE%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%20%2B%2040%29%3B%0A%0A%09%2F%2F%20text%20below%20networks%0A%09fill%28%22black%22%29%3B%0A%09noStroke%28%29%3B%0A%09textSize%2820%29%3B%0A%09text%28%22Naive%20Bayes%20%2B%20Statistik%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09textSize%28PIXEL_SIZE%20%2a%206%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20initial%20training%20and%20validation%20buffer%0A%09drawDataInBuffer%28trainInputArray%2C%20trainOutputArray%2C%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20train%20model%0A%09naiveBayesCalculateHistogramsPriors%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09drawPrediction%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%0A%7D&css=&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&autorun=off&height=400px#NaiveBayes}} | {{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Diese%20Trainings-%20und%20Updateparameter%20d%C3%BCrfen%20ge%C3%A4ndert%20werden.%0Aconst%20ANZAHL_INTERVALLE%20%3D%208%3B%20%2F%2F%20ganzzahliger%20Wert%20zwischen%202%20und%20100%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%20constants%0Aconst%20MIN_NO_OF_INTERVALS%20%3D%201%3B%0Aconst%20MAX_NO_OF_INTERVALS%20%3D%20100%3B%0Aconst%20DATA_RANGE%20%3D%2010%3B%0Aconst%20DATA_WINDOW_SIZE%20%3D%20200%3B%0Aconst%20DATA_SCALE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20DATA_RANGE%29%3B%0Aconst%20NUM_DATA_PIXEL%20%3D%20100%3B%0Aconst%20PIXEL_SIZE%20%3D%20Math.round%28DATA_WINDOW_SIZE%20%2F%20NUM_DATA_PIXEL%29%3B%0A%0A%2F%2F%20training%20data%0Aconst%20trainInputArray%20%3D%20%5B%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%201.5%5D%2C%0A%09%5B3.5%2C%204.0%5D%2C%0A%09%5B4.0%2C%206.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B4.5%2C%203.0%5D%2C%0A%09%5B5.0%2C%205.0%5D%2C%0A%09%5B5.5%2C%206.0%5D%2C%0A%09%5B6.5%2C%203.0%5D%2C%0A%09%5B7.0%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.0%5D%2C%0A%09%5B8.5%2C%205.5%5D%2C%0A%09%5B1.5%2C%203.0%5D%2C%0A%09%5B1.5%2C%204.5%5D%2C%0A%09%5B1.5%2C%207.0%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B3.0%2C%203.0%5D%2C%0A%09%5B3.0%2C%205.5%5D%2C%0A%09%5B3.0%2C%206.5%5D%2C%0A%09%5B4.0%2C%208.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B6.5%2C%207.5%5D%2C%0A%09%5B8.0%2C%206.5%5D%2C%0A%09%5B8.0%2C%208.5%5D%0A%5D%3B%0Aconst%20trainOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0Aconst%20trainInputMax%20%3D%20%5B9.0%2C%208.5%5D%3B%0Aconst%20trainInputMin%20%3D%20%5B1.5%2C%201.5%5D%3B%0Aconst%20NoOfClasses%20%3D%202%3B%0A%0A%2F%2F%20validation%20data%0Aconst%20validInputArray%20%3D%20%5B%0A%09%5B2.5%2C%207.0%5D%2C%0A%09%5B3.5%2C%201.0%5D%2C%0A%09%5B3.5%2C%207.0%5D%2C%0A%09%5B4.0%2C%203.5%5D%2C%0A%09%5B4.5%2C%206.5%5D%2C%0A%09%5B4.5%2C%202.5%5D%2C%0A%09%5B4.5%2C%205.0%5D%2C%0A%09%5B6.0%2C%202.5%5D%2C%0A%09%5B6.0%2C%204.5%5D%2C%0A%09%5B6.5%2C%205.5%5D%2C%0A%09%5B7.5%2C%204.5%5D%2C%0A%09%5B8.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%205.0%5D%2C%0A%09%5B1.5%2C%206.5%5D%2C%0A%09%5B2.0%2C%201.5%5D%2C%0A%09%5B2.5%2C%203.5%5D%2C%0A%09%5B2.5%2C%206.0%5D%2C%0A%09%5B3.5%2C%206.0%5D%2C%0A%09%5B4.0%2C%208.0%5D%2C%0A%09%5B4.0%2C%207.0%5D%2C%0A%09%5B5.5%2C%208.5%5D%2C%0A%09%5B6.5%2C%207.0%5D%2C%0A%09%5B7.5%2C%208.5%5D%2C%0A%09%5B8.5%2C%207.0%5D%0A%5D%3B%0Aconst%20validOutputArray%20%3D%20%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%200%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%2C%201%5D%3B%0A%0A%2F%2F%20global%20variables%0Alet%20testProbabilities%2C%20trainBuffer%2C%20validBuffer%2C%20decisionBuffer%3B%0Aconst%20BayesTable%20%3D%20%5B%5D%3B%0Aconst%20BayesPriors%20%3D%20%5B%5D%3B%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20NEURAL%20NETWORK%20FUNCTIONS%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20calculate%20histograms%20and%20priors%0A%2F%2F%0Afunction%20naiveBayesCalculateHistogramsPriors%28%29%20%7B%0A%0A%09%2F%2F%20Reset%20table%20and%20priors%0A%09%2F%2F%20for%20each%20class%20c%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesPriors.push%280%29%3B%0A%09%09BayesTable.push%28%5B%5D%29%3B%0A%09%09%2F%2F%20for%20each%20input%20feature%20f%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09BayesTable%5Bc%5D.push%28%5B%5D%29%3B%0A%09%09%09%2F%2F%20for%20each%20interval%20i%0A%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09BayesTable%5Bc%5D%5Bf%5D.push%280%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20Count%20Bayes%20table%20and%20priors%0A%09%2F%2F%20for%20each%20sample%20s%0A%09for%20%28let%20s%20%3D%200%3B%20s%20%3C%20trainInputArray.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20interval%20%3D%20%5B%5D%3B%0A%09%09%2F%2F%20get%20intervals%20of%20current%20sample%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09interval.push%28Math.floor%28%28trainInputArray%5Bs%5D%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20increase%20Bayes%20table%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09if%20%28trainOutputArray%5Bs%5D%20%3D%3D%3D%201%29%20%7B%20%2F%2F%20sample%20belongs%20to%20first%20class%0A%09%09%09%09BayesTable%5B0%5D%5Bf%5D%5Binterval%5Bf%5D%5D%20%2B%3D%201%3B%0A%09%09%09%7D%20else%20%7B%20%2F%2F%20sample%20belongs%20to%20second%20class%0A%09%09%09%09BayesTable%5B1%5D%5Bf%5D%5Binterval%5Bf%5D%5D%20%2B%3D%201%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09%2F%2F%20increase%20Bayes%20priors%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09if%20%28trainOutputArray%5Bs%5D%20%3D%3D%3D%201%29%20%7B%20%2F%2F%20sample%20belongs%20to%20first%20class%0A%09%09%09%09BayesPriors%5B1%5D%20%2B%3D%201.0%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09BayesPriors%5B0%5D%20%2B%3D%201.0%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20Scale%20Bayes%20table%20and%20table%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09for%20%28let%20i%20%3D%200%3B%20i%20%3C%20ANZAHL_INTERVALLE%3B%20i%2B%2B%29%20%7B%0A%09%09%09%09BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%3D%20BayesTable%5Bc%5D%5Bf%5D%5Bi%5D%20%2F%20BayesPriors%5Bc%5D%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09BayesPriors%5Bc%5D%20%3D%20BayesPriors%5Bc%5D%20%2F%20trainInputArray.length%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20Naive%20Bayes%20determine%20probability%20that%20sample%20belongs%20to%20first%20class%0A%2F%2F%0Afunction%20naiveBayesProbabilityOfFirstClass%28inputSample%29%20%7B%0A%09%2F%2F%20local%20variables%0A%09let%20BayesProbabilities%20%3D%20%5B%5D%3B%0A%09let%20BayesSum%20%3D%200.0%3B%0A%09let%20interval%20%3D%20%5B%5D%3B%0A%0A%09%2F%2F%20get%20interval%20for%20each%20input%20feature%20f%0A%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09interval.push%28Math.floor%28%28inputSample%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%20%2a%20ANZAHL_INTERVALLE%20%2F%20%28trainInputMax%5Bf%5D%20-%20trainInputMin%5Bf%5D%29%29%29%3B%0A%09%09if%20%28interval%5Bf%5D%20%3E%3D%20ANZAHL_INTERVALLE%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%20ANZAHL_INTERVALLE%20-%201%3B%0A%09%09%7D%0A%09%09if%20%28interval%5Bf%5D%20%3C%200%29%20%7B%0A%09%09%09interval%5Bf%5D%20%3D%200%3B%0A%09%09%7D%0A%09%7D%0A%0A%09%2F%2F%20calculate%20unscaled%20Bayes%20probabilities%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%2F%2F%20calculate%20product%20of%20p%28xi%7CCj%29%20over%20all%20features%0A%09%09let%20product%20%3D%201%3B%0A%09%09for%20%28let%20f%20%3D%200%3B%20f%20%3C%20trainInputArray%5B0%5D.length%3B%20f%20%3D%20f%20%2B%201%29%20%7B%0A%09%09%09product%20%3D%20product%20%2a%20BayesTable%5Bc%5D%5Bf%5D%5Binterval%5Bf%5D%5D%3B%0A%09%09%7D%0A%09%09BayesProbabilities.push%28BayesPriors%5Bc%5D%20%2a%20product%29%3B%0A%09%09BayesSum%20%3D%20BayesSum%20%2B%20BayesProbabilities%5Bc%5D%3B%0A%09%7D%0A%09%2F%2F%20if%20no%20probability%20is%20assigned%20choose%20uniform%0A%09if%20%28BayesSum%20%3D%3D%3D%200%29%20%7B%0A%09%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09%09BayesProbabilities%5Bc%5D%20%3D%201%20%2F%20NoOfClasses%3B%0A%09%09%7D%0A%09%09BayesSum%20%3D%201%3B%0A%09%7D%0A%0A%09%2F%2F%20scale%20Bayes%20probabilites%0A%09for%20%28let%20c%20%3D%200%3B%20c%20%3C%20NoOfClasses%3B%20c%2B%2B%29%20%7B%0A%09%09BayesProbabilities%5Bc%5D%20%3D%20BayesProbabilities%5Bc%5D%20%2F%20BayesSum%3B%0A%09%7D%0A%0A%09%2F%2F%20return%20probability%20of%20first%20class%0A%09return%20BayesProbabilities%5B0%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20Bayes%20risk%20and%20mean%20squared%20error%0A%2F%2F%0Afunction%20calculateLoss%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20mse%20%3D%200.0%3B%0A%09let%20bayesRisk%20%3D%200.0%3B%0A%09let%20sum%20%3D%200.0%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09mse%20%3D%20mse%20%2B%20%28probabilityFirstClass%20-%20desiredOutput%5Bs%5D%29%20%2a%2a%202%3B%0A%09%09sum%20%3D%20sum%20%2B%20max%281-probabilityFirstClass%2C%20probabilityFirstClass%29%3B%0A%09%7D%0A%09bayesRisk%20%3D%201%20-%20sum%2FinputData.length%3B%0A%09mse%20%3D%20mse%20%2F%20inputData.length%3B%0A%09return%20%5BbayesRisk%2C%20mse%5D%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20calculate%20percentage%20of%20correct%20classifications%0A%2F%2F%0Afunction%20calculatePercentageCorrect%28inputData%2C%20desiredOutput%29%20%7B%0A%09let%20correct%20%3D%200%3B%0A%09let%20equally%20%3D%200%3B%0A%09for%20%28s%20%3D%200%3B%20s%20%3C%20inputData.length%3B%20s%2B%2B%29%20%7B%0A%09%09let%20probabilityFirstClass%20%3D%20naiveBayesProbabilityOfFirstClass%28inputData%5Bs%5D%29%3B%0A%09%09if%20%28%28desiredOutput%5Bs%5D%20%3D%3D%3D%201%20%26%26%20probabilityFirstClass%20%3E%200.5%29%20%7C%7C%20%28desiredOutput%5Bs%5D%20%3D%3D%3D%200%20%26%26%20probabilityFirstClass%20%3C%200.5%29%29%20%7B%0A%09%09%09correct%20%3D%20correct%20%2B%201%3B%0A%09%09%7D%0A%09%09if%20%28probabilityFirstClass%20%3D%3D%3D%200.5%29%20%7B%0A%09%09%09equally%20%3D%20equally%20%2B%201%3B%0A%09%09%7D%0A%09%7D%0A%09return%20%7B%0A%09%09samples%3A%20inputData.length%2C%0A%09%09correct%3A%20correct%2C%0A%09%09wrong%3A%20inputData.length%20-%20correct%20-%20equally%2C%0A%09%09equally%3A%20equally%2C%0A%09%09accuracy%3A%20Math.round%28100%20%2a%20correct%20%2F%20%28inputData.length%20-%20equally%29%29%2C%0A%09%7D%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20decision%20boundary%20and%20network%20output%0A%2F%2F%0Afunction%20drawPrediction%28%29%20%7B%0A%09%2F%2F%20calculate%20mse%20and%20percentages%20of%20correct%20classifications%0A%09let%20%5BriskTrain%2C%20mseTrain%5D%20%3D%20calculateLoss%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20%5BriskValid%2C%20mseValid%5D%20%3D%20calculateLoss%28validInputArray%2C%20validOutputArray%29%3B%0A%09let%20trainCorrect%20%3D%20calculatePercentageCorrect%28trainInputArray%2C%20trainOutputArray%29%3B%0A%09let%20validCorrect%20%3D%20calculatePercentageCorrect%28validInputArray%2C%20validOutputArray%29%3B%0A%0A%09%2F%2F%20calculate%20normalized%20testing%20inputs%20for%20visualisation%0A%09decisionBuffer.noStroke%28%29%3B%0A%09for%20%28x%20%3D%200%3B%20x%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20x%20%3D%20x%20%2B%201%29%20%7B%0A%09%09for%20%28y%20%3D%200%3B%20y%20%3C%20NUM_DATA_PIXEL%20%2B%201%3B%20y%20%3D%20y%20%2B%201%29%20%7B%0A%09%09%09let%20probabilityOfClass1%20%3D%20naiveBayesProbabilityOfFirstClass%28%5Bx%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%2C%20y%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%5D%29%3B%0A%09%09%09if%20%28probabilityOfClass1%20%3E%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20255%2C%20200%29%3B%20%2F%2F%20green%0A%09%09%09%7D%20else%20if%20%28probabilityOfClass1%20%3C%200.5%29%20%7B%0A%09%09%09%09decisionBuffer.fill%28200%2C%20200%2C%20255%29%3B%20%2F%2F%20blue%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%09decisionBuffer.fill%28255%2C%20255%2C%20255%29%3B%20%2F%2F%20white%0A%09%09%09%7D%0A%09%09%09decisionBuffer.rect%28DATA_SCALE%20%2a%20x%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%20-%20PIXEL_SIZE%20%2F%202%2C%20DATA_SCALE%20%2a%20%2810%20-%20y%20%2F%20NUM_DATA_PIXEL%20%2a%20DATA_RANGE%29%20-%20PIXEL_SIZE%20%2F%202%2C%20PIXEL_SIZE%2C%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%0A%09image%28decisionBuffer%2C%200%2C%200%29%3B%0A%09image%28decisionBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20draw%20training%20and%20validation%20samples%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20add%20labels%20to%20training%20and%20validation%20feature%20space%20%2F%2F%20wrong%0A%09noStroke%28%29%3B%0A%09text%28%22Training%3A%20%22%20%2B%20trainCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20trainCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20trainCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%09text%28%22Validation%3A%20%22%20%2B%20validCorrect.accuracy%20%2B%20%22%25%20%E2%9C%94%EF%B8%8F%20%28%22%20%2B%20validCorrect.wrong%20%2B%20%22%20falsch%2C%20%22%20%2B%20validCorrect.equally%20%2B%20%22%20%3F%3F%29%22%2C%20DATA_WINDOW_SIZE%20%2B%204%20%2a%20PIXEL_SIZE%2C%208%20%2a%20PIXEL_SIZE%29%3B%0A%0A%09%2F%2F%20print%20training%20and%20validation%20results%20to%20console%0A%09console.log%28%22%7C%7C%20%20%20%20%20%201%20%7C%7C%20%22%20%2B%20trainCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%20%20%20%20%22%20%2B%20riskTrain.toFixed%286%29%20%2B%20%22%20%7C%20%22%20%2B%20mseTrain.toFixed%286%29%20%2B%20%22%20%7C%7C%20%22%20%2B%20validCorrect.accuracy.toString%28%29.padStart%286%2C%20%22%20%22%29%20%2B%20%22%25%20%7C%20%20%20%20%20%22%20%20%2B%20riskValid.toFixed%286%29%20%2B%20%22%20%7C%20%22%20%2B%20mseValid.toFixed%286%29%20%2B%20%22%20%7C%7C%22%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20data%20in%20graphic%20buffer%0A%2F%2F%0Afunction%20drawDataInBuffer%28inputData%2C%20outputData%2C%20buffer%29%20%7B%0A%09buffer.noFill%28%29%3B%0A%09buffer.strokeWeight%28PIXEL_SIZE%29%3B%0A%09buffer.rect%280%2C%200%2C%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09for%20%28i%20%3D%200%3B%20i%20%3C%20inputData.length%3B%20i%2B%2B%29%20%7B%0A%09%09if%20%28outputData%5Bi%5D%20%3D%3D%3D%201%29%20%7B%0A%09%09%09%2F%2F%20green%20circle%20for%20output%20label%20%3D%3D%3D%201%0A%09%09%09buffer.stroke%28%22darkgreen%22%29%3B%0A%09%09%09buffer.circle%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%2C%204%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09%2F%2F%20blue%20cross%20for%20output%20label%20%3D%3D%3D%200%0A%09%09%09buffer.stroke%28%22blue%22%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%09buffer.line%28DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20%2B%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20inputData%5Bi%5D%5B0%5D%20-%202%20%2a%20PIXEL_SIZE%2C%20DATA_SCALE%20%2a%20%2810%20-%20inputData%5Bi%5D%5B1%5D%29%20%2B%202%20%2a%20PIXEL_SIZE%29%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Afunction%20setup%28%29%20%7B%20%2F%2Fnoprotect%20%28for%20large%20arrays%29%0A%09%2F%2F%20check%20for%20number%20of%20intervals%0A%09if%20%28ANZAHL_INTERVALLE%20%3C%202%20%7C%7C%20ANZAHL_INTERVALLE%20%3E%20100%29%20%7B%0A%09%09console.log%28%22%E2%9A%A0%EF%B8%8F%20Die%20ANZAHL_INTERVALLE%20darf%20nur%20von%202%20bis%20100%20gehen.%22%29%3B%0A%09%09return%20false%3B%0A%09%7D%0A%0A%09%2F%2F%20initial%20console%20output%20%0A%09console.log%28%22%7C%7C%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20Training%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20%20Validation%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%22%29%3B%0A%09console.log%28%22%7C%7C%20Epoche%20%7C%7C%20korrekt%20%7C%20Bayes-Risiko%20%7C%20%20%20%20%20%20MSE%20%7C%7C%20korrekt%20%7C%20Bayes-Risiko%20%7C%20%20%20%20%20%20MSE%20%7C%7C%22%29%3B%0A%0A%09%2F%2F%20create%20canvas%0A%09createCanvas%282%20%2a%20DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%20%2B%2040%29%3B%0A%0A%09%2F%2F%20text%20below%20networks%0A%09fill%28%22black%22%29%3B%0A%09noStroke%28%29%3B%0A%09textSize%2820%29%3B%0A%09text%28%22Naive%20Bayes%20%2B%20Statistik%22%2C%2010%2C%20DATA_WINDOW_SIZE%20%2B%2025%29%3B%0A%09textSize%28PIXEL_SIZE%20%2a%206%29%3B%0A%0A%09%2F%2F%20create%20all%20grafic%20buffers%0A%09trainBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09validBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%09decisionBuffer%20%3D%20createGraphics%28DATA_WINDOW_SIZE%2C%20DATA_WINDOW_SIZE%29%3B%0A%0A%09%2F%2F%20draw%20initial%20training%20and%20validation%20buffer%0A%09drawDataInBuffer%28trainInputArray%2C%20trainOutputArray%2C%20trainBuffer%29%3B%0A%09drawDataInBuffer%28validInputArray%2C%20validOutputArray%2C%20validBuffer%29%3B%0A%09image%28trainBuffer%2C%200%2C%200%29%3B%0A%09image%28validBuffer%2C%20DATA_WINDOW_SIZE%2C%200%29%3B%0A%0A%09%2F%2F%20train%20model%0A%09naiveBayesCalculateHistogramsPriors%28%29%3B%0A%0A%09%2F%2F%20train%20and%20visualise%20neural%20network%0A%09drawPrediction%28%29%3B%0A%0A%09%2F%2F%20end%20of%20training%0A%09console.log%28%22Das%20Training%20ist%20beendet%20%3A-%29%22%29%3B%0A%0A%7D&css=&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&autorun=off&height=400px#NaiveBayes}} |
| |
| </WRAP> | </WRAP> |
| |
| \\ | \\ |
| ==== - Stochastische Verfahren ==== | ==== - Stochastische Lösungsansätze ==== |
| |
| Bei den stochastischen Verfahren werden die Werte aller Gewichte $w$ zufällig gewürfelt (Zufallszahlen) und anschliessend der Fehler mit den verfügbaren Daten berechnet. Dies wird viele Male wiederholt und am Ende die Gewichte-Einstellung mit dem kleinsten erzielten Fehler verwendet. Somit wird die Gewichte-Einstellung $w^*$ für welche $e_{min}=J(w^*)$ gilt, durch Zufall angenähert. | Bei den stochastischen Lösungsansätzen werden die Werte aller Gewichte $w$ zufällig gewürfelt (Zufallszahlen) und anschliessend der Fehler mit den verfügbaren Daten berechnet. Dies wird viele Male wiederholt und am Ende die Gewichte-Einstellung mit dem kleinsten erzielten Fehler verwendet. Somit wird die Gewichte-Einstellung $w^*$ für welche $e_{min}=J(w^*)$ gilt, durch Zufall angenähert. |
| |
| Mit dieser Vorgehensweise können, im Gegensatz zu den in den Kapiteln 3.1 und 3.2 vorgestellten Verfahren, alle Varianten von Stellvertreter-Funktionen $f_{ML}(x)$ und Fehlerfunktionen $J(w)$ ohne Einschränkung verwendet werden. | Mit dieser Vorgehensweise können, im Gegensatz zu den in den Kapiteln 3.1 und 3.2 vorgestellten Lösungsansä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> |
| |