From 8572c5e59c06d608139363e537a3ebae48cd51b0 Mon Sep 17 00:00:00 2001 From: Emmanuel Dellandrea <emmanuel.dellandrea@ec-lyon.fr> Date: Thu, 9 Jan 2025 07:23:23 +0100 Subject: [PATCH] Create regression_lineaire-complet.py --- TD/TD2/regression_lineaire-complet.py | 185 ++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 TD/TD2/regression_lineaire-complet.py diff --git a/TD/TD2/regression_lineaire-complet.py b/TD/TD2/regression_lineaire-complet.py new file mode 100644 index 0000000..30e0dd1 --- /dev/null +++ b/TD/TD2/regression_lineaire-complet.py @@ -0,0 +1,185 @@ +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] + + avec N : nombre d'éléments et nb_var : nombre de variables prédictives + + """ + + data = np.loadtxt(nom_fichier, delimiter=delimiteur) + nb_var = data.shape[1] - 1 + N = data.shape[0] + + X = data[:, :-1] + Y = data[:, -1].reshape(N,1) + + 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] + + """ + + mu = np.mean(X, 0) + sigma = np.std(X, 0) + X_norm = (X - mu) / sigma + + 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é) + + """ + + N = X.shape[0] + + cout = np.sum((X.dot(theta.T) - Y) ** 2) / (2 * N) + + 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): + + error = X.dot(theta.T) - Y + theta -= (alpha/N)*np.sum(X*error, 0) + + J_history[i] = calcule_cout(X, Y, theta) + + + 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 + + """ + plt.figure(0) + plt.scatter(X[:, 1], Y, c='r', marker="x") + line1, = plt.plot(X[:, 1], X.dot(theta.T)) + plt.title("Régression linaire") + + 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.") -- GitLab