=== Lösung: ===
Laufzeitproblem von letzter Woche basierte auf einem Vektorfehler
=== Ziele: ===
* knn-Algorithmus von scikit-learn für MNIST-Datensatz implementieren
from __future__ import division
from sklearn.neighbors import NearestNeighbors
import numpy as np
import scipy.io
import random
from sklearn import neighbors
mat=scipy.io.loadmat('/[…]/[…]/scikit_learn_data/mldata/mnist-original-norm.mat')
trainingsize=9000
testsize=1000
daten=mat['data']
choice1=np.random.choice(70000, trainingsize+testsize, replace=False)
daten=daten[:,choice1]
daten=daten.transpose()
print "Datenshape:", daten.shape
choice2= np.random.choice(trainingsize+testsize,testsize, replace=False)
test=daten[choice2,:].copy()
print "Testshape:", test.shape
datenkurz=np.delete(daten,choice2,axis=0)
zahllang=mat['label']
zahllang=zahllang[:,choice1]
zahllang=zahllang.transpose()
labels=zahllang[choice2,:].copy()
labels=labels.reshape((testsize,))
zahl=np.delete(zahllang,choice2,axis=0)
zahl=zahl.reshape((trainingsize,))
Da der Algorithmus von sklearn mit einem anderen shape arbeitet als der MNIST-Datensatz, musste wir den Datensatz transponieren. Außerdem haben wir aus Laufzeitgründen den Datensatz verkleinert.
=== Ausgabe der Genauigkeit: ===
clf = neighbors.KNeighborsClassifier(k)
clf.fit(datenkurz, zahl)
print clf.score(test,labels)
== Genauigkeit in Abhängigkeit von k: ==
{{ :ss16:printme.png |}}
Der Algorithmus ist bei k von 6-9 am genausten. Aus diesem Grund haben wir uns für k=8 entschieden.
=== Support Vector Classification(SVC): ===
for i in range(2):
if i==0:
clf = neighbors.KNeighborsClassifier(8)
if i==1:
clf = svm.SVC()
t1=time.clock()
clf.fit(datenkurz, zahl)
Genauigkeit=clf.score(test,labels)
t2=time.clock()
zeit=t2-t1
print
print "Genauigkeit: ", Genauigkeit, "Zeit: ", zeit
== Ausgabe: ==
Genauigkeit: 0.957 Zeit: 12.72157 #knn
Genauigkeit: 0.955 Zeit: 24.224649 #SVC
Genauigkeit bei Support Vector Classification und k-nearest-Neighbor-Algorithmus ist ähnlich allerdings ist SVC deutlich langsamer als knn.