示例#1
0
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()
示例#2
0
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)