diff --git a/Cours/ML-04-Regression_logistique.pdf b/Cours/ML-04-Regression_logistique.pdf index 60d80d5d7aaa828460e4bd16f0d3b60fb44b9a31..38c59b03cefd66e98648791f8a924f0c12ceaab6 100644 Binary files a/Cours/ML-04-Regression_logistique.pdf and b/Cours/ML-04-Regression_logistique.pdf differ diff --git a/TD/TD3/ML-TD3.pdf b/TD/TD3/ML-TD3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..11f3c2f94a519613b0967a026b388d9b874c6fc4 Binary files /dev/null and b/TD/TD3/ML-TD3.pdf differ diff --git a/TD/TD3/notes.txt b/TD/TD3/notes.txt new file mode 100644 index 0000000000000000000000000000000000000000..3a5f95245719c6f7f08ece4a7785c0f0467c610e --- /dev/null +++ b/TD/TD3/notes.txt @@ -0,0 +1,100 @@ +34.62365962451697,78.0246928153624,0 +30.28671076822607,43.89499752400101,0 +35.84740876993872,72.90219802708364,0 +60.18259938620976,86.30855209546826,1 +79.0327360507101,75.3443764369103,1 +45.08327747668339,56.3163717815305,0 +61.10666453684766,96.51142588489624,1 +75.02474556738889,46.55401354116538,1 +76.09878670226257,87.42056971926803,1 +84.43281996120035,43.53339331072109,1 +95.86155507093572,38.22527805795094,0 +75.01365838958247,30.60326323428011,0 +82.30705337399482,76.48196330235604,1 +69.36458875970939,97.71869196188608,1 +39.53833914367223,76.03681085115882,0 +53.9710521485623,89.20735013750205,1 +69.07014406283025,52.74046973016765,1 +67.94685547711617,46.67857410673128,0 +70.66150955499435,92.92713789364831,1 +76.97878372747498,47.57596364975532,1 +67.37202754570876,42.83843832029179,0 +89.67677575072079,65.79936592745237,1 +50.534788289883,48.85581152764205,0 +34.21206097786789,44.20952859866288,0 +77.9240914545704,68.9723599933059,1 +62.27101367004632,69.95445795447587,1 +80.1901807509566,44.82162893218353,1 +93.114388797442,38.80067033713209,0 +61.83020602312595,50.25610789244621,0 +38.78580379679423,64.99568095539578,0 +61.379289447425,72.80788731317097,1 +85.40451939411645,57.05198397627122,1 +52.10797973193984,63.12762376881715,0 +52.04540476831827,69.43286012045222,1 +40.23689373545111,71.16774802184875,0 +54.63510555424817,52.21388588061123,0 +33.91550010906887,98.86943574220611,0 +64.17698887494485,80.90806058670817,1 +74.78925295941542,41.57341522824434,0 +34.1836400264419,75.2377203360134,0 +83.90239366249155,56.30804621605327,1 +51.54772026906181,46.85629026349976,0 +94.44336776917852,65.56892160559052,1 +82.36875375713919,40.61825515970618,0 +51.04775177128865,45.82270145776001,0 +62.22267576120188,52.06099194836679,0 +77.19303492601364,70.45820000180959,1 +97.77159928000232,86.7278223300282,1 +62.07306379667647,96.76882412413983,1 +91.56497449807442,88.69629254546599,1 +79.94481794066932,74.16311935043758,1 +99.2725269292572,60.99903099844988,1 +90.54671411399852,43.39060180650027,1 +34.52451385320009,60.39634245837173,0 +50.2864961189907,49.80453881323059,0 +49.58667721632031,59.80895099453265,0 +97.64563396007767,68.86157272420604,1 +32.57720016809309,95.59854761387875,0 +74.24869136721598,69.82457122657193,1 +71.79646205863379,78.45356224515052,1 +75.3956114656803,85.75993667331619,1 +35.28611281526193,47.02051394723416,0 +56.25381749711624,39.26147251058019,0 +30.05882244669796,49.59297386723685,0 +44.66826172480893,66.45008614558913,0 +66.56089447242954,41.09209807936973,0 +40.45755098375164,97.53518548909936,1 +49.07256321908844,51.88321182073966,0 +80.27957401466998,92.11606081344084,1 +66.74671856944039,60.99139402740988,1 +32.72283304060323,43.30717306430063,0 +64.0393204150601,78.03168802018232,1 +72.34649422579923,96.22759296761404,1 +60.45788573918959,73.09499809758037,1 +58.84095621726802,75.85844831279042,1 +99.82785779692128,72.36925193383885,1 +47.26426910848174,88.47586499559782,1 +50.45815980285988,75.80985952982456,1 +60.45555629271532,42.50840943572217,0 +82.22666157785568,42.71987853716458,0 +88.9138964166533,69.80378889835472,1 +94.83450672430196,45.69430680250754,1 +67.31925746917527,66.58935317747915,1 +57.23870631569862,59.51428198012956,1 +80.36675600171273,90.96014789746954,1 +68.46852178591112,85.59430710452014,1 +42.0754545384731,78.84478600148043,0 +75.47770200533905,90.42453899753964,1 +78.63542434898018,96.64742716885644,1 +52.34800398794107,60.76950525602592,0 +94.09433112516793,77.15910509073893,1 +90.44855097096364,87.50879176484702,1 +55.48216114069585,35.57070347228866,0 +74.49269241843041,84.84513684930135,1 +89.84580670720979,45.35828361091658,1 +83.48916274498238,48.38028579728175,1 +42.2617008099817,87.10385094025457,1 +99.31500880510394,68.77540947206617,1 +55.34001756003703,64.9319380069486,1 +74.77589300092767,89.52981289513276,1 diff --git a/TD/TD3/regression_logistique.py b/TD/TD3/regression_logistique.py new file mode 100644 index 0000000000000000000000000000000000000000..71448b15f3a89018274af1c63064d211e56ffe7e --- /dev/null +++ b/TD/TD3/regression_logistique.py @@ -0,0 +1,262 @@ +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): + """ Normalise les données par un centrage-réduction des variables prédictives + + 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 sigmoide(z): + """ Calcule la valeur de la fonction sigmoide appliquée à z + + Parametres + ---------- + z : peut être un scalaire ou une matrice + + Return + ------- + s : valeur de sigmoide de z. Même dimension que z + + """ + + ######################################################### + ##### A compléter (et supprimer l'instruction pass) ##### + ######################################################### + pass + + # return s + +def calcule_cout(X, Y, theta): + """ Calcule la valeur de la fonction cout ( - log vraisemblance) + + 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) + + ######################################################### + ##### A compléter (et supprimer l'instruction pass) ##### + ######################################################### + pass + + + return theta, J_history + +def prediction(X,theta): + """ Predit la classe de chaque élement de X + + Parametres + ---------- + X : matrice des données de dimension [N, nb_var+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 + ------- + p : matrices de dimension [N,1] indiquant la classe de chaque élement de X (soit 0, soit 1) + + """ + + ######################################################### + ##### A compléter (et supprimer l'instruction pass) ##### + ######################################################### + pass + + # return p + +def taux_classification(Ypred,Y): + """ Calcule le taux de classification (proportion d'éléments bien classés) + + Parametres + ---------- + Ypred : matrice contenant les valeurs de classe prédites de dimension [N, 1] + Y : matrice contenant les valeurs de la variable cible de dimension [N, 1] + + avec N : nombre d'éléments + + + Retour + ------- + t : taux de classification + + """ + + ######################################################### + ##### A compléter (et supprimer l'instruction pass) ##### + ######################################################### + pass + + # return t + +def affichage(X, Y): + """ Affichage en 2 dimensions des données (2 dimensions de X) et représentation de la + classe (indiquée par Y) par une couleur + + + 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] + + 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 + + +if __name__ == "__main__": + # ===================== Partie 1: Lecture et normalisation des données===================== + print("Lecture des données ...") + + X, Y, N, nb_var = lecture_donnees("notes.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)) + + # Affichage des points en 2D et représentation de leur classe réelle par une couleur + if nb_var == 2 : + plt.figure(0) + plt.title("Disposition des points en 2D - Réalité") + affichage(X,Y) + + # ===================== 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 = 10000 + + # 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(1) + 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}") + + # Evaluation du modèle + Ypred = prediction(X,theta) + + print("Taux de classification : ", taux_classification(Ypred,Y)) + + # Affichage des points en 2D et représentation de leur classe prédite par une couleur + if nb_var == 2 : + plt.figure(2) + plt.title("Disposition des points en 2D - Prédiction") + affichage(X,Ypred) + + plt.show() + + print("Regression logistique Terminée.")