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