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.")