Auf dem MNIST dataset KNN, Kmeans und SVM implementieren.
Du kannst das MNIST dataset hier runterladen.
Über das dataset:
Die csv-files enthalten die labels sowie die Pixel Werte für ein 28x28 grayscale Bild mit Pixel Werten zwischen [0-255]. Die erste Spalte in dem csv-file enthält das Klassenlabel.
Die Bilder sind als 1-dimensionales Array dargestellt, d.h. du müsstest die data "reshapen", wenn du die Zahlen korrekt darstellen möchtest auf dem Bildschirm.
Features sind die Pixel Werte.
Über das MNIST dataset:
Die MNIST-Datenbank (Modified National Institute of Standards and Technology database[1]) ist eine öffentlich verfügbare Datenbank von handgeschriebenen Ziffern. Wobei jede Ziffer als 28 × 28 Pixel großes Graustufen-Bild gespeichert ist. Die MNIST-Datenbank besteht aus 60.000 Beispielen im Trainingsdatensatz und 10.000 Beispielen im Testdatensatz.
Nun sollte das Gelernte am MNIST dataset wiederholt werden. Dazu gibt es einige Aufgaben:
Klassifiziere die Einträge im Datensatz mit Hilfe deines KNN-Algorithmus. Experimentiere mit verschiedene Einträgen für k (k = {1, 3, 5, 10, 15}.
Implementiere zwei unterschiedliche Distanz-Metriken.
Welche gibt dir die beste Accuracy zurück?
Nutze deinen K-Means Algorithmus, um die Einträge mit Hilfe deines K-Means Algorithmus zu clustern. Versuche für k = {5, 7, 9, 10, 12, 15}.
Kannst Du auch eine eigene Implementation für den K-Means Algorithmus schreiben?
Eine Support Vector Machine unterteilt eine Menge von Objekten so in Klassen, dass um die Klassengrenzen herum ein möglichst breiter Bereich frei von Objekten bleibt; sie ist ein sogenannter Large Margin Classifier (dt. „Breiter-Rand-Klassifikator“).
SVM konstruiert eine Hyperebene im mehrdimensionalen Raum, um verschiedene Klassen zu trennen. SVM erzeugt eine optimale Hyperebene (Trennlinie), die zur Minimierung eines Fehlers verwendet wird.
Die Kernidee von SVM besteht darin, eine maximale marginale Hyperebene zu finden, die den Datensatz am besten in Klassen unterteilt.
Support Vectors
Support Vectors sind die Datenpunkte, die der Hyperebene am nächsten liegen.
Hyperplane
Eine Hyperebene ist eine Entscheidungsebene, die eine Menge von Objekten mit unterschiedlichen Klassenzugehörigkeiten trennt.
Margin
Ein Margin ist eine Lücke zwischen den beiden Linien an den nächstgelegenen Klassenpunkten. Er wird als senkrechter Abstand zwischen der Linie und den Stützvektoren oder den nächstgelegenen Punkten berechnet. Wenn der Abstand zwischen den Klassen größer ist, gilt er als gut, ein kleinerer Abstand ist ein schlechter Abstand.
SVM versucht ein gegebenes Datensatz so gut wie möglich zu unterteilen. Die Distanz zwischen den jeweiligen nächsten Punkten nennt man margin.
Das Ziel ist es, eine Hyperebene mit dem größtmöglichen Abstand zwischen den Stützvektoren im gegebenen Datensatz zu wählen. SVM sucht in den folgenden Schritten nach der maximal marginalen Hyperebene:
Erzeuge Hyperebenen, die die Klassen am besten trennen (Abbildung links).
Wählen Sie diejenige Hyperebene mit dem größten Abstand zu den beiden nächstgelegenen Datenpunkten, wie in der Abbildung rechts dargestellt.
Versuche eine SVM mit dem MNIST dataset zu bauen. Dafür kannst Du die sklearn library nutzen. Du darfst dafür auch ein Tutorial im Internet suchen.
Schlussendlich solltest Du jedoch deine Lösung im Plenum vorstellen und erklären können.
Falls eine SVM zu bauen, zu einafch ist, versuche mit GridSearchCV deinen estimator zu verbessern.
Erkläre anschliessend in eigenen Worten, was deine Resultate aussagen.
Die Beispiellösung ist von mir (Uni) und somit auf Englisch. Wenn etwas nicht klar ist, bitte nachfragen. :)