Gegeben Sei \(X\) eine 1-d Zufallsvariable und seien weiter \(x_1, \dots, x_n\) beobachtete Werte dieser Zufallsvariable.
Dann ist \(
\overline x_k := \frac{1}{k} \sum_i x_i
\) der Mittelwert und \(
\sigma_k := \frac{1}{k} \sum_i \left(x_i - \overline x_k\right)^2
\) die Varianz des (Teil-)Datensatzes \((x_1,\dots,x_k)\).
Erwartungswert:
Die folgende Umformung führt zu der Online-Variante dieser Berechnung: \[
\overline x_n := \overline x_{n-1} + \frac{x_n - \overline x_{n-1}}{n}.
\]
Varianz:
Ganz ähnlich lässt sich auch die online-Berechnung der Varianz herleiten: \[
\sigma_n^2 = \frac{(n-1)\sigma_{n-1}^2+(x_n - \overline x_{n-1})(x_n-\overline x_n)}{n} = \sigma^2_{n-1} + \frac{(x_n - \overline x_{n-1})(x_n - \overline x_n) - \sigma^2_{n-1}}{n}.
\] Diese Art die Varianz zu bestimmen kann jedoch zu numerischen Problemen führen — wir subtrahieren hier eine potentiell sehr kleine Zahl von einer beliebig großen Zahl. Eine numerisch stabilere Variante nutzt den linken Teil der Gleichung bzw. die Tatsache, dass die Formel der Standardabweichung die Summe aller Differenzen vom Mittelwert enthält: \[
\begin{align}
M_{2,n} &= M_{2,n-1} + (x_n - \overline x_{n-1})(x_n - \overline x_n)\\
\sigma^2_n &= \frac{M_{2,n}}{n}.
\end{align}
\]
Gegeben Sei ein zufälliger 1-d Datensatz. Der Einfachheit halber nehmen wir hier eine normalverteilte Zufallsvariable \(X \sim \mathcal{N}_{0,1}\) an.
Stellen wir uns vor, wir wurden mit der Aufgabe betraut für eine Waage im Supermarkt eine automatische Früchteerkennung zu implementieren. Zum Testen haben wir eine Hand voll Bilder erhalten, wie sie typischerweise von der Waage aufgenommen werden. In dem Archiv befinden sich 36 Bilder von Äpfeln und 35 Bilder von Bananen.
(Wir kümmern uns hier nur um den Prototypen: erkannt werden sollen nur Äpfel und Bananen. ;) )
Qualitätsmaß:
Bevor wir einen Klassifizierer testen, müssen wir vorher die Qualität eines Klassifizierers definieren. Um etwa Auswendig lernen zu verbieten teilen wir den Datensatz in zwei Teile auf (5 zufällige Bilder bilden) Test- und (die restlichen Bilder den) Trainingsdatensatz. Dabei bilden die Bilder mit ungeradem Index den Trainingsdatensatz und die mit geradem Index den Testdatensatz.
Ein Datenpunkt \((x,y)\) ist dabei stets ein Tupel, bei dem \(x\) ein Bild der Dimension \(d\) (etwa \(d = \text{Bildhöhe} \cdot \text{Bildbreite} \cdot \text{anzahl Farbkanäle}\)) ist und \(y\) die Klasse des Bildes anzeigt. In unserem Fall entspricht die Klasse Apfel dem Wert \(y=0\) und die Klasse Banane dem Wert \(y=1\).
Die Indikatorfunktion \(1_y\) bezeichne dabei die Funktion, die genau dann 1 ist, wenn sie im Wert des Subskript \(y\) ausgewertet wird. Ansonsten nimmt die Funktion den Wert 0 an. \[
1_y (x) := \left\{ \begin{matrix}
1, & \text{falls } x = y,\\
0, & \text{sonst } \phantom{x = y,}
\end{matrix} \right.
\] Den ersten Teil verwenden wir um den Klassifizierer zu „trainieren“, den zweiten Teil nutzen wir, um unser Qualitätsmaß zu testen.
Ein Klassifizierer \(f\) ist dabei besser, je höher dessen Genauigkeit (engl. accuracy) auf dem test set \(T := \left\{(x,y) | x\in \mathbb{R}^d, y \in \{0,1\}\right\}\) ist, \[
\text{accuracy}(T,f) := \frac{1}{|T|} \sum_{(x,y)\in T} 1_y(f(x)).
\] (Mit anderen Worten messen wir hier den Anteil an richtigen Klassfizierungen im Datensatz).
Implementieren Sie nun die folgenden drei Klassifizierer und testen Sie die jeweilige Qualität auf dem test-set.
Axes3d.scatter
).