Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ss16:23.06.2016

Ziele:

  • Normierung des MNIST-Datensatz
  • Einlesen eines 28×28 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 28×28 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 28×28 (test.png)

  • 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
ss16/23.06.2016.txt · Zuletzt geändert: 2016/07/07 16:50 von henrikfrenzel