=== Ziele: === * Normierung des MNIST-Datensatz * Einlesen eines 28x28 Bildes ---------------------------------------------------------------------------- * Normierung des MNIST-Datensatz from __future__ import division import numpy as np import scipy.io mat=scipy.io.loadmat('/[…]/[…]/scikit_learn_data/mldata/mnist-original.mat') data=mat['data'] label=mat['label'] data_neu=np.zeros(shape=data.shape,dtype=np.float) for i in range(data.shape[1]): data_neu[:,i]= data[:,i]/np.linalg.norm(data[:,i]) scipy.io.savemat('/[…]/[…]/scikit_learn_data/mldata/mnist-original-norm.mat', mdict={'data':data_neu, 'label':label}) * Einlesen eines 28x28 Bildes (bild_einlesen.py) from scipy import misc import numpy as np import matplotlib.pyplot as plt class Bild(object): def __init__(self,daten=None, info=None): self.daten = daten if info: self.info=info else: self.info= '' def read_from_file(self,name): self.daten = misc.imread(name, 'F') self.info = "From file: " + name def show(self): plt.imshow(self.daten,cmap=plt.get_cmap('gray')) plt.show() def bildlesen(): bild=Bild() nameBild=raw_input("Gib den Namen des Bildes ein: ") bild.read_from_file(nameBild) print "Bild shape: ", bild.daten.shape if bild.daten.shape== (28,28): bild.daten= np.reshape(bild.daten, (784,1)) print "Bild erfolgreich in Vektor geschrieben: ", bild.daten.shape elif bild.daten.shape== [784,1]: print "Bild bereits im richtigem Format, Vorgang wird fortgesetzt. " elif bild.daten.shape[0]%2!=0 or bild.daten.shape[1]%2!=0: print "Es wird ein Bild mit einer geraden Anzahl an Pixlen benoetigt!" else: bild.daten=bild.daten[bild.daten.shape[0]/2-14:bild.daten.shape[0]/2+14, bild.daten.shape[1]/2-14:bild.daten.shape[1]/2+14] bild.daten= np.reshape(bild.daten,(784,1)) print "Bild erfolgreich auf 28x28 editiert und in einen Vektor", bild.daten.shape, "umgewandelt." return bild * Testbild mit Bildgröße 28x28 (test.png) \\ {{:ss16:test.png?200|}} * k-nearest-Neighbor-Algorithmus mit Testbild (knNTest.py): from __future__ import division import numpy as np import operator import scipy.io import bild_einlesen as bl mat=scipy.io.loadmat('/[…]/[…]/scikit_learn_data/mldata/mnist-original-norm.mat') def abstand(vektor1, vektor2): abstand=np.linalg.norm(vektor1-vektor2) return abstand def nachbarn(untersuchen, vergleich): abstaende=[] for i in range(vergleich.shape[1]-1): abstaende.append((abstand(untersuchen, vergleich[:,i]),i)) if i%1000==0: print i abstaende.sort(key=operator.itemgetter(0)) return abstaende def zugehoerigkeit(zahlen,k): haeufigkeit=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0]] for i in range(k-1): haeufigkeit[zahlen[i]][1] +=1 haeufigkeit.sort(key=operator.itemgetter(1)) return haeufigkeit[9][0] def bestimmung(k): global eingelesen daten=mat['data'] zahl=mat['label'] zahlen=[] eingelesen=bl.bildlesen() test=eingelesen.daten testnorm=test/np.linalg.norm(test) abstaende=nachbarn(testnorm, daten) for i in range(k-1): zahlen.append(int(zahl[0,abstaende[i][1]])) print "Die Zahl ist: ", zugehoerigkeit(zahlen,k) bestimmung(10) * Öffnen von neuem Datensatz clean_symbols.p (symbole_lesen.py) from pickle import Unpickler with open('clean_symbols.p','r') as f: u=Unpickler(f) data=u.load() print "Datentupel, 0. Komponente: " print "Shape: ",data[0].shape print "Datentupel, 1. Komponente: " print data[1][:10] print "Shape: ", data[1].shape print "Datentupel, 2. Komponente: " print data[2][:10] print "Shape: ", data[2].shape === Problem: === Porgramm knNTest.py ist extrem langsam. Aus diesem Grund untersuchen wir mit cProfile, wo die Zeit in dem Programm verloren geht. import cProfile cProfile.run('bestimmung(10)',sort='time') bestimmung(10) * Genauigkeit des k-nearest-Neighbor-Algorithmus from __future__ import division import numpy as np import math as m import operator import scipy.io import matplotlib.pyplot as plt import random import time mat=scipy.io.loadmat('/[…]/[…]/scikit_learn_data/mldata/mnist-original-norm.mat') #pfad muss angepasst werden def abstand(vektor1, vektor2): abstand=np.linalg.norm(vektor1-vektor2) return abstand def nachbarn(untersuchen, vergleich): abstaende=[] for i in range(vergleich.shape[1]-1): abstaende.append((abstand(untersuchen, vergleich[:,i]),i)) if i%1000==0: print i abstaende.sort(key=operator.itemgetter(0)) return abstaende def zugehoerigkeit(zahlen,k): haeufigkeit=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0]] for i in range(k-1): haeufigkeit[zahlen[i]][1] +=1 haeufigkeit.sort(key=operator.itemgetter(1)) return haeufigkeit[9][0] def bestimmung(k): daten=mat['data'] choice= np.random.choice(70000,10000, replace=False) test=daten[:,choice].copy() datenkurz=np.delete(daten,choice,axis=1) zahllang=mat['label'] labels=zahllang[:,choice].copy() zahl=np.delete(zahllang,choice,axis=1) richtigkeit=[] for i in range(100-1): zahlen=[] abstaende=nachbarn(test[:,i], datenkurz) for z in range(k-1): zahlen.append(int(zahl[0, abstaende[z][1]])) print "Die Zahl ist: ", zugehoerigkeit(zahlen,k), " Label:" , labels[0][i] if zugehoerigkeit(zahlen,k)==labels[0][i]: richtigkeit.append(1) return richtigkeit for j in range(10,20): t1=time.clock() richtig=bestimmung(j) t2=time.clock() zeit=t2-t1 prozentRichtig= len(richtig)/99 print "Fuer " ,j, "als k, betraegt die Zeit: ", zeit, "und die Genauigkeit: ", prozentRichtig