import time import csv # um Text-Dateien im CSV-Format zu lesen import random from math import sqrt #ist bei Standard Python nicht dabei # CSV-Files oefffnen traindata = open('C:/temp/data.csv', 'r') testdata = open('C:/temp/testdata.csv','r') # CSV-Files oefffnen trainreader = csv.reader(traindata, delimiter=',', quoting=csv.QUOTE_NONNUMERIC) testreader = csv.reader(testdata, delimiter=',', quoting=csv.QUOTE_NONNUMERIC) # CSV-Files in Liste umwandeln datalist = list(trainreader) testlist = list(testreader) # File-handle schliessen traindata.close() testdata.close() # Funktion, die einem Punkt eine Klasse auf Grund der k naechsten Nachbarn zuweist. def assignClass(point, k): # Liste um die Distanzen zu speichern. distlist = [] # Für jeden den Punkt point die Distanzen zu allen Punkten in datalist berechnen. for i in range(len(datalist)): distlist.append([datalist[i][2],sqrt((point[0] - datalist[i][0]) ** 2 + (point[1] - datalist[i][1]) ** 2)]) # das waere ein sehr Pythonesquer Weg mit Lambda-Funktionen # nearest = sorted(distlist,key=lambda result:result[1]) # definiere eine Funktion, welche das zweite Element zurueckgibt. def sortFunction(item): return item[1] # Sortiere die liste! Achtung: Man koennte auch ohne key Arbeiten, wenn Distanz an 1. Stelle waere nearest = sorted(distlist, key=sortFunction) # Zaehle Klassennummern und entscheide ueber Klasse. Achtung: Laesst sich so nicht auf k>2 Klassen erweitern. classsum = sum([nearest[i][0] for i in range(k)]) if classsum > k / 2: retclass = 1 elif classsum < k / 2: retclass = 0 else: retclass = random.randint(0, 1) return retclass ## Bereich zum Vergleichen: testlength=len(testlist) summary = [] ## Iteriere über mehrere Anzahl Nachbarn. for k in range(1,20): correct = 0 for i in range(testlength): # teste ob korrekt klassifiziert: wenn ja, correct um 1 erhöhen if(abs(testlist[i][2]) - assignClass(testlist[i][0:2],k)<.5): correct+=1 # k und relative Anzahl korrekter ablegen summary.append([k,float(correct)/testlength]) print(summary)