Select Git revision
Forked from
Vuillemot Romain / INF-TC1
Source project has a limited visibility.
regression_lineaire.py 5.81 KiB
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.")