diff --git a/TD/TD2/ML-TD2.pdf b/TD/TD2/ML-TD2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..0fbcbf5398739e202a5a64ed6147fb1a835d58d5
Binary files /dev/null and b/TD/TD2/ML-TD2.pdf differ
diff --git a/TD/TD2/food_truck.txt b/TD/TD2/food_truck.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0f88ccb611f840ba9283e0de2a26b6cb9b8fde02
--- /dev/null
+++ b/TD/TD2/food_truck.txt
@@ -0,0 +1,97 @@
+6.1101,17.592
+5.5277,9.1302
+8.5186,13.662
+7.0032,11.854
+5.8598,6.8233
+8.3829,11.886
+7.4764,4.3483
+8.5781,12
+6.4862,6.5987
+5.0546,3.8166
+5.7107,3.2522
+14.164,15.505
+5.734,3.1551
+8.4084,7.2258
+5.6407,0.71618
+5.3794,3.5129
+6.3654,5.3048
+5.1301,0.56077
+6.4296,3.6518
+7.0708,5.3893
+6.1891,3.1386
+20.27,21.767
+5.4901,4.263
+6.3261,5.1875
+5.5649,3.0825
+18.945,22.638
+12.828,13.501
+10.957,7.0467
+13.176,14.692
+22.203,24.147
+5.2524,-1.22
+6.5894,5.9966
+9.2482,12.134
+5.8918,1.8495
+8.2111,6.5426
+7.9334,4.5623
+8.0959,4.1164
+5.6063,3.3928
+12.836,10.117
+6.3534,5.4974
+5.4069,0.55657
+6.8825,3.9115
+11.708,5.3854
+5.7737,2.4406
+7.8247,6.7318
+7.0931,1.0463
+5.0702,5.1337
+5.8014,1.844
+11.7,8.0043
+5.5416,1.0179
+7.5402,6.7504
+5.3077,1.8396
+7.4239,4.2885
+7.6031,4.9981
+6.3328,1.4233
+6.3589,-1.4211
+6.2742,2.4756
+5.6397,4.6042
+9.3102,3.9624
+9.4536,5.4141
+8.8254,5.1694
+5.1793,-0.74279
+21.279,17.929
+14.908,12.054
+18.959,17.054
+7.2182,4.8852
+8.2951,5.7442
+10.236,7.7754
+5.4994,1.0173
+20.341,20.992
+10.136,6.6799
+7.3345,4.0259
+6.0062,1.2784
+7.2259,3.3411
+5.0269,-2.6807
+6.5479,0.29678
+7.5386,3.8845
+5.0365,5.7014
+10.274,6.7526
+5.1077,2.0576
+5.7292,0.47953
+5.1884,0.20421
+6.3557,0.67861
+9.7687,7.5435
+6.5159,5.3436
+8.5172,4.2415
+9.1802,6.7981
+6.002,0.92695
+5.5204,0.152
+5.0594,2.8214
+5.7077,1.8451
+7.6366,4.2959
+5.8707,7.2029
+5.3054,1.9869
+8.2934,0.14454
+13.394,9.0551
+5.4369,0.61705
diff --git a/TD/TD2/houses.txt b/TD/TD2/houses.txt
new file mode 100644
index 0000000000000000000000000000000000000000..79e9a807edd86632d58aa2ec832e190d997f43e7
--- /dev/null
+++ b/TD/TD2/houses.txt
@@ -0,0 +1,47 @@
+2104,3,399900
+1600,3,329900
+2400,3,369000
+1416,2,232000
+3000,4,539900
+1985,4,299900
+1534,3,314900
+1427,3,198999
+1380,3,212000
+1494,3,242500
+1940,4,239999
+2000,3,347000
+1890,3,329999
+4478,5,699900
+1268,3,259900
+2300,4,449900
+1320,2,299900
+1236,3,199900
+2609,4,499998
+3031,4,599000
+1767,3,252900
+1888,2,255000
+1604,3,242900
+1962,4,259900
+3890,3,573900
+1100,3,249900
+1458,3,464500
+2526,3,469000
+2200,3,475000
+2637,3,299900
+1839,2,349900
+1000,1,169900
+2040,4,314900
+3137,3,579900
+1811,4,285900
+1437,3,249900
+1239,3,229900
+2132,4,345000
+4215,4,549000
+2162,4,287000
+1664,2,368500
+2238,3,329900
+2567,4,314000
+1200,3,299000
+852,2,179900
+1852,4,299900
+1203,3,239500
diff --git a/TD/TD2/regression_lineaire.py b/TD/TD2/regression_lineaire.py
new file mode 100644
index 0000000000000000000000000000000000000000..d9e5a229a173018f368b2917c81343791916a43f
--- /dev/null
+++ b/TD/TD2/regression_lineaire.py
@@ -0,0 +1,186 @@
+import matplotlib.pyplot as plt
+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]
+    N : nombre d'éléments
+    nb_var : nombre de variables prédictives
+
+    """
+    
+    data = np.loadtxt(nom_fichier, delimiter=delimiteur)
+    
+    #######################
+    ##### A compléter ##### 
+    #######################
+    
+    # return X, Y, N, nb_var
+
+def normalisation(X):
+    """
+    
+
+    Parametres
+    ----------
+    X : matrice des données de dimension [N, nb_var]
+    
+    avec N : nombre d'éléments et nb_var : nombre de variables prédictives
+
+    Retour
+    -------
+    X_norm : matrice des données centrées-réduites de dimension [N, nb_var]
+    mu : moyenne des variables de dimension [1,nb_var]
+    sigma : écart-type des variables de dimension [1,nb_var]
+
+    """
+    
+    #########################################################
+    ##### A compléter (et supprimer l'instruction pass) ##### 
+    #########################################################
+    pass
+
+    # return X_norm, mu, sigma
+
+def calcule_cout(X, Y, theta):
+    """ Calcule la valeur de la fonction cout (moyenne des différences au carré)
+    
+    Parametres
+    ----------
+    X : matrice des données de dimension [N, nb_var+1]
+    Y : matrice contenant les valeurs de la variable cible de dimension [N, 1]
+    theta : matrices contenant les paramètres theta du modèle linéaire de dimension [1, nb_var+1]
+    
+    avec N : nombre d'éléments et nb_var : nombre de variables prédictives
+
+    Return
+    -------
+    cout : nombre correspondant à la valeur de la fonction cout (moyenne des différences au carré)
+
+    """
+
+    #########################################################
+    ##### A compléter (et supprimer l'instruction pass) ##### 
+    #########################################################
+    pass
+
+    # return cout
+
+def descente_gradient(X, Y, theta, alpha, nb_iters):
+    """ Apprentissage des parametres de regression linéaire par descente du gradient
+    
+    Parametres
+    ----------
+    X : matrice des données de dimension [N, nb_var+1]
+    Y : matrice contenant les valeurs de la variable cible de dimension [N, 1]
+    theta : matrices contenant les paramètres theta du modèle linéaire de dimension [1, nb_var+1]
+    alpha : taux d'apprentissage
+    nb_iters : nombre d'itérations
+    
+    avec N : nombre d'éléments et nb_var : nombre de variables prédictives
+
+
+    Retour
+    -------
+    theta : matrices contenant les paramètres theta appris par descente du gradient de dimension [1, nb_var+1]
+    J_history : tableau contenant les valeurs de la fonction cout pour chaque iteration de dimension nb_iters
+
+
+    """
+    
+    # Initialisation de variables utiles
+    N = X.shape[0]
+    J_history = np.zeros(nb_iters)
+
+    for i in range(0, nb_iters):
+
+        #########################################################
+        ##### A compléter (et supprimer l'instruction pass) ##### 
+        #########################################################
+        pass
+        
+
+    return theta, J_history
+
+def affichage(X, Y, theta):
+    """ Affichage en 2 dimensions des données et de la courbe de régression linéaire déterminée par theta
+    
+
+    Parametres
+    ----------
+    X : matrice des données de dimension [N, nb_var+1]
+    Y : matrice contenant les valeurs de la variable cible de dimension [N, 1]
+    theta : matrices contenant les paramètres theta du modèle linéaire de dimension [1, nb_var+1]
+    
+    avec N : nombre d'éléments et nb_var : nombre de variables prédictives
+
+    Retour
+    -------
+    None
+
+    """
+    #########################################################
+    ##### A compléter (et supprimer l'instruction pass) ##### 
+    #########################################################
+    pass
+    
+    plt.show()
+
+
+if __name__ == "__main__":
+
+    # ===================== Partie 1: Lecture et normalisation des données=====================
+    print("Lecture des données ...")
+
+    X, Y, N, nb_var = lecture_donnees("food_truck.txt")
+    # X, Y, N, nb_var = lecture_donnees("houses.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]}")
+
+    # Normalisation des variables (centrage-réduction)
+    print("Normalisation des variables ...")
+
+    X, mu, sigma = normalisation(X)
+
+    # Ajout d'une colonne de 1 à X (pour theta0)
+    X = np.hstack((np.ones((N,1)), X)) 
+
+    # ===================== Partie 2: Descente du gradient =====================
+    print("Apprentissage par descente du gradient ...")
+
+    # Choix du taux d'apprentissage et du nombre d'itérations
+    alpha = 0.01
+    nb_iters = 1500
+
+    # Initialisation de theta et réalisation de la descente du gradient
+    theta = np.zeros((1,nb_var+1))
+    theta, J_history = descente_gradient(X, Y, theta, alpha, nb_iters)
+
+    # Affichage de l'évolution de la fonction de cout lors de la descente du gradient
+    plt.figure()
+    plt.title("Evolution de le fonction de cout lors de la descente du gradient")
+    plt.plot(np.arange(J_history.size), J_history)
+    plt.xlabel("Nombre d'iterations")
+    plt.ylabel("Cout J")
+
+    # Affichage de la valeur de theta
+    print(f"Theta calculé par la descente du gradient : {theta}")
+
+    # Dans le cas d'une seule variable, afficher la courbe de regression linéaire
+    if nb_var == 1 :
+        affichage(X,Y,theta)
+    plt.show()
+
+    print("Regression linéaire Terminée.")