=== 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