diff --git a/TD/TD1/centres_mobiles-complet.py b/TD/TD1/centres_mobiles-complet.py new file mode 100644 index 0000000000000000000000000000000000000000..4396a3c51c293451350caaa903f21e53be1548b9 --- /dev/null +++ b/TD/TD1/centres_mobiles-complet.py @@ -0,0 +1,202 @@ +import numpy as np + +def lecture_donnees(nom_fichier, delimiteur=','): + """ Lit le fichier contenant les données et renvoiee les matrices correspondant + + Parametres + ---------- + nom_fichier : nom du fichier contenant les données + delimiteur : caratère délimitant les colonne dans le fichier ("," par défaut) + + Retour + ------- + X : matrice des données de dimension [N, nb_var] + Y : matrice contenant les valeurs de la variable cible de dimension [N, 1] + + avec N : nombre d'exemplaires et nb_var : nombre de variables prédictives + + """ + data = np.loadtxt(nom_fichier, delimiter=delimiteur) + N = data.shape[0] + X = data[:,:-1] + Y = data[:,-1].reshape(N,1) + return X, Y + +def normalisation(data): + """ Normalise les données par un centrage-réduction des variables prédictives + + + Parametres + ---------- + data : matrice des données de dimension [N, nb_var] + + avec N : nombre d'éléments et nb_var : nombre de variables prédictives + + Retour + ------- + data_norm : matrice des données centrées-réduites de dimension [N, nb_var] + + """ + + mu = np.mean(data, 0) + sigma = np.std(data, 0) + data_norm = (data - mu) / sigma + + return data_norm + +def initialisation_centres(data, k): + """ Initialise les centres en choisissant aléatoirement k points dans les données. + + Parametres + ---------- + data : matrice des données de dimension [N, nb_var] + k : nombre de centres désirés + + Retour + ------- + centres : matrice des données de dimension [k, nb_var] contenant les coordonnées des k centres + + avec N : nombre d'exemplaires et nb_var : nombre de variables prédictives + + """ + indices = np.random.choice(len(data), k, replace=False) + centres = data[indices] + return centres + +def distance_euclidienne(v1, v2): + """ Calcul de la distance euclidienne entre 2 points. + + Parametres + ---------- + v1 et v2 : vecteurs de dimension [1, nb_var] + + Retour + ------- + dist : valeur scalaire correspondant à la distance euclidienne entre v1 et v2 + + avec nb_var : nombre de variables prédictives + + """ + dist = np.sqrt( ((v1-v2)**2).sum() ) + return dist + + +def affectation_partition(data, centres): + """ Définit une partition en assignant chaque point de données à la classe + dont le centre est le plus proche. + + Parametres + ---------- + data : matrice des données de dimension [N, nb_var] + centres k : matrice contenant les coordonnées des centres de dimension [k, nb_var] + + Retour + ------- + partition : matrice des données de dimension [N, 1] et contenant le code de la classe pour chaque exemplaire + + avec N : nombre d'exemplaires, nb_var : nombre de variables prédictives, k : nombre de classes + + """ + partition = [] + for point in data: + distances = [distance_euclidienne(point, centre) for centre in centres] + partition.append(np.argmin(distances)) + + partition = np.array(partition) + return partition + +def maj_centres(data, partition, k): + """ Met à jour les centres en calculant la moyenne des points assignés à chaque classe. + + Parametres + ---------- + data : matrice des données de dimension [N, nb_var] + partition : matrice des données de dimension [N, 1] + k : nombre de centres + + Retour + ------- + centres : matrice des données de dimension [k, nb_var] contenant les coordonnées des k centres + + avec N : nombre d'exemplaires, nb_var : nombre de variables prédictives + + """ + + nv_centres = [] + for classe_id in range(k): + classe_points = data[partition == classe_id] + nv_centres.append(np.mean(classe_points, axis=0)) + + nv_centres = np.array(nv_centres) + return nv_centres + +def centres_mobiles(data, k, nb_iters=100): + """ + Implémente l'algorithme k-means. + + :param data: Données d'entrée (numpy array). + :param k: Nombre de clusters. + :param max_iters: Nombre maximum d'itérations. + :return: Les centroids finaux et les labels des clusters. + """ + + """ Implémente l'algorithme centres mobiles. + + Parametres + ---------- + data : matrice des données de dimension [N, nb_var] + k : nombre de centres + nb_iters = nombres d'itérations pour la mise à jour de la partition + + Retour + ------- + centres : matrice des données de dimension [k, nb_var] contenant les coordonnées des k centres + partition : matrice des données de dimension [N, 1] et contenant le code de la classe pour chaque exemplaire + + avec N : nombre d'exemplaires, nb_var : nombre de variables prédictives + + """ + + # Initialiser les centres + centres = initialisation_centres(data, k) + + for iteration in range(nb_iters): + # Définir la partition + partition = affectation_partition(data, centres) + + # Calculer les coordonnées des nouveaux centres + nv_centres = maj_centres(data, partition, k) + + centres = nv_centres + + return centres, partition + +# Programme principal +if __name__ == "__main__": + + print("Lecture des données ...") + + X, Y = lecture_donnees("iris.txt") + + # Affichage des 10 premiers exemples du dataset + print("Affichage des 10 premiers exemples du dataset : ") + for i in range(0, 10): + print(f"x = {X[i,:]}, y = {Y[i]}") + + print("Dimension des données : ") + print(X.shape) + + # Normalisation des données + X = normalisation(X) + + # Nombre de clusters + k = 3 + + # Exécution des centres mobiles + centres, partition = centres_mobiles(X, k) + + print("Centres finaux :") + print(centres) + + print("Partition :") + print(partition) diff --git a/TD/TD2/ML-TD2.pdf b/TD/TD2/ML-TD2.pdf index 0fbcbf5398739e202a5a64ed6147fb1a835d58d5..52e3b3be12f5bde3ae7dd332e3d1de5f96dc21f5 100644 Binary files a/TD/TD2/ML-TD2.pdf and b/TD/TD2/ML-TD2.pdf differ