diff --git a/main.py b/main.py index ed0c367c4e345af5f2103397769f7ad9f8758a41..86006cceb8752e2dc74a8da00fdd97cb719df662 100644 --- a/main.py +++ b/main.py @@ -21,7 +21,7 @@ def import_csv(filename: str, h: int or None) -> pd.DataFrame: def manhattan_distance(x1: np.ndarray, x2: np.ndarray) -> float: """ - Calcule la distance de Manhattan (L1) entre deux vecteurs. + Calcule la distance de Manhattan (L2) entre deux vecteurs. Args: x1 (numpy.ndarray): Le premier vecteur. @@ -30,7 +30,9 @@ def manhattan_distance(x1: np.ndarray, x2: np.ndarray) -> float: Returns: float: La distance de Manhattan entre x1 et x2. """ - return np.sum(np.abs(x1 - x2)) + squared_diff = (x1 - x2) ** 2 # Carré des différences + l2_manhattan = np.sqrt(np.sum(squared_diff)) # Racine carrée de la somme des carrés + return l2_manhattan def assign_clusters(X: np.ndarray, centroids: np.ndarray) -> np.ndarray: @@ -62,21 +64,19 @@ def k_means(X: np.ndarray, k: int, max_iterations: int = 100) -> Tuple[np.ndarra """ # Initialisation des k-centroïdes de manière aléatoire np.random.seed(0) - centroids = X[np.random.choice(X.shape[0], k, replace=False)] + centroids = X[np.random.choice(X.shape[0], k, replace=False)] # séléctionne k points aléatoirement dans la liste X old_centroids = np.zeros(centroids.shape) new_centroids = centroids.copy() - distances_history = [] # Pour stocker la somme des distances à chaque itération + distances_history = [] # Pour stocker la somme des distances iteration = 0 + # pour vérifier que les centroides ne changent plus , il faut check que l'ancien et le nouveau soient pareils , on ajoute tout de même un nombre d'itérations max pour ne pas tourner à l'infini while not np.array_equal(old_centroids, new_centroids) and iteration < max_iterations: iteration += 1 - labels = assign_clusters(X, new_centroids) - old_centroids = new_centroids.copy() - for i in range(k): new_centroids[i] = np.mean(X[labels == i], axis=0) @@ -88,7 +88,6 @@ def k_means(X: np.ndarray, k: int, max_iterations: int = 100) -> Tuple[np.ndarra total_distance += cluster_distance distances_history.append(total_distance) - # Affichage des clusters à cette itération plt.figure(figsize=(8, 6)) for i in range(k): @@ -125,7 +124,7 @@ if __name__ == "__main__": # afficher les nouveaux cluster à chaque itérations # Charger les données depuis le fichier CSV - df = import_csv("Data/iris.csv", None) + df = import_csv("Data/iris.csv", h=None) X = df.iloc[:, :-1].values k = 3