From d33ecc31f320e3121bc6d387caf6c215a4addc10 Mon Sep 17 00:00:00 2001
From: "thibault.capt" <thibault.capt@etu.hesge.ch>
Date: Tue, 14 Nov 2023 21:28:04 +0100
Subject: [PATCH] tp3 perceptron couche cachee

---
 perceptron-tp3.py | 75 ++++++++++++++++++++++-------------------------
 1 file changed, 35 insertions(+), 40 deletions(-)

diff --git a/perceptron-tp3.py b/perceptron-tp3.py
index 1a82b67..e8d2233 100644
--- a/perceptron-tp3.py
+++ b/perceptron-tp3.py
@@ -1,66 +1,61 @@
-# Author : Capt Thibault , Souza Luz Juliano
-# Date : 31.10.2023
-# Project : Perceptron
-# Description : Ce fichier représente notre travail pour le tp du perceptron
 import numpy as np
 import pandas as pd
 from matplotlib import pyplot as plt
 
-
-def upd_weights(wi_old, learning, t, y, xi):
-    """
-    Mettre à jour les poids
-    :param wi_old: Les anciens poids
-    :param learning: Le taux d'apprentissage ( qui contrôle la vitesse de convergence)
-    :param t: La valeur cible
-    :param y: La sortie actuelle du modèle pour l'exemple donné
-    :param xi: Les caractéristiques de l'exemple d'apprentissage
-    :return: Les poids mis à jour
-    """
+def upd_weights_hidden(wi_old, learning, t, y, xi):
     return wi_old + learning * (t - y) * y * (1 - y) * xi
 
+def upd_weights_output(wi_old, learning, delta, y):
+    return wi_old + learning * delta * y
 
 def sigmoide(x):
-    """
-    Calcule la fonction sigmoïde (fonction d'activation) pour une valeur x
-    :param x: La valeur d'entrée.
-    :return: La sigmoide en fonction de x.
-    """
     return 1 / (1 + np.exp(-x))
 
+def predict(poids_input_hidden, poids_hidden_output, input_data):
+    hidden_input = np.dot(poids_input_hidden, input_data)
+    hidden_output = sigmoide(hidden_input)
+    output = sigmoide(np.dot(poids_hidden_output, np.insert(hidden_output, 0, 1)))
+    return output, hidden_output
 
 if __name__ == '__main__':
     dataset = pd.read_csv("Data/student-data-train.csv", header=0)
-    # Normalisation des colonnes
     dataset['norm_grade_1'] = (dataset['grade_1'] - dataset['grade_1'].mean()) / dataset['grade_1'].std()
     dataset['norm_grade_2'] = (dataset['grade_2'] - dataset['grade_2'].mean()) / dataset['grade_2'].std()
 
-    # Extraction des données
     X = dataset[['norm_grade_1', 'norm_grade_2']].values
     y = dataset.iloc[:, 0].values
     num_features = X.shape[1]
-    # ------------------- Paramètres ------------------
-    learning_rate = 1e-2  # Taux d'apprentissage
-    max_iterations = 5
-    # Initialisation aléatoire des poids (+1 pour le biais)
-    poids = [np.random.uniform(-0.5, 0.5) for _ in range(num_features + 1)]
-    print("Poids initiaux:", poids)
-    # Boucle d'apprentissage
+
+    learning_rate = 1e-2
+    max_iterations = 2000
+
+    # Initialize weights for input to hidden layer and hidden to output layer
+    weights_input_hidden = np.random.rand(num_features + 1, num_hidden) - 0.5
+    weights_hidden_output = np.random.rand(num_hidden + 1) - 0.5
+
+    print("Weights input to hidden:", weights_input_hidden)
+    print("Weights hidden to output:", weights_hidden_output)
+
     for iteration in range(max_iterations):
         total_error = 0
+
         for i in range(len(X)):
-            # Ajout du biais (X0 = 1)
             input_data = np.insert(X[i], 0, 1)
-            cible = y[i]
-            # Calcul de la sortie du réseau
-            sortie = sigmoide(np.dot(poids, input_data))
-            # Mise à jour des poids
-            poids = upd_weights(poids, learning_rate, cible, sortie, input_data)
-            # Calcul de l'erreur quadratique
-            total_error += (cible - sortie) ** 2
-
-        # Affichage de l'erreur à chaque itération (à enlever pour de meilleures performances)
-        print(f"Iteration {iteration + 1}: Erreur = {total_error}")
+            target = y[i]
+
+            # Forward pass
+            hidden_output, output = predict(weights_input_hidden, weights_hidden_output, input_data)
+
+            # Backpropagation
+            delta_output = (target - output) * output * (1 - output)
+            weights_hidden_output = upd_weights_output(weights_hidden_output, learning_rate, delta_output, np.insert(hidden_output, 0, 1))
+
+            delta_hidden = hidden_output * (1 - hidden_output) * delta_output * weights_hidden_output[1:]
+            weights_input_hidden = upd_weights_hidden(weights_input_hidden, learning_rate, delta_hidden, input_data)
+
+            total_error += (target - output) ** 2 / 2
+
+        print(f"Iteration {iteration + 1}: Error = {total_error}")
 
     # Calcul du taux de classification correcte
     correct_classifications = 0
-- 
GitLab