diff --git a/01-fondamentaux/01-regression_lineaire.py b/01-fondamentaux/01-regression_lineaire.py index 064af97..a4c6b3e 100644 --- a/01-fondamentaux/01-regression_lineaire.py +++ b/01-fondamentaux/01-regression_lineaire.py @@ -6,7 +6,7 @@ import matplotlib.pyplot as plt ############################################################################### # 01-regression_lineaire.py -# @title: Apprentissage par régression linéaire +# @title: Fondamentaux - Apprentissage par régression linéaire # @project: Mes scripts de ML # @lang: fr # @authors: Philippe Roy diff --git a/01-fondamentaux/02-descente_gradient.py b/01-fondamentaux/02-descente_gradient.py index 43cb094..a322dd8 100644 --- a/01-fondamentaux/02-descente_gradient.py +++ b/01-fondamentaux/02-descente_gradient.py @@ -4,7 +4,7 @@ import matplotlib.pyplot as plt ############################################################################### # 02-descente_gradient.py -# @title: Apprentissage par descente de gradient +# @title: Fondamentaux - Apprentissage par descente de gradient # @project: Mes scripts de ML # @lang: fr # @authors: Philippe Roy diff --git a/01-fondamentaux/03-descente_gradient_stochastique.py b/01-fondamentaux/03-descente_gradient_stochastique.py index 396f119..a138c5d 100644 --- a/01-fondamentaux/03-descente_gradient_stochastique.py +++ b/01-fondamentaux/03-descente_gradient_stochastique.py @@ -5,7 +5,7 @@ import matplotlib.pyplot as plt ############################################################################### # 03-descente_gradient_stochastique.py -# @title: Apprentissage par descente de gradient stochastique +# @title: Fondamentaux - Apprentissage par descente de gradient stochastique # @project: Mes scripts de ML # @lang: fr # @authors: Philippe Roy diff --git a/01-fondamentaux/04-descente_gradient_mini-lots.py b/01-fondamentaux/04-descente_gradient_mini-lots.py index 2d2da88..a8e607a 100644 --- a/01-fondamentaux/04-descente_gradient_mini-lots.py +++ b/01-fondamentaux/04-descente_gradient_mini-lots.py @@ -4,7 +4,7 @@ import matplotlib.pyplot as plt ############################################################################### # 04-descente_gradient_mini-lots.py -# @title: Apprentissage par descente de gradient par mini-lots +# @title: Fondamentaux - Apprentissage par descente de gradient par mini-lots # @project: Mes scripts de ML # @lang: fr # @authors: Philippe Roy diff --git a/01-fondamentaux/05-regression_polynomiale.py b/01-fondamentaux/05-regression_polynomiale.py index 713834a..9bdae44 100644 --- a/01-fondamentaux/05-regression_polynomiale.py +++ b/01-fondamentaux/05-regression_polynomiale.py @@ -10,7 +10,7 @@ import matplotlib.pyplot as plt ############################################################################### # 05-regression_polynomiale.py -# @title: Apprentissage par régression polynomiale +# @title: Fondamentaux - Apprentissage par régression polynomiale # @project: Mes scripts de ML # @lang: fr # @authors: Philippe Roy diff --git a/01-fondamentaux/06-regression_logistique.py b/01-fondamentaux/06-regression_logistique.py index 1530094..6db7ca4 100644 --- a/01-fondamentaux/06-regression_logistique.py +++ b/01-fondamentaux/06-regression_logistique.py @@ -8,7 +8,7 @@ from matplotlib.colors import ListedColormap ############################################################################### # 06-regression_logistique.py -# @title: Apprentissage par régression logistique +# @title: Fondamentaux - Apprentissage par régression logistique # @project: Mes scripts de ML # @lang: fr # @authors: Philippe Roy @@ -102,8 +102,9 @@ frontiere_decision_1d = x2_new[y1_proba_1d[:, 1] >= 0.5][0][0] # Analyse 2D y1_predict_2d=model_2d.predict(X_new) # Prédiction y1_proba_2d = model_2d.predict_proba(X_new) # Probabilité -left_right = np.array([2.9, 7]) -frontiere_decision_2d = -(model_2d.coef_[0][0] * left_right + model_2d.intercept_[0]) / model_2d.coef_[0][1] +model_2d_a = -model_2d.coef_[0][0] / model_2d.coef_[0][1] # coef directeur de la frontière de décision +model_2d_b = -model_2d.intercept_ / model_2d.coef_[0][1] # ordonée à l'origine de la frontière de décision +frontiere_decision_2d = model_2d_a * x1_new + model_2d_b y1_proba_2d_contour = y1_proba_2d[:, 1].reshape(x1_new_mg.shape) # Analyse multi-classes (Softmax) @@ -126,10 +127,10 @@ donnees1_ax.set_xlabel(r'$x_2$'+" - Largeur de pétale") donnees1_ax.set_ylabel(r'$y$'+" - Probabilité d'être Iris virginica") donnees1_ax.legend(loc="center left") -# Plot x1,y1 (largeur de pétale, probabilité d'être Iris virginica) +# Plot x1,x2 et y1 (longeur de pétale, largeur de pétale et probabilité d'être Iris virginica) donnees2_ax.set_title("Binomiale - Frontière de décision à 2 entrées") donnees2_ax.set(xlim=(0, 7.5), ylim=(0, 3.5)) -donnees2_ax.plot(left_right, frontiere_decision_2d, "k--") +donnees2_ax.plot(x1_new, frontiere_decision_2d, "k--") donnees2_ax.set_xlabel(r'$x_1$'+" - Longueur de pétale") donnees2_ax.set_ylabel(r'$x_2$'+" - Largeur de pétale") donnees2_ax.legend(loc="upper left") @@ -137,7 +138,7 @@ donnees2_ax.legend(loc="upper left") donnees2_contour = donnees2_ax.contour(x1_new_mg, x2_new_mg, y1_proba_2d_contour, cmap=plt.cm.brg) # Contour pour la classe Iris versicolor (type 1) donnees2_ax.clabel(donnees2_contour, inline=1, fontsize=10) -# Plot x1,x2 et y1 (largeur de pétale, longeur de pétale et type de Iris (format de la marque)) +# Plot x1,x2 et y (longeur de pétale, largeur de pétale et type de Iris (format de la marque)) donnees3_ax.set_title("Multinomiale (régression Softmax)") donnees3_ax.set(xlim=(0, 7.5), ylim=(0, 3.5)) donnees3_ax.set_xlabel(r'$x_1$'+" - Longueur de pétale") diff --git a/02-intro_rna/01-perceptron.py b/02-intro_rna/01-perceptron.py new file mode 100644 index 0000000..44bf94b --- /dev/null +++ b/02-intro_rna/01-perceptron.py @@ -0,0 +1,169 @@ +import time +import numpy as np +import sklearn +from sklearn.linear_model import Perceptron +from sklearn import datasets +import matplotlib.pyplot as plt +from matplotlib.colors import ListedColormap + +############################################################################### +# 01-perceptron.py +# @title: Introduction aux réseaux de neurones - Perceptron +# @project: Mes scripts de ML +# @lang: frg +# @authors: Philippe Roy +# @copyright: Copyright (C) 2023 Philippe Roy +# @license: GNU GPL +############################################################################### + +### +# Commandes NumPy : +# - np.array : créer un tableau à partir d'une liste de listes +# - np.c_ : concatène les colonnes des tableaux +# - np.ones : créer un tableau de 1 +# - np.linalg.inv : inversion de matrice +# - .T : transposé de matrice +# - .dot : produit de matrice +### + +### +# Commandes Scikit-Learn : +# - sklearn.linear_model.LinearRegression() : créer un modèle de régression linéaire (méthode des moindres carrés) +# - .fit : entrainement du modèle +# - .predict : prédiction du modèle +### + +############################################################################### +# Initialisation +############################################################################### + +# Init du temps +t_debut = time.time() + +# Init des plots +fig = plt.figure(figsize=(15, 5)) +fig.suptitle("Classificateur par perceptron") +donnees_ax = fig.add_subplot(2,3,(1,4)) # Observations : x1 et cibles : y1 +# f_activ_ax = fig.add_subplot(2,3,2) +# df_activ_ax = fig.add_subplot(2,3,5) + +############################################################################### +# Observations +############################################################################### + +# Observations d'apprentisage +iris = sklearn.datasets.load_iris() # Jeu de données Iris +x1 = iris['data'][:, 2].reshape(-1, 1) # Longueur de pétale +x2 = iris['data'][:, 3].reshape(-1, 1) # Largeur de pétale +X = iris['data'][:, (2, 3)] # Matrice de données +y1 = (iris["target"] == 2).astype(np.int32) # Si Iris virginica -> 1 sinon -> 0 +y = (iris["target"]) # Type d'Iris + +# Plot x1,x2 et y1 (longeur de pétale, largeur de pétale et probabilité d'être Iris virginica (format de la marque)) +donnees_ax.plot(x1[y1==1], x2[y1==1], "g^" , label="Iris virginica") +donnees_ax.plot(x1[y1==0], x2[y1==0], "rs", label="Iris non-virginica") + +# Nouvelles observations +x1_new=np.linspace(0, 8, 1000).reshape(-1, 1) +x2_new=np.linspace(0, 3.5, 1000).reshape(-1, 1) +x1_new_mg, x2_new_mg = np.meshgrid(x1_new, x2_new) +X_new = np.c_[x1_new_mg.ravel(), x2_new_mg.ravel()] + +############################################################################### +# Phase d'apprentissage +############################################################################### + +# model= sklearn.linear_model.Perceptron(max_iter=1000, tol=1e-3, random_state=42) +model = sklearn.linear_model.Perceptron() # Modèle régression logistique +model.fit(X, y1) # Entrainement + +############################################################################### +# Phase d'inférence +############################################################################### + +y_predict=model.predict(X_new) # Prédiction + +# Frontière de décision +model_a = -model.coef_[0][0] / model.coef_[0][1] +model_b = -model.intercept_ / model.coef_[0][1] +donnees_ax.plot(x1_new, model_a * x1_new + model_b, "k--") + +# Carte +y_predict_map = y_predict.reshape(x1_new_mg.shape) +custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0']) +donnees_ax.contourf(x1_new_mg, x2_new_mg, y_predict_map, cmap=custom_cmap) + +############################################################################### +# Résultats +############################################################################### + +# Plot x1,x2 et y1 (longeur de pétale, largeur de pétale et probabilité d'être Iris virginica) +donnees_ax.set_title("Perceptron") +donnees_ax.set(xlim=(0, 7.5), ylim=(0, 3.5)) +donnees_ax.set_xlabel(r'$x_1$'+" - Longueur de pétale") +donnees_ax.set_ylabel(r'$x_2$'+" - Largeur de pétale") +donnees_ax.legend(loc="upper left") + +############################################################################### +# Fonctions d'activation +############################################################################### + +def sigmoid(_x): + return 1 / (1 + np.exp(-_x)) + +def echelon(_x): # Heaviside + return (_x >= 0).astype(_x.dtype) + +def relu(_x): + return np.maximum(0, _x) + +def derivation(f, _x, eps=0.000001): + return (f(_x + eps) - f(_x))/eps + +# Fonctions d'activation +f_activ_ax = fig.add_subplot(2,3,2) +f_activ_ax.set_title("Fonctions d'activation") +f_activ_x = np.linspace(-5, 5, 200) +f_activ_ax.set(xlim=(-5,5), ylim=(0, 1.25)) +f_activ_ax.plot(f_activ_x, sigmoid(f_activ_x), "g-", label="Sigmoïde") +f_activ_ax.plot(f_activ_x, echelon(f_activ_x), "b-", label="Échelon") +# f_activ_ax.plot(f_activ_x, relu(f_activ_x), "m-", label="ReLU") +f_activ_ax.legend() + +# Dérivée +df_activ_ax = fig.add_subplot(2,3,5) +df_activ_ax.plot(f_activ_x, derivation(sigmoid, f_activ_x), "g-", label="f'(Sigmoïde)") +df_activ_ax.plot(f_activ_x, derivation(echelon, f_activ_x), "b-", label="f'(Échelon)") +# df_activ_ax.plot(f_activ_x, derivation(relu, f_activ_x), "m-", label="f'(ReLU)") +df_activ_ax.legend() + +############################################################################### +# Perceptron multi-couches (pmc) +############################################################################### + +def pmc_xor(x1, x2, activation=echelon): + return activation(-activation(x1 + x2 - 1.5) + activation(x1 + x2 - 0.5) - 0.5) + +x1_mg, x2_mg = np.meshgrid(np.linspace(-0.2, 1.2, 100), np.linspace(-0.2, 1.2, 100)) + +z1_pmc_xor = pmc_xor(x1_mg, x2_mg, activation=echelon) +z2_pmc_xor = pmc_xor(x1_mg, x2_mg, activation=sigmoid) + +pmc_xor_echelon_ax = fig.add_subplot(2,3,3) +pmc_xor_echelon_ax.set_title("Xor (perceptron multi-couches) - Activation par Échelon") +pmc_xor_echelon_ax.contourf(x1_mg, x2_mg, z1_pmc_xor) +pmc_xor_echelon_ax.plot([0, 1], [0, 1], "rs", markersize=15) +pmc_xor_echelon_ax.plot([0, 1], [1, 0], "g^", markersize=15) +pmc_xor_echelon_ax.grid(True) + +pmc_xor_sigmoid_ax = fig.add_subplot(2,3,6) +# pmc_xor_sigmoid_ax.set_title("Xor (perceptron multi-couches) - Activation par Sigmoïde)") +pmc_xor_sigmoid_ax.contourf(x1_mg, x2_mg, z2_pmc_xor) +pmc_xor_sigmoid_ax.plot([0, 1], [0, 1], "rs", markersize=15) +pmc_xor_sigmoid_ax.plot([0, 1], [1, 0], "g^", markersize=15) +pmc_xor_sigmoid_ax.grid(True) +pmc_xor_sigmoid_ax.set_xlabel("Xor (perceptron multi-couches) - Activation par Sigmoïde", fontsize=12) + + +plt.show() + diff --git a/02-intro_rna/README.md b/02-intro_rna/README.md index 66ce373..a52cc52 100644 --- a/02-intro_rna/README.md +++ b/02-intro_rna/README.md @@ -1,29 +1,5 @@ # Mes scripts de ML - Introduction aux réseaux de neurones - - - - - - - - - - - - - - - - - - - - - - - - - - +### Perceptron +![capture d'écran](img/01-perceptron.png) diff --git a/02-intro_rna/img/01-perceptron.png b/02-intro_rna/img/01-perceptron.png new file mode 100644 index 0000000..2da9811 Binary files /dev/null and b/02-intro_rna/img/01-perceptron.png differ