diff --git a/aufgaben/p4/binary_classification.py b/aufgaben/p4/binary_classification.py
deleted file mode 100644
index 98d37b94d2937e9c838246c3c4f9a20c0bed0b52..0000000000000000000000000000000000000000
--- a/aufgaben/p4/binary_classification.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from features.moving_feature import moving_feature
-from features.standard_deviation import standard_deviation
-from korpus import create_bewegung
-
-
-def binary_classification_feature(window_size=30):
-
-    # Wir holen uns den Höhensensor des Fußes (Bleibt bei Kniebeugen gleich und bewegt sich beim Laufen)
-    joggen_values = create_bewegung('joggen').messungen[1].sensoren[1].werte
-    kniebeuge_values = create_bewegung('kniebeuge').messungen[1].sensoren[1].werte
-
-    # Berechne die Standardabweichung (Bei Kniebeugen gering, bei Joggen hoch)
-    joggen_feature = moving_feature(standard_deviation, window_size, joggen_values)
-    kniebeuge_feature = moving_feature(standard_deviation, window_size, kniebeuge_values)
-
-    return joggen_feature, kniebeuge_feature
-
-
-if __name__ == '__main__':
-    binary_classification_feature(30)
diff --git a/aufgaben/p4/feature_plot.ipynb b/aufgaben/p4/feature_plot.ipynb
index 9b6705478f25e608bfcb973811216aa90d70657e..480414313f1bd04792d4f70a3d0fc71775216fde 100644
--- a/aufgaben/p4/feature_plot.ipynb
+++ b/aufgaben/p4/feature_plot.ipynb
@@ -31,7 +31,7 @@
    "source": [
     "%matplotlib notebook\n",
     "import matplotlib.pyplot as plotter\n",
-    "from aufgaben.p4.binary_classification import binary_classification_feature\n",
+    "from aufgaben.p4.testdata import binary_classification_feature\n",
     "\n",
     "joggen_feature, kniebeuge_feature = binary_classification_feature(150)\n",
     "\n",
diff --git a/aufgaben/p4/testdata.py b/aufgaben/p4/testdata.py
new file mode 100644
index 0000000000000000000000000000000000000000..27ac0401e1f8cfe34783281635fc5211253f52d3
--- /dev/null
+++ b/aufgaben/p4/testdata.py
@@ -0,0 +1,52 @@
+from math import floor
+
+from features.moving_feature import moving_feature
+from features.standard_deviation import standard_deviation
+from korpus import create_bewegung
+
+CLASS_JOGGEN = 1
+CLASS_KNIEBEUGE = -1
+
+TRAINING_DATA_PERCENTAGE = 0.9
+
+DATA_LIMIT = 1000
+DATA_LIMIT_PER_TYPE = floor(DATA_LIMIT / 2)
+
+
+def binary_classification_feature(window_size=30):
+    # Wir holen uns den Höhensensor des Fußes (Bleibt bei Kniebeugen gleich und bewegt sich beim Laufen)
+    joggen_values = create_bewegung('joggen').messungen[1].sensoren[1].werte
+    kniebeuge_values = create_bewegung('kniebeuge').messungen[1].sensoren[1].werte
+
+    # Berechne die Standardabweichung (Bei Kniebeugen gering, bei Joggen hoch)
+    joggen_feature = moving_feature(standard_deviation, window_size, joggen_values)
+    kniebeuge_feature = moving_feature(standard_deviation, window_size, kniebeuge_values)
+
+    return joggen_feature, kniebeuge_feature
+
+
+def get_labeled_testdata():
+    # Hole die aus den Sensordaten berechneten Merkmale
+    joggen_feature, kniebeuge_feature = binary_classification_feature(150)
+
+    # Wir nehmen nur DATA_LIMIT an Daten (sonst ist K-Nearest-Neighbors zu langsam)
+    joggen_feature = joggen_feature[: min(DATA_LIMIT_PER_TYPE, len(joggen_feature))]
+    kniebeuge_feature = kniebeuge_feature[: min(DATA_LIMIT_PER_TYPE, len(kniebeuge_feature))]
+
+    # Wandel Liste an Merkmalen in einzelne Merkmalsvektoren um
+    joggen_vector = ([element] for element in joggen_feature)
+    kniebeugen_vector = ([element] for element in kniebeuge_feature)
+
+    # Weise den Trainingsdaten eine Klasse zu
+    # 0 = Kniebeuge, 1 = Joggen
+    training_data_joggen = list(zip(joggen_vector, [CLASS_JOGGEN] * len(joggen_feature)))
+    training_data_kniebeuge = list(zip(kniebeugen_vector, [CLASS_KNIEBEUGE] * len(kniebeuge_feature)))
+
+    # Wir nehmen 90 % der Testdaten zum Trainieren und 10 % zum Testen
+    delimiter_joggen = floor(len(joggen_feature) * TRAINING_DATA_PERCENTAGE)
+    delimiter_kniebeuge = floor(len(kniebeuge_feature) * TRAINING_DATA_PERCENTAGE)
+
+    training_data = training_data_joggen[:delimiter_joggen] + training_data_kniebeuge[:delimiter_kniebeuge]
+    test_data = training_data_joggen[delimiter_joggen:] + training_data_kniebeuge[delimiter_kniebeuge:]
+
+    return test_data, training_data
diff --git a/aufgaben/p5/apply_pla.py b/aufgaben/p5/apply_pla.py
index bbdb7d0c8a1b6af43ce39de42e948c579cfca21c..991f982da6459dbdc62e4e4a201563002c47dff8 100644
--- a/aufgaben/p5/apply_pla.py
+++ b/aufgaben/p5/apply_pla.py
@@ -1,38 +1,15 @@
 import random
-from math import floor
 
 import numpy
 
 from algorithm.pla.perceptron import Perceptron
 from algorithm.pla.perceptron_learning_algorithm import train
-from aufgaben.p4.binary_classification import binary_classification_feature
+from aufgaben.p4.testdata import get_labeled_testdata, CLASS_JOGGEN, CLASS_KNIEBEUGE
 from aufgaben.p6.error_rate import ErrorRate
 
-TRAINING_DATA_PERCENTAGE = 0.9
-
-CLASS_JOGGEN = 1
-CLASS_KNIEBEUGE = -1
-
 
 def apply_pla():
-    # Hole die aus den Sensordaten berechneten Merkmale
-    joggen_feature, kniebeuge_feature = binary_classification_feature(150)
-
-    # Wandel Liste an Merkmalen in einzelne Merkmalsvektoren um
-    joggen_vector = ([element] for element in joggen_feature)
-    kniebeugen_vector = ([element] for element in kniebeuge_feature)
-
-    # Weise den Trainingsdaten eine Klasse zu
-    # 0 = Kniebeuge, 1 = Joggen
-    training_data_joggen = list(zip(joggen_vector, [CLASS_JOGGEN] * len(joggen_feature)))
-    training_data_kniebeuge = list(zip(kniebeugen_vector, [CLASS_KNIEBEUGE] * len(kniebeuge_feature)))
-
-    # Wir nehmen 90 % der Testdaten zum Trainieren und 10 % zum Testen
-    delimiter_joggen = floor(len(joggen_feature) * TRAINING_DATA_PERCENTAGE)
-    delimiter_kniebeuge = floor(len(kniebeuge_feature) * TRAINING_DATA_PERCENTAGE)
-
-    training_data = training_data_joggen[:delimiter_joggen] + training_data_kniebeuge[:delimiter_kniebeuge]
-    test_data = training_data_joggen[delimiter_joggen:] + training_data_kniebeuge[delimiter_kniebeuge:]
+    test_data, training_data = get_labeled_testdata()
 
     # Erstelle ein Perzeptron
     weights = [random.random()]
@@ -52,7 +29,10 @@ def apply_pla():
     # Berechne den Grenzwert, ab wann ein Feature anders eingeordnet wird
     grenzwert = - perceptron.weights[0] / perceptron.weights[1]
 
-    return joggen_feature[delimiter_joggen:], kniebeuge_feature[delimiter_kniebeuge:], grenzwert
+    joggen_test_data = filter(lambda pair: pair[1] == CLASS_JOGGEN, test_data)
+    kniebeuge_test_data = filter(lambda pair: pair[1] == CLASS_KNIEBEUGE, test_data)
+
+    return [i[0] for i in joggen_test_data], [i[0] for i in kniebeuge_test_data], grenzwert
 
 
 if __name__ == '__main__':
diff --git a/aufgaben/p5/draw_results.ipynb b/aufgaben/p5/draw_results.ipynb
index 5c99f5849342916c02c6203ec910d9e1703f251b..3fa3ee91bdf6664d6a9e6d303784247d32283491 100644
--- a/aufgaben/p5/draw_results.ipynb
+++ b/aufgaben/p5/draw_results.ipynb
@@ -2,27 +2,26 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "metadata": {
     "collapsed": true,
     "ExecuteTime": {
-     "start_time": "2023-05-08T13:13:53.998397Z",
-     "end_time": "2023-05-08T13:14:23.437026Z"
+     "start_time": "2023-05-21T01:33:55.307530Z",
+     "end_time": "2023-05-21T01:33:57.564890Z"
     }
    },
    "outputs": [
     {
-     "ename": "KeyboardInterrupt",
-     "evalue": "",
+     "ename": "TypeError",
+     "evalue": "slice indices must be integers or None or have an __index__ method",
      "output_type": "error",
      "traceback": [
       "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
-      "\u001B[1;31mKeyboardInterrupt\u001B[0m                         Traceback (most recent call last)",
-      "\u001B[1;32m<ipython-input-2-dc2cba0b48b6>\u001B[0m in \u001B[0;36m<module>\u001B[1;34m\u001B[0m\n\u001B[0;32m      3\u001B[0m \u001B[1;32mimport\u001B[0m \u001B[0mmatplotlib\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mpyplot\u001B[0m \u001B[1;32mas\u001B[0m \u001B[0mplotter\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m      4\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m----> 5\u001B[1;33m \u001B[0mjoggen\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mkniebeuge\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mgrenzwert\u001B[0m  \u001B[1;33m=\u001B[0m \u001B[0mapply_pla\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m      6\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m      7\u001B[0m \u001B[0mplotter\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mscatter\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mjoggen\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;36m0\u001B[0m\u001B[1;33m]\u001B[0m \u001B[1;33m*\u001B[0m \u001B[0mlen\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mjoggen\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mlabel\u001B[0m\u001B[1;33m=\u001B[0m\u001B[1;34m\"Joggen\"\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
-      "\u001B[1;32mD:\\Informatik-Workspace\\PyCharm\\FH-Münster\\MEML\\aufgaben\\p5\\apply_pla.py\u001B[0m in \u001B[0;36mapply_pla\u001B[1;34m()\u001B[0m\n\u001B[0;32m     32\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     33\u001B[0m     \u001B[1;31m# Trainiere das Perzeptron\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 34\u001B[1;33m     \u001B[0mtrain\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mperceptron\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtraining_data\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;36m300\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;36m0.1\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     35\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     36\u001B[0m     \u001B[1;31m# Vergleiche alle Ergebnisse mit der erwarteten Klasse\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
-      "\u001B[1;32mD:\\Informatik-Workspace\\PyCharm\\FH-Münster\\MEML\\algorithm\\pla\\perceptron_learning_algorithm.py\u001B[0m in \u001B[0;36mtrain\u001B[1;34m(perceptron, training_data, max_iterations, learning_rate)\u001B[0m\n\u001B[0;32m     15\u001B[0m         \u001B[0mwrong_classifications\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     16\u001B[0m         \u001B[1;32mfor\u001B[0m \u001B[0mfeatures\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mcorrect_class\u001B[0m \u001B[1;32min\u001B[0m \u001B[0mtraining_data\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 17\u001B[1;33m             \u001B[0mresult\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mperceptron\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mclassify\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mfeatures\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     18\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     19\u001B[0m             \u001B[1;31m# Falls das Ergebnis falsch ist, merken wir uns die Ergebnisse\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
-      "\u001B[1;32mD:\\Informatik-Workspace\\PyCharm\\FH-Münster\\MEML\\algorithm\\pla\\perceptron.py\u001B[0m in \u001B[0;36mclassify\u001B[1;34m(self, features)\u001B[0m\n\u001B[0;32m     24\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     25\u001B[0m         \u001B[1;31m# Multipliziere die transponierten mit dem Merkmalsvektor\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 26\u001B[1;33m         \u001B[0mresult\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mnumpy\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mmatmul\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mtransposed_weights\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mall_features\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     27\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     28\u001B[0m         \u001B[1;31m# Wende die Aktivierungsfunktion auf das Ergebnis an\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
-      "\u001B[1;31mKeyboardInterrupt\u001B[0m: "
+      "\u001B[1;31mTypeError\u001B[0m                                 Traceback (most recent call last)",
+      "\u001B[1;32m<ipython-input-1-dc2cba0b48b6>\u001B[0m in \u001B[0;36m<module>\u001B[1;34m\u001B[0m\n\u001B[0;32m      3\u001B[0m \u001B[1;32mimport\u001B[0m \u001B[0mmatplotlib\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mpyplot\u001B[0m \u001B[1;32mas\u001B[0m \u001B[0mplotter\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m      4\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m----> 5\u001B[1;33m \u001B[0mjoggen\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mkniebeuge\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mgrenzwert\u001B[0m  \u001B[1;33m=\u001B[0m \u001B[0mapply_pla\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m      6\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m      7\u001B[0m \u001B[0mplotter\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mscatter\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mjoggen\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;36m0\u001B[0m\u001B[1;33m]\u001B[0m \u001B[1;33m*\u001B[0m \u001B[0mlen\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mjoggen\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mlabel\u001B[0m\u001B[1;33m=\u001B[0m\u001B[1;34m\"Joggen\"\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
+      "\u001B[1;32mD:\\Informatik-Workspace\\PyCharm\\FH-Münster\\MEML\\aufgaben\\p5\\apply_pla.py\u001B[0m in \u001B[0;36mapply_pla\u001B[1;34m()\u001B[0m\n\u001B[0;32m     10\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     11\u001B[0m \u001B[1;32mdef\u001B[0m \u001B[0mapply_pla\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 12\u001B[1;33m     \u001B[0mtest_data\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mtraining_data\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mget_labeled_testdata\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     13\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     14\u001B[0m     \u001B[1;31m# Erstelle ein Perzeptron\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
+      "\u001B[1;32mD:\\Informatik-Workspace\\PyCharm\\FH-Münster\\MEML\\aufgaben\\p4\\testdata.py\u001B[0m in \u001B[0;36mget_labeled_testdata\u001B[1;34m()\u001B[0m\n\u001B[0;32m     13\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     14\u001B[0m     \u001B[1;31m# Wir nehmen nur DATA_LIMIT an Daten (sonst ist K-Nearest-Neighbors zu langsam)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m---> 15\u001B[1;33m     \u001B[0mjoggen_feature\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mjoggen_feature\u001B[0m\u001B[1;33m[\u001B[0m\u001B[1;33m:\u001B[0m \u001B[0mmin\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mDATA_LIMIT\u001B[0m\u001B[1;33m/\u001B[0m\u001B[1;36m2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mlen\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mjoggen_feature\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m     16\u001B[0m     \u001B[0mkniebeuge_feature\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mkniebeuge_feature\u001B[0m\u001B[1;33m[\u001B[0m\u001B[1;33m:\u001B[0m \u001B[0mmin\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mDATA_LIMIT\u001B[0m \u001B[1;33m/\u001B[0m \u001B[1;36m2\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mlen\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mkniebeuge_feature\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m     17\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n",
+      "\u001B[1;31mTypeError\u001B[0m: slice indices must be integers or None or have an __index__ method"
      ]
     }
    ],
@@ -49,8 +48,8 @@
    "metadata": {
     "collapsed": false,
     "ExecuteTime": {
-     "start_time": "2023-05-08T13:14:23.437026Z",
-     "end_time": "2023-05-08T13:14:23.453023Z"
+     "start_time": "2023-05-21T01:33:57.533653Z",
+     "end_time": "2023-05-21T01:33:57.564890Z"
     }
    }
   }