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" } } }