CaseBasedReasoning/explore.ipynb

306 lines
14 KiB
Plaintext
Raw Permalink Normal View History

2022-12-13 13:25:31 +00:00
{
"cells": [
2023-01-08 19:05:26 +00:00
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Verkehrsszenario_Verhaltensprädiktion\n",
"\n",
"Es soll vorausgesagt werden, ob ein Fahrzeug in einer gegebenen Verkehrssituation das vorausfahrende Fahrzeug überholen wird. Dazu werden der Abstand und die Geschwindigkeit zum vorausfahrenden Fahrzeug gemessen. Zudem wird diese Information von einem Fahrzeug auf der linken Spur gemessen, welches sich von hinten nähert. Als weitere Informationen liegen die jeweiligen Fahrzeugtypen, das Wetter, die Tageszeit und die Straßenart und -krümmung vor.\n",
"\n",
"Mögliche vorherzusagende Reaktionen des Fahrzeugs sind: Geschwindigkeit und Spur beibehalten (continue), Verzögern (decelerate), Spurwechsel bei gleicher Geschwindigkeit (lane change) und Spurwechsel mit Beschleunigung (accelerated lane change).\n",
2023-01-11 06:58:45 +00:00
"Entwerfen Sie dazu ein geeignetes Ähnlichkeitsmaß und ermitteln Sie eine Repräsentation des Modells mithilfe von Case Based Learning (Verfahren aus der Vorlesung)\n",
2023-01-08 19:05:26 +00:00
"\n",
"## Aufgabenstellung\n",
"Entwickeln Sie eine Software, welche bei Eingabe einer Verkehrssituation (im gleichen Format) die Aktion des Fahrzeugs voraussagen kann. Diskutieren Sie Ihre Konfiguration und das Ergebnis.\n",
"\n",
"## Eingangsdaten\n",
2023-01-11 06:58:45 +00:00
"Ein Datensatz von Messungen, in welchem ähnliche Situationen aufgezeichnet wurden -> data/SIM_001.csv"
2023-01-08 19:05:26 +00:00
]
},
2022-12-13 13:25:31 +00:00
{
"cell_type": "code",
2023-01-11 06:58:45 +00:00
"execution_count": 6,
2022-12-13 13:25:31 +00:00
"metadata": {},
"outputs": [],
"source": [
2023-01-08 19:05:26 +00:00
"# Imports\n",
2022-12-13 13:25:31 +00:00
"from model import *\n",
"from similarity import *\n",
"import csv"
]
},
{
"cell_type": "code",
2023-01-11 06:58:45 +00:00
"execution_count": 7,
2022-12-13 13:25:31 +00:00
"metadata": {},
"outputs": [],
2022-12-14 10:33:13 +00:00
"source": [
"def create_similarity_matrix(filename, key):\n",
2023-01-08 19:05:26 +00:00
" \"\"\" \n",
" Generates similarity matrix \n",
2023-01-11 06:58:45 +00:00
"\n",
2023-01-08 19:05:26 +00:00
" Arguments:\n",
" filename: the csv file name as string\n",
" key: the title of the csv which is the value in the first line and col\n",
"\n",
" Returns:\n",
" similarity dict\n",
" \"\"\"\n",
2022-12-14 10:33:13 +00:00
" with open(filename) as file:\n",
" similarity_matrix = {}\n",
"\n",
" for line in csv.DictReader(file, skipinitialspace=True):\n",
" for k, v in line.items():\n",
" if k == key:\n",
" key_v = v\n",
" similarity_matrix[key_v] = {}\n",
" else:\n",
" similarity_matrix[key_v][k] = float(v)\n",
"\n",
2023-01-11 06:58:45 +00:00
" return similarity_matrix\n"
2022-12-14 10:33:13 +00:00
]
},
{
"cell_type": "code",
2023-01-11 06:58:45 +00:00
"execution_count": 8,
2022-12-14 10:33:13 +00:00
"metadata": {},
2022-12-22 17:35:20 +00:00
"outputs": [],
2022-12-13 13:25:31 +00:00
"source": [
2023-01-08 19:05:26 +00:00
"\"\"\"\n",
"Read data/SIM_001.csv\n",
"\"\"\"\n",
"case_base_obj = CaseBase.from_csv(\n",
2022-12-13 13:25:31 +00:00
" \"data/SIM_001.csv\",\n",
" problem_fields = (\"v\", \"v_left\", \"v_front\", \"d_left\", \"d_front\", \"type_left\", \"type_front\", \"radius_curve(m)\", \"slope_street\", \"street_type\", \"time\", \"weather\", \"type_vehicle\", \"speed_limit(km/h)\"),\n",
" solution_fields = (\"action\"),\n",
" encoding = \"utf-8\",\n",
" delimiter = \";\",\n",
" set_int = True\n",
2023-01-08 19:05:26 +00:00
")"
2022-12-13 13:25:31 +00:00
]
},
{
"cell_type": "code",
2023-01-11 06:58:45 +00:00
"execution_count": 9,
2022-12-13 13:25:31 +00:00
"metadata": {},
"outputs": [],
2022-12-14 10:33:13 +00:00
"source": [
2023-01-08 19:05:26 +00:00
"\"\"\"\n",
"Read similarity matrices.\n",
" data/vehicle_type_sim.csv\n",
" data/street_slope_sim.csv\n",
" data/street_type_sim.csv\n",
" data/time_type_sim.csv\n",
" data/weather_type_sim.csv\n",
"\"\"\"\n",
"case_base_obj.add_symbolic_sim(\n",
2022-12-14 10:33:13 +00:00
" field = \"type_left\",\n",
" similarity_matrix = create_similarity_matrix(\"data/vehicle_type_sim.csv\", \"type_vehicle\")\n",
")\n",
"\n",
2023-01-08 19:05:26 +00:00
"case_base_obj.add_symbolic_sim(\n",
2022-12-14 10:33:13 +00:00
" field = \"type_front\",\n",
" similarity_matrix = create_similarity_matrix(\"data/vehicle_type_sim.csv\", \"type_vehicle\")\n",
")\n",
"\n",
2023-01-08 19:05:26 +00:00
"case_base_obj.add_symbolic_sim(\n",
2022-12-14 10:33:13 +00:00
" field = \"type_vehicle\",\n",
" similarity_matrix = create_similarity_matrix(\"data/vehicle_type_sim.csv\", \"type_vehicle\")\n",
")\n",
"\n",
2023-01-08 19:05:26 +00:00
"case_base_obj.add_symbolic_sim(\n",
2022-12-14 10:33:13 +00:00
" field = \"slope_street\",\n",
" similarity_matrix = create_similarity_matrix(\"data/street_slope_sim.csv\", \"type_street_slope\")\n",
")\n",
"\n",
2023-01-08 19:05:26 +00:00
"case_base_obj.add_symbolic_sim(\n",
2022-12-22 16:39:16 +00:00
" field = \"street_type\",\n",
" similarity_matrix = create_similarity_matrix(\"data/street_type_sim.csv\", \"type_street\")\n",
")\n",
"\n",
2023-01-08 19:05:26 +00:00
"case_base_obj.add_symbolic_sim(\n",
2022-12-14 10:33:13 +00:00
" field = \"time\",\n",
" similarity_matrix = create_similarity_matrix(\"data/time_type_sim.csv\", \"type_time\")\n",
")\n",
"\n",
2023-01-08 19:05:26 +00:00
"case_base_obj.add_symbolic_sim(\n",
2022-12-14 10:33:13 +00:00
" field = \"weather\",\n",
" similarity_matrix = create_similarity_matrix(\"data/weather_type_sim.csv\", \"type_weather\")\n",
2023-01-08 19:05:26 +00:00
")"
2022-12-14 10:33:13 +00:00
]
2022-12-13 13:25:31 +00:00
},
{
"cell_type": "code",
2023-01-11 06:58:45 +00:00
"execution_count": 10,
2022-12-13 13:25:31 +00:00
"metadata": {},
2023-01-11 06:58:45 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your Query:\n",
" - v = 28.5\n",
" - v_left = 42.5\n",
" - v_front = 5\n",
" - d_left = -137\n",
" - d_front = 54\n",
" - type_left = motorcycle\n",
" - type_front = truck\n",
" - radius_curve = 2391\n",
" - slope_street = flat\n",
" - street_type = country_road (separated)\n",
" - time = day\n",
" - weather = dry\n",
" - type_vehicle = car\n",
" - speed_limit = 100\n",
"\n",
"Prediction: Decelerate\n",
"Probability: 92.75%\n",
"\n",
"Explanation:\n",
" - v_left = 42.5 (similarity: 1.00)\n",
" - v_front = 21.5 (similarity: 0.06)\n",
" - d_left = -137.0 (similarity: 1.00)\n",
" - d_front = 54.0 (similarity: 1.00)\n",
" - type_left = motorcycle (similarity: 1.00)\n",
" - type_front = truck (similarity: 1.00)\n",
" - radius_curve(m) = 2391.0 (similarity: 1.00)\n",
" - slope_street = flat (similarity: 1.00)\n",
" - street_type = country_road (separated) (similarity: 1.00)\n",
" - time = day (similarity: 1.00)\n",
" - weather = dry (similarity: 1.00)\n",
" - type_vehicle = car (similarity: 1.00)\n",
" - speed_limit(km/h) = 100.0 (similarity: 1.00)\n"
]
}
],
2022-12-13 13:25:31 +00:00
"source": [
2023-01-11 06:58:45 +00:00
"# Read query from cli\n",
2022-12-13 13:25:31 +00:00
"query = Query.from_problems(\n",
2023-01-11 06:58:45 +00:00
" v=28.5,\n",
" v_left=42.5,\n",
" v_front=5,\n",
" d_left=-137,\n",
" d_front=54,\n",
" type_left=\"motorcycle\",\n",
" type_front=\"truck\",\n",
" radius_curve=2391,\n",
" slope_street=\"flat\",\n",
" street_type=\"country_road (separated)\",\n",
" time=\"day\",\n",
" weather=\"dry\",\n",
" type_vehicle=\"car\",\n",
" speed_limit=100,\n",
2022-12-13 13:25:31 +00:00
")\n",
"\n",
2023-01-08 19:05:26 +00:00
"retrieved = case_base_obj.retrieve(\n",
2022-12-13 13:25:31 +00:00
" query,\n",
2023-01-11 06:58:45 +00:00
" v_left=euclid_sim,\n",
" v_front=euclid_sim,\n",
" d_left=euclid_sim,\n",
" d_front=euclid_sim,\n",
" type_left=symbolic_sim,\n",
" type_front=symbolic_sim,\n",
" radius_curve=euclid_sim,\n",
" slope_street=symbolic_sim,\n",
" street_type=symbolic_sim,\n",
" time=symbolic_sim,\n",
" weather=symbolic_sim,\n",
" type_vehicle=symbolic_sim,\n",
" speed_limit=euclid_sim,\n",
2022-12-13 13:25:31 +00:00
")\n",
"\n",
"print(\"Your Query:\")\n",
"for k, v in query.problem.items():\n",
" print(f\" - {k} = {v}\")\n",
"print()\n",
2023-01-11 06:58:45 +00:00
"\n",
"\n",
"print(f\"Prediction: {' ' .join(retrieved.solution.values()).capitalize()}\")\n",
"\n",
"# Calculate probability of prediction\n",
"prob = 0\n",
"count = 0\n",
"for field, val in retrieved.sim_per_field.items():\n",
" count += 1\n",
" prob += val\n",
"\n",
"print(f\"Probability: {((prob / count) * 100):.2f}%\")\n",
2022-12-13 13:25:31 +00:00
"print()\n",
2023-01-11 06:58:45 +00:00
"\n",
2022-12-13 13:25:31 +00:00
"print(\"Explanation:\")\n",
2023-01-08 19:05:26 +00:00
"for field, val in retrieved.sim_per_field.items():\n",
2023-01-11 06:58:45 +00:00
" print(f\" - {field} =\",\n",
" retrieved.problem[field], f\"(similarity: {val:.2f})\")\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Entwurf und Umsetzung\n",
"\n",
"Allgemein ist ein Case-Based Reasoning (CBR) Algorithmus eine Methode des maschinellen Lernens, bei der Probleme durch den Vergleich mit früheren, ähnlichen Fällen gelöst werden. Ein CBR-System arbeitet, indem es die Merkmale des aktuellen Problems mit gespeicherten Fällen vergleicht und auf Basis dieser Vergleiche eine Lösung vorschlägt. Dadurch kann der Algorithmus in einer Vielzahl von Anwendungsbereichen, die auch einen hohen Grad an Expertise erfordern können, zum Einsatz kommen. \n",
"\n",
"Beim Entwurf des Algorithmus wird darauf geachtet dass dieser auch einfach auf andere Problemstellungen angepasst werden kann. Darüber hinaus wird die Lösung in der Sprache Python umgesetzt werden.\n",
"\n",
"![Alt-Text](./KI.png \"Entwurf des Algorithmus\")\n",
"\n",
"Wie in der obigen Abbildung zu erkennen, wird der Algorithmus in drei Bereiche unterteilt. Dies ist erstens das Notebook, dadurch kann der Nutzer komfortabel auf die von ihm benötigten Funktionen zurückgreifen. Die Funktionalität wird über die model.py und die similarity.py bereitgestellt. Dabei ist die model.py das eigentliche Modell, welches über das Laden der CSV Dateien kalibriert wird. In der similarity.py befinden sich die Algorithmen, die für den Vergleich der Eingabeparameter benötigt werden.\n",
"\n",
"\n",
"## Diskussion der Konfiguration\n",
"\n",
"Wie bereits unter dem Punkt \"Entwurf und Umsetzung\" erwähnt, wird das Modell in diesem Fall über CSV Dateien kalibriert. Einerseits werden die generellen Datensätze geladen, die sich in der SIM_001.csv befinden, aber auch die Ähnlichkeitsmatrizen. Erst durch diese Ähnlichkeitsmatrizen wird dem Modell ermöglicht, die in Textform, zur Verfügung stehenden Features im Datensatz zu interpretieren und auch sicher auf andere Situationen anzuwenden. Denn durch diese wird der Zusammenhang der verschiedenen Auftrittsmöglichkeiten festgelegt. \n",
"\n",
"Festgelegt werden müssen in diesem Anwendungsfall die Beziehung zwischen den verschiedenen Straßenneigungen (flat, ascending, decending), des Straßentyps (country_road (separated), autobahn), des Zeittyps (night, dusk, day, dawn), des Fahrzeugtyps (car, motorcycle, sportscar, truck) und der Wetterart (dry, rain, fog, snow_ice).\n",
"\n",
"Die Erstellung der Ähnlichkeitsmatrix für die Straßenneigung wird nun im Folgenden näher erläutert:\n",
"\n",
"| type_street_slope | flat | ascending | decending |\n",
"| ----| ----| ----| ----|\n",
"| <b>flat</b> | 1.0 | 0.3 | 0.7 |\n",
"| <b>ascending</b> | 0.3 | 1.0 | 0.1 |\n",
"| <b>decending</b> | 0.7 | 0.1 | 1.0 |\n",
"\n",
"Das Ähnlichkeitsmaß ist eine Zahl zwischen null und eins, wobei null das Gegenteil und eins das gleiche wieder spiegelt. Wie zu erkennen ist, befindet sich in der Diagonale an jeder Stelle eine eins. Dies ist der Fall, da flat mit flat verglichen komplett gleich ist. Nun könnte man annehmen, dass bei den möglichen Zuständen flach, aufsteigend und absteigend der Vergleich zwischen flach und aufsteigend mit 0.5 bewertet wird. Wie in der Matrix zu erkennen, beträgt er jedoch 0.3. Denn die Bewertung muss im Kontext des Anwendungsfalls erfolgen, auf einer aufsteigenden Straße zu überholen ist deutlich risikoreicher als auf einer flachen oder sogar absteigenden Straße. Es ist damit zu rechnen, dass auf einer aufsteigenden Straße die Beschleunigung länger dauert, gleichzeitig rollt der Gegenverkehr den Berg herunter und fährt dadurch eventuell auch etwas zu schnell, da er weniger Widerstand hat. Dadurch ergibt sich eine Ähnlichkeit von 0.3. Eine flache zu einer absteigenden Straße haben wir mit 0.7 bewertet. Mit der Begründung, dass ein Überholvorgang auf einer flachen und einer absteigenden Straße ein ähnlich hohes Risiko mit sich bringt. Auf die Beschreibung des Vergleiches der restlichen Werte wird an dieser Stelle verzichtet, da sich das Vorgehen nur wiederholen würde.\n",
"\n",
"## Diskussion des Ergbenisses\n",
"\n",
"Durch die Aufteilung des Datensatzes (SIM_001.csv) in Trainings- und Testdaten kann die einwandfreie Funktion des Algorithmus sichergestellt werden. Denn das zu erwartende Ergebnis ist bei der Eingabe der dazugehörenden Parameter bereits bekannt. Bei den Tests des Algorithmus wurden alle Testcases richtig vorhergesagt. Dadurch kann von einer guten Genauigkeit des Algorithmus ausgegangen werden. \n",
"\n",
"Zusammenfassend vereinen Case-Based Reasoning (CBR) Algorithmen einige große Vorteile, die auch in diesem Anwendungsfall zum Vorschein getreten sind. Dazu gehört beispielsweise die Möglichkeit auch komplexe Probleme wie die Entscheidung eines Überholvorgang durch den Vergleich mit ähnlichen Fällen aus der Vergangenheit lösen zu können. Dadurch wird aber auch einer der Nachteile eines solchen Algorithmus deutlich, die Qualität hängt von der Güte und der Menge an zur Verfügung stehenden Daten ab. Auffallend ist, dass der Algorithmus sehr anpassbar und schnell an spezifische Anforderungen und Umstände angepasst werden kann. "
2022-12-13 13:25:31 +00:00
]
}
],
"metadata": {
"kernelspec": {
2022-12-14 10:33:13 +00:00
"display_name": "venv",
2022-12-13 13:25:31 +00:00
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.0"
},
"vscode": {
"interpreter": {
2022-12-22 17:35:20 +00:00
"hash": "c6b11de3c41b7cafaa0ac1297b550056ae3875bbf0c337fa48ab4f33656fc527"
2022-12-13 13:25:31 +00:00
}
}
},
"nbformat": 4,
2023-01-11 06:58:45 +00:00
"nbformat_minor": 4
2022-12-13 13:25:31 +00:00
}