Skip to content
Snippets Groups Projects
Commit 8572c5e5 authored by Dellandrea Emmanuel's avatar Dellandrea Emmanuel
Browse files

Create regression_lineaire-complet.py

parent 5a04c549
No related branches found
No related tags found
No related merge requests found
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.")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment