From 12e4f345cfcd07af45aa88743141391efa6c1b41 Mon Sep 17 00:00:00 2001 From: "bollet.c" <> Date: Sat, 18 May 2024 21:19:37 +0200 Subject: [PATCH] manhattan --- ihm.py | 7 ++++++- knn.py | 23 +++++++++++++++++++++-- test.py | 5 +++-- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/ihm.py b/ihm.py index 99d3921..9a20ab1 100644 --- a/ihm.py +++ b/ihm.py @@ -51,6 +51,10 @@ class Interface(tk.Frame): self.choix_date = DateSelection(param) self.choix_temp_moy = TemperatureSelection(param, "Température moyenne") self.choix_temp_ref = TemperatureSelection(param, "Température de référence") + self.EuclidOrManhattan = tk.IntVar() + tk.Radiobutton(tabTest, text="Distance euclidienne", variable=self.EuclidOrManhattan, value=1).pack() + tk.Radiobutton(tabTest, text="Distance de manhattan", variable=self.EuclidOrManhattan, value=0).pack() + btn_entrer = tk.Button(tabTest, text='Tester', command=lambda : self.affResTest(tabRes)) btn_entrer.pack() @@ -67,8 +71,9 @@ class Interface(tk.Frame): date_choisie = self.choix_date.get() temperature_moyenne = self.choix_temp_moy.get() temperature_ref = self.choix_temp_ref.get() + isEuclideanDistance = self.EuclidOrManhattan.get() - res = str(lancerTest(k, (date_choisie, temperature_moyenne, temperature_ref))) + res = str(lancerTest(k, (date_choisie, temperature_moyenne, temperature_ref), isEuclideanDistance)) self.affichage_resultats['text'] = "La consommation électrique \nprévue est de " + res + " MW." self.tabs.select(tab) diff --git a/knn.py b/knn.py index 22e69c7..fd16ae4 100644 --- a/knn.py +++ b/knn.py @@ -7,7 +7,7 @@ def ecartDate(date1, date2): secParJour = 86400 return delta_sec / secParJour -def distance(point1, point2): +def distance_euclide(point1, point2): """Prend en paramètre 2 tuples au format (Date du jour, Température moyenne, température de référence) et qui renvoie un nombre réel représentant @@ -19,15 +19,34 @@ def distance(point1, point2): return duree**2/100 + delta_T_moy**2 + delta_T_ref**2 +def distance_manhattan(point1, point2): + """Prend en paramètre 2 tuples au format + (Date du jour, Température moyenne, température de référence) + et qui renvoie un nombre réel représentant + la distance de Manhattan entre ces deux points""" + + duree = abs(ecartDate(point1[0], point2[0])) + delta_T_moy = abs(point1[1]-point2[1]) + delta_T_ref = abs(point1[2]-point2[2]) + + return duree/100 + delta_T_moy + delta_T_ref + -def kPlusProches(point_a_verifier, tableau, k): + +def kPlusProches(point_a_verifier, tableau, k, isEuclideanDistance): """Prend en paramètres un tuple au format (Date du jour, Température moyenne, température de référence) et un tableau au format (Numéro du jour, Température moyenne, Température de référence). + `isEuclidDistance` : true -> euclide ; false -> manhattan Renvoie un tableau trié avec les k plus proches points de `point_a_verifier`, au format (distance, indice du tableau original)""" dist = [] + if isEuclideanDistance: + distance = distance_euclide + else: + distance = distance_manhattan + for i, point in enumerate(tableau): dist.append((distance(point_a_verifier, point[0]), i)) dist = sorted(dist, key=lambda t: t[0]) diff --git a/test.py b/test.py index c789ac5..b049581 100644 --- a/test.py +++ b/test.py @@ -1,13 +1,14 @@ from knn import kPlusProches from lecture import lecture -def lancerTest(nombre_voisins, point_a_verifier): +def lancerTest(nombre_voisins, point_a_verifier, isEuclideanDistance): """effectue prédiction""" fichier_apprentissage = lecture("data/pic-journalier-consommation.csv") k_plus_proches = kPlusProches(point_a_verifier, \ fichier_apprentissage, \ - nombre_voisins) + nombre_voisins,\ + isEuclideanDistance) conso_prevue = 0 liste_indices = [elem[1] for elem in k_plus_proches]