4 KiB
Angabe
Allgemein:
Implementieren Sie einen Klassifizierer mittels k -Nearest -Neighbor Algorithmus. Sie können dafür Java oder C# als Sprache auswählen und dürfen keine Machine Learning Frameworks ver wenden. Messen Sie jeweils die Zeit für jeweils 1000 , 10.000 oder 100.000 Klas sifizierungen (also ohne Einlesen der Daten, Lernen etc.). Teilen Sie die Daten jeweils in Lern- und Test Daten. Verwenden Sie dafür ein beliebiges Validation Verfahren, erstellen Sie eine Confusion Matrix und berechnen Sie die Accuracy für Ihren Algorithmus. Achten Sie bei der Implementierung, dass Sie konkret dieses Beispiel lösen. Sie müssen keine allgemeine, wiederverwendbare Lösung implementieren, die auch für andere Dat en verwendet werden kann. Abzugeben ist ein einseitiger Bericht im PDF Format mit den gemessenen Zeiten und den Confusion Matri zen. Beim Prüfungsgespräch ist auch der Code zu erklären.
Variante 1:
Daten zu den Iris -Blumen aus https://archive.ics.uci.edu/ml/datasets/Iris .
Variante 2:
Daten zur Weinqualität aus https://archive.ics.uci.edu/ml/datasets/Wine+Quality , Rot -, oder Weißwein
Zusatzaufgabe (Optional):
Erstellen Sie zunächst ein Framework für den kNN Algorithmus und implementieren Sie Klassen, die auch für andere Daten zum Einsatz kommen können.
# Imports
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import urllib.request
import random
Iris Blumen
Attribute Information:
- sepal length in cm
- sepal width in cm
- petal length in cm
- petal width in cm
- class:
- Iris Setosa
- Iris Versicolour
- Iris Virginica
# Fetch data
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/bezdekIris.data'
response = urllib.request.urlopen(url)
respbytes = response.read()
resptext = str(respbytes, 'utf8')
resptext
# Parse data
lines = resptext.split('\n')
data = [[
float(line.split(',')[0]),
float(line.split(',')[1]),
float(line.split(',')[2]),
float(line.split(',')[3]),
line.split(',')[4]]
for line
in lines
if len(line.split(',')) == len(head)]
data_setosa = [row for row in data if row[4] == 'Iris-setosa']
data_versicolor = [row for row in data if row[4] == 'Iris-versicolor']
data_virginica = [row for row in data if row[4] == 'Iris-virginica']
- x: Sepal Length
- y: Sepal Width
plt.scatter([x[0] for x in data_setosa], [y[1] for y in data_setosa])
plt.scatter([x[0] for x in data_versicolor], [y[1] for y in data_versicolor])
plt.scatter([x[0] for x in data_virginica], [y[1] for y in data_virginica])
- x: Pedal Length
- y: Pedal Width
plt.scatter([x[2] for x in data_setosa], [y[3] for y in data_setosa])
plt.scatter([x[2] for x in data_versicolor], [y[3] for y in data_versicolor])
plt.scatter([x[2] for x in data_virginica], [y[3] for y in data_virginica])
TEST_SAMPLE_SIZE = 5
data_setosa = random.sample(data_setosa, len(data_setosa))
data_versicolor = random.sample(data_versicolor, len(data_versicolor))
data_virginica = random.sample(data_virginica, len(data_virginica))
test_sample = data_setosa[:TEST_SAMPLE_SIZE] + data_versicolor[:TEST_SAMPLE_SIZE] + data_virginica[:TEST_SAMPLE_SIZE]
training_sample = data_setosa[TEST_SAMPLE_SIZE:] + data_versicolor[TEST_SAMPLE_SIZE:] + data_virginica[TEST_SAMPLE_SIZE:]
Weinqualität
# Fetch data
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv'
response = urllib.request.urlopen(url)
respbytes = response.read()
resptext = str(respbytes, 'utf8')
# Parse data
lines = resptext.split('\n')
head = lines[0].replace('"', '').split(';')
data = [[
float(val)
for val
in line.split(';')]
for line
in lines[1:]
if len(line.split(';')) == len(head)]
for i in range(0, len(head)):
print(i, head[i])
plt.scatter([x[11] for x in data], [y[0] for y in data])