def aufg03(): # # Implementieren Sie einen Vektorquantisierer nach Lloyd. # Fuer Ihre Implementierung finden Sie einen Klassenrumpf in dem Modul # common.vector_quantization # # Ein anderer Vektorquantisierer ist der k-means-Algorithmus (nach McQueen, # siehe z.B. Skript Spracherkennung, S. 53 ff.). # Diskutieren Sie die Unterschiede zwischen Lloyd und k-means. # Achtung: In der Literatur ist mit k-means in der Regel der Lloyd-Algorithmus # gemeint. # ----------------------Disskussion----------------------------------------- # Der k-means algorhytmus beschreibt das problem der suche von # Clusterzentren zu einer gegebenen Anzahl von Clusterzentren. Beim # Lyod-Algorithmus geht es um die iterative suche der Clusterzentren. # Welche Codebuchgroesse ist fuer die gegebene Verteilung von Daten geeignet? # ----------------------Codebuchgroesse------------------------------------- # Eine Codebuchgroesse von 5 scheint passend, da sich die 3 Klassen auf 5 # Ballungszentren aufteilen. train_data_provider = DataProvider(DataProvider.DATA2DROOT_TRAIN) train_data = train_data_provider.get_dataset_arr() # Waehlen Sie eine geeignete Codebuchgroesse und speichern Sie sie in der # lokalen Variablen codebook_size. codebook_size = 5 # raise NotImplementedError('Implement me') # Im Nachfolgenden werden die Daten unabhaengig von der Klassenzugehoerigkeit # geclustert. lloyd_quantizer = Lloyd() codebook = lloyd_quantizer.cluster(train_data, codebook_size) # Quantisieren Sie die Trainingsdaten mit dem berechneten Codebuch. # Speichern Sie die Clusterindices der jeweiligen Samples in der lokalen # Variablen labels. # Nuetzliche Funktionen: # https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmin.html dist = cdist(train_data[0], codebook) labels = np.argmin(dist, axis=1) # raise NotImplementedError('Implement me') # Berechnen Sie nun eine Normalverteilung je Cluster und visualisieren Sie diese. # Ueberlegen Sie, wie Normalverteilungen definiert sind und wie Sie die noetigen # Paramter auf Grundlage der Quantisierung bestimmen koennen. # Im Nachfolgenden ist bereits die Farbcodierung der Cluster implementiert. # Sie koennen die Variable c als Farbwerte in der visualization.plot_norm_dist_ellipse # Funktion verwenden. # # Nuetzliche Funktionen: np.cov # http://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html # Zur Visualisierung: visualization.plot_norm_dist_ellipse cmap = cm.get_cmap('hsv') c = cmap(np.linspace(0, 1, codebook_size)) cov = [] for label in np.unique(labels): cov.append(np.cov(train_data[label==labels], rowvar=0)) #raise NotImplementedError('Implement me') # Visualisieren Sie die Zugehoerigkeit der einzelnen Samples zu den # Clustern. Im Nachfolgenden ist bereits die Farbcodierung der Daten # implementiert. # Sie koennen die Variable c als Farbwerte in der ax.scatter # Funktion verwenden. labels_norm = labels / float(codebook_size ) cmap = cm.get_cmap('hsv') c = cmap(labels_norm) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(train_data[:,0], train_data[:,1], c=c, edgecolor=(0,0,0)) visualization.plot_norm_dist_ellipse(ax, codebook, cov, c) plt.show()
def aufg05(): # # Realisieren Sie eine Hauptachsen-Transformation (PCA) in der Klasse PCA. # Zunaechst schauen wir uns das Prinzip an einem Spielbeispiel an. # # Mit der Methode pca_example wird die PCA anhand eines # 3D-Beispieldatensatzes visualisiert. # Nuetzliche Funktionen: np.linalg.eig # http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html # Achten Sie darauf, dass die NumPy Methode np.linalg.eig komplexwertige Ergebnisse # liefern kann. Dies kann an numerischen Ungenauigkeiten liegen. Verwenden Sie in # diesem Fall nur den Realteil. pca_example() # # Nachdem bisher mit artifiziellen Datensaetzen gearbeitet wurde, wenden wir # uns jetzt realen Daten zu. Dazu verwenden wir den MNIST-Datensatz der # Grauwert-Bilder handgeschriebener Ziffern enthaelt. Der MNIST-Datensatz # besteht im Original aus 60000 Trainingsbildern und 10000 Testbildern. Um # den Aufwand geringer zu halten, werden im Rahmen dieser Uebung # lediglich 1000 zufaellig ausgewaehlte Trainingsbilder pro Klasse verwendet. # # Somit ergibt sich ein Trainingsdatensatz von 10000 sowie ein # Testdatensatz von 10000 Bildern. # # Die 28 x 28 Pixel grossen Bilder koennen als 784-dimensionale Merkmalsvektoren # aufgefasst werden. # # Laden Sie die Trainingsdaten des MNIST-Datensatz. # Das Laden des Datensatzes kann einige Sekunden in Anspruch nehmen. # Mit show_data(data, width) koennen Sie Bilder anzeigen lassen. Die Anzahl der # Bilder muss ein Vielfaches des Parameters width sein. train_data_provider = DataProvider(DataProvider.MNIST_TRAIN) train_data = train_data_provider.get_dataset_arr() show_data(train_data[2000:2100, :], width=10) plt.show() # raise NotImplementedError('Implement me') # Transformieren Sie die 784-dimensionalen Daten des MNIST-Datensatzes in # einen geeignet gewaehlten niedriger-dimensionalen Merkmalsraum. Begruenden # Sie die gewaehlte Groesse. # Hinweis: Die Unterraumdimension laesst sich mit der moeglichen # Rekonstruktionsqualitaet verknuepfen. # Es ist empfehlenswert, die dimensionsreduzierten Daten fuer die spaetere # Nutzung zu speichern. # Nuetzliche Funktion: DataProvider.write_data oder pickle # Achten Sie darauf, dass DataProvider.write_data ein dictionary als # Eingabe erwartet. # Zu pickle finden Sie weitere Informationen hier: # https://docs.python.org/3/library/pickle.html # https://wiki.python.org/moin/UsingPickle # Optional: Visualisieren Sie die MNIST-Daten in einem 2D Unterraum. Faerben Sie # die Datenpunkte nach Klassenzugehoerigkeit. target_dim = 70 pca = PCA(train_data) transformed = pca.transform_samples(train_data, target_dim)