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