Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ss16:14.07.2016 [2016/07/14 14:35] henrikfrenzel |
ss16:14.07.2016 [2016/07/14 18:00] (aktuell) victorbremer |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | Bei dem kompletten Datensatz hat unser knn eine Genauigkeit von 98%. | + | Bei dem ganzen MNIST-Datensatz hat unser k-nearest-Neighbor-Algorithmus eine Genauigkeit von 98%. |
=== Ziele: === | === Ziele: === | ||
* Symbol-Datensatz zum MNIST-Datensatz hinzufügen | * Symbol-Datensatz zum MNIST-Datensatz hinzufügen | ||
* fit-Funktion mit pickle auslagern | * fit-Funktion mit pickle auslagern | ||
+ | |||
+ | == Labels neudefiniert um Datensätze anzugleichen == | ||
+ | <code python> | ||
+ | import cPickle as pickle | ||
+ | |||
+ | with open('clean_symbols.p','r') as f: | ||
+ | u=pickle.Unpickler(f) | ||
+ | data=u.load() | ||
+ | |||
+ | zahlen=['1','2','3','4','5','6','7','8','9','0'] | ||
+ | for i in range(15568): | ||
+ | if data[2][i] in zahlen: | ||
+ | data[1][i]= int(data[2][i]) | ||
+ | else: | ||
+ | data[1][i] +=10 | ||
+ | |||
+ | pickle.dump( data, open( "symbols-newlabel.p", "wb" ) ) | ||
+ | </code> | ||
+ | |||
+ | == Symbol-Datensatz formieren == | ||
+ | <code python> | ||
+ | import cPickle as pickle | ||
+ | import numpy as np | ||
+ | |||
+ | with open('symbols-newlabel.p','r') as f: | ||
+ | u=pickle.Unpickler(f) | ||
+ | data=u.load() | ||
+ | |||
+ | data_neu=np.zeros(shape=data[0].shape,dtype=np.float) | ||
+ | for i in range(data[0].shape[0]): | ||
+ | data_neu[i]=data[0][i,:]/np.linalg.norm(data[0][i,:]) | ||
+ | |||
+ | alldata_neu= (data_neu, data[1], data[2]) | ||
+ | |||
+ | pickle.dump( alldata_neu, open( "symbols-newlabel-norm.p", "wb" ) ) | ||
+ | </code> | ||
+ | |||
+ | == Zusammenfügen der Datensätze == | ||
+ | <code python> | ||
+ | import cPickle as pickle | ||
+ | import scipy.io | ||
+ | import numpy as np | ||
+ | mat=scipy.io.loadmat('/home/mensch/scikit_learn_data/mldata/mnist-original-norm.mat') | ||
+ | |||
+ | with open('symbols-newlabel-norm.p','r') as f: | ||
+ | u=pickle.Unpickler(f) | ||
+ | data=u.load() | ||
+ | |||
+ | mnist_data=mat['data'] | ||
+ | mnist_data= mnist_data.transpose() | ||
+ | mnist_label=mat['label'] | ||
+ | mnist_label=mnist_label.transpose() | ||
+ | mnist_label_int=np.zeros(shape=mnist_label.shape, dtype=np.int64) | ||
+ | mnist_label_string=np.zeros(shape=mnist_label.shape, dtype=object) | ||
+ | for i in range(mnist_label.shape[0]): | ||
+ | mnist_label_int[i]= np.int64(mnist_label[i]) | ||
+ | mnist_label_string[i]= np.string_(mnist_label[i]) | ||
+ | |||
+ | mnist_label_int = mnist_label_int.reshape((mnist_label_int.shape[0],)) | ||
+ | mnist_label_string = mnist_label_string.reshape((mnist_label_string.shape[0],)) | ||
+ | |||
+ | zusammendaten=np.append(data[0], mnist_data, axis=0) | ||
+ | zusammenlabel= np.append(data[1], mnist_label_int, axis=0) | ||
+ | zusammenlabel2=np.append(data[2], mnist_label_string, axis=0) | ||
+ | alleszusammen = (zusammendaten, zusammenlabel, zusammenlabel2) | ||
+ | |||
+ | |||
+ | pickle.dump( alleszusammen, open( "/home/mensch/scikit_learn_data/mldata/datensaetze-zsm.p", "wb" ) ) | ||
+ | </code> | ||
+ | Der Versuch die Daten mit Pickle zu speichern führte allerdings zu einem MemoryError. | ||
+ | Daher sind wir dazu übergegangen die Dateien in einem Numpy-Objekt zu speichern: | ||
+ | <code python> | ||
+ | alleszusammen= np.array((zusammendaten, zusammenlabel, zusammenlabel2)) | ||
+ | np.save( "/home/mensch/scikit_learn_data/mldata/datensaetze-zsm.p",alleszusammen) | ||
+ | </code> | ||
+ | Die Datei wird dann als "datensaetze-zsm.p.npy" gespeichert und kann mit dem Befehl | ||
+ | <code terminal> | ||
+ | np.load("/home/mensch/scikit_learn_data/mldata/datensaetze-zsm.p.npy") | ||
+ | </code> | ||
+ | geladen werden. | ||
+ | |||
+ | Nach weiterer Bearbeitung hat sich rausgestellt, dass np.save() die Matrix der Daten falsch abspeichert. Nach dem Laden der Daten zeigt sich in der nullten Komponente das Format | ||
+ | <code terminal> | ||
+ | (85568,) | ||
+ | </code> | ||
+ | obwohl es (85568,784) sein sollte. | ||
+ | Daher müssen die verschiedenen Teile des Datensatzes einzeln gespeichert werden. Also eine Datei für die Daten und eine andere für die Labels als int und als string. |