La Table de matière 1. Introduction .............................................................................................................................................. 2 1.1 Présentation des cinq volets de l'IA ................................................................................................ 2 2. Réseau de neurones.................................................................................................................................. 3 2.1 Projet concret.................................................................................................................................. 3 2.2 explications du résultat ................................................................................................................... 8 2.3 défaillance majeure des réseaux de neurones ............................................................................... 9 3. Logique floue........................................................................................................................................... 11 3.3 Projet concret................................................................................................................................ 11 3.3.1 Fuzzification ............................................................................................................................... 11 3.3.2 Rule Evaluation .......................................................................................................................... 14 3.3.3 Aggregation & Defuzzification ................................................................................................... 18 3.3.4 Creating the Tipping Controller ................................................................................................. 20 3.3.5 Fuzzy Rules ................................................................................................................................. 22 3.3.6 Résumons ce qu’on a fait ........................................................................................................... 24 4. Raisonnement à partir de cas ................................................................................................................. 24 4.3 Projet concret................................................................................................................................ 24 4.3.1 Trouver les valeurs manquantes ................................................................................................ 25 5. Systèmes multi-agents ............................................................................................................................ 29 5.4 Projet concret................................................................................................................................ 29 6. Traitement du langage naturel ............................................................................................................... 29 6.3 Projet concret................................................................................................................................ 29 8. Conclusion ............................................................................................................................................... 29 8. Références .............................................................................................................................................. 30 1. Introduction 1.1 Présentation des cinq volets de l'IA Dans ce rapport, nous nous concentrerons sur l'étude de cinq volets clés de l'intelligence artificielle, chacun offrant une approche unique pour résoudre des problèmes complexes et offrant des perspectives intéressantes pour l'avenir de l'IA. Voici une brève présentation de ces cinq volets : Réseaux de neurones : Inspirés par le fonctionnement du cerveau humain, les réseaux de neurones sont des modèles puissants d'IA. Ils sont utilisés pour la reconnaissance de motifs, la classification, la prédiction et bien d'autres tâches. Nous explorerons les concepts fondamentaux des réseaux de neurones, tels que les neurones artificiels, les couches de neurones et les fonctions d'activation. Un projet concret sera présenté, mettant en œuvre un réseau de neurones pour la classification d'images. Logique floue : Contrairement à la logique traditionnelle qui se base sur des valeurs binaires (vrai ou faux), la logique floue permet de prendre en compte l'incertitude et les nuances dans le raisonnement. Nous discuterons des principes fondamentaux de la logique floue et de son utilisation dans le processus de prise de décision. Un projet concret sera présenté, mettant en œuvre un système de contrôle basé sur la logique floue. Raisonnement à partir de cas : Cette approche consiste à résoudre de nouveaux problèmes en s'appuyant sur des expériences passées similaires. Nous explorerons le fonctionnement du raisonnement à partir de cas, son utilisation dans des domaines tels que la médecine et l'ingénierie, et nous présenterons un projet concret de création d'un système de recommandation basé sur le raisonnement à partir de cas. Systèmes multi-agents : Les systèmes multi-agents mettent l'accent sur la collaboration et la communication entre plusieurs entités autonomes pour atteindre des objectifs communs. Nous discuterons de l'organisation des agents, de leurs interactions et de leurs avantages dans des domaines tels que la logistique et la robotique. Un projet concret sera présenté, illustrant le développement d'un système multi-agents pour la planification de trajets. Traitement du langage naturel : Le traitement du langage naturel vise à permettre aux machines de comprendre, d'interpréter et de générer du langage humain. Cette approche est essentielle pour les chatbots, les assistants virtuels, la traduction automatique, etc. Nous explorerons les concepts fondamentaux du traitement du langage naturel et présenterons un projet concret de création d'un système de traduction automatique basé sur cette approche. 2. Réseau de neurones 2.1 Projet concret Le principe du projet est d'utiliser les réseaux de neurones convolutionnels (CNN) pour entraîner une machine à distinguer entre les images de CIN et l'acte de naissance. Les CNN sont particulièrement adaptés à la tâche de classification d'images en raison de leur capacité à extraire des caractéristiques visuelles à différents niveaux d'abstraction. On Charge et affiche les deux images : une image de Pikachu et une image de Rondoudou. Les images sont obtenues à partir de liens URL spécifiques. Le code utilise les bibliothèques OpenCV, NumPy, Requests et Matplotlib pour télécharger et afficher les images. Résultats obtenus 2.3.2 prétraitements On effectue plusieurs étapes de prétraitement sur l'image de Pikachu chargée précédemment : La fonction cv2.resize est utilisée pour redimensionner l'image de Pikachu à une taille de 40x40 pixels avec une interpolation cubique. Cela permet d'ajuster la taille de l'image pour correspondre aux exigences du modèle. La fonction cv2.cvtColor est utilisée pour convertir l'image redimensionnée en niveaux de gris. Cela réduit la dimension de l'image de 3D à 2D, ce qui simplifie le traitement ultérieur. La fonction cv2.threshold est utilisée pour appliquer un seuillage binaire à l'image en niveaux de gris. Tous les pixels ayant une valeur supérieure à 127 sont définis sur 255 (blanc) et les autres pixels sont définis sur 0 (noir). Les boucles for sont utilisées pour afficher les valeurs de chaque pixel de l'image après l'application du seuillage binaire. Enfin, l'image seuillée est affichée à l'aide de la fonction plt.imshow de Matplotlib, en convertissant l'image du format de couleur BGR à RGB. Ce code crée et entraîne un modèle de réseau de neurones convolutionnels (CNN) pour la classification d'images. 1. `num_classes = 2` définit le nombre de classes dans le problème de classification. 2. Le modèle est créé en utilisant la classe `Sequential` de Keras. Les différentes couches du modèle sont ajoutées séquentiellement : `layers.experimental.preprocessing.Rescaling(1./255)` normalise les valeurs des pixels des images entre 0 et 1. `layers.Conv2D` crée une couche de convolution avec le nombre spécifié de filtres, la taille du noyau et la fonction d'activation relu. `layers.MaxPooling2D` ajoute une couche de pooling pour réduire la dimensionnalité des caractéristiques. `layers.Flatten` aplatit les caractéristiques en un vecteur. `layers.Dense` ajoute des couches denses avec la fonction d'activation relu. `layers.Dense` ajoute la couche de sortie avec la fonction d'activation softmax pour la classification multiclasse. 3. Le modèle est compilé avec l'optimiseur 'adam', la fonction de perte `SparseCategoricalCrossentropy` et la métrique d'exactitude ('accuracy'). 4. Un rappel `TensorBoard` est configuré pour enregistrer les métriques et les visualisations pendant l'entraînement. Les journaux seront enregistrés dans le répertoire "logs". 5. Le modèle est entraîné en utilisant la méthode `fit()` avec les ensembles de données d'entraînement et de validation, le nombre d'époques et le rappel `TensorBoard`. Ainsi, ce code crée un modèle CNN, le compile et l'entraîne sur les ensembles de données d'entraînement et de validation. 1. `from google.colab import files`: Cette ligne importe la bibliothèque `files` de Google Colab, qui permet de télécharger des fichiers depuis votre ordinateur vers l'environnement de Colab. 2. `file_to_predict = files.upload()`: Cette ligne permet de télécharger un fichier depuis votre ordinateur vers l'environnement de Colab. Elle ouvre une fenêtre de sélection de fichier où vous pouvez choisir le fichier que vous souhaitez prédire. 3. `for file_ in file_to_predict:`: Cette boucle parcourt tous les fichiers téléchargés. 4. `image_to_predict = cv2.imread(file_,cv2.IMREAD_COLOR)`: Cette ligne utilise la bibliothèque OpenCV (`cv2`) pour lire l'image téléchargée en couleur. 5. `plt.imshow(cv2.cvtColor(image_to_predict, cv2.COLOR_BGR2RGB))`: Cette ligne affiche l'image téléchargée en utilisant la fonction `imshow` de Matplotlib. La conversion `cv2.COLOR_BGR2RGB` est effectuée pour s'assurer que les couleurs de l'image sont affichées correctement. 6. `img_to_predict = np.expand_dims(cv2.resize(image_to_predict,(200,200)), axis=0)`: Cette ligne redimensionne l'image téléchargée à une taille de 200x200 pixels à l'aide de la fonction `cv2.resize`. Ensuite, la fonction `np.expand_dims` est utilisée pour ajouter une dimension supplémentaire à l'image afin de correspondre à la forme d'entrée attendue par le modèle. 7. `res = model.predict_classes(img_to_predict)`: Cette ligne utilise le modèle entraîné pour prédire la classe de l'image redimensionnée. La méthode `predict_classes` retourne la classe prédite. 8. `print(model.predict_classes(img_to_predict))`: Cette ligne affiche la classe prédite par le modèle. 9. `print(model.predict(img_to_predict))`: Cette ligne affiche les scores de prédiction pour chaque classe. Les scores sont obtenus à l'aide de la méthode `predict` du modèle. 10. Les instructions conditionnelles suivantes utilisent la classe prédite pour afficher l'image correspondante (Pikachu ou Rondoudou) à l'aide de la fonction `imshow`. Un message est également affiché pour indiquer la classe prédite. 2.2 explications du résultat En utilisant un ensemble de 150 photos de cartes d'identité nationale (CIN) et 150 photos d'actes de naissance, nous avons entraîné un modèle de réseau de neurones convolutif (CNN) afin de développer une compétence permettant de distinguer ces deux types de documents. Le CNN a été conçu pour extraire des caractéristiques spécifiques à partir des images et les utiliser pour prendre des décisions de classification. En exposant le modèle à un grand nombre d'exemples, il a appris à identifier les différences visuelles entre les CIN et les actes de naissance, et il est désormais capable de prédire avec une certaine précision à quelle catégorie appartient une nouvelle image donnée. Cette approche offre une solution automatisée et efficace pour la distinction entre les CIN et les actes de naissance, ce qui peut être utile dans divers contextes, tels que la vérification d'identité et la gestion des documents officiels. 2.3 défaillance majeure des réseaux de neurones Le code fourni est un exemple pratique de surapprentissage utilisant la régression polynomiale. Il génère un ensemble de données synthétiques avec une relation non linéaire, divise les données en trois ensembles avec différents degrés de polynômes (1, 4 et 15), et effectue la régression polynomiale suivie d'une régression linéaire. Le code utilise également la validation croisée pour évaluer les performances de chaque modèle, en enregistrant les scores de l'erreur quadratique moyenne (MSE). Les résultats sont ensuite tracés, montrant les prédictions du modèle, la véritable fonction et les échantillons de données. Le but de cet exemple est de mettre en évidence le surapprentissage, où les modèles de degré plus élevé (15) s'adaptent trop étroitement aux données d'entraînement, mais ne généralisent pas bien aux nouvelles données. En exécutant le code, vous pourrez visualiser les résultats graphiques et observer l'effet du surapprentissage. Assurez-vous d'avoir les bibliothèques nécessaires installées (numpy, matplotlib, sklearn) pour exécuter le code avec succès. 3. Logique floue 3.3 Projet concret 3.3.1 Fuzzification On commence par importer les bibliothèques nécessaires, notamment numpy pour les opérations mathématiques, skfuzzy pour la logique floue et matplotlib.pyplot pour la visualisation des résultats. Ensuite, des variables d'univers sont générées pour les entrées et les sorties du système de logique floue. Dans cet exemple, les variables x_MAP, x_HUO et x_IFR représentent les valeurs possibles des variables "MAP" (Mesure de l'activité du radar météorologique), "HUO" (Humidité de l'air) et "IFR" (Indice de vol aux instruments), respectivement. Ensuite, des fonctions d'appartenance floues sont définies pour chaque variable à l'aide de la fonction trapmf de skfuzzy. Dans cet exemple, des fonctions d'appartenance trapézoïdales sont utilisées, ce qui permet de représenter différentes catégories linguistiques comme "low", "normal", "high", etc. pour chaque variable. Une fois que les fonctions d'appartenance sont définies, on peut les utiliser dans des règles d'inférence floue pour prendre des décisions ou effectuer des opérations de raisonnement flou. Ce code est utilisé pour visualiser les univers et les fonctions d'appartenance floues définies précédemment. Le code crée une figure avec trois sous-graphiques (ax0, ax1, ax2) correspondant aux variables "Mean Arterial Blood Pressure" (Pression artérielle moyenne), "Hourly Urine Output" (Production d'urine horaire) et "Intravenous Fluid Rate" (Débit de fluide intraveineux), respectivement. L'ensemble du code permet de visualiser les univers et les fonctions d'appartenance floues, ce qui facilite la compréhension des relations entre les variables et les catégories linguistiques associées. 3.3.2 Rule Evaluation Ce code calcule les degrés d'appartenance flous pour les valeurs spécifiques de la pression artérielle moyenne (Mean Arterial Blood Pressure - MAP) et du débit urinaire horaire (Hourly Urine Output - HUO). Les lignes suivantes extraient les degrés d'appartenance pour une valeur spécifique : `MAP_lo = fuzz.interp_membership(x_MAP, low_MAP, 90.0)`: Cela calcule le degré d'appartenance de 90.0 à la fonction d'appartenance floue "LOW" de la pression artérielle moyenne (MAP). `MAP_norm = fuzz.interp_membership(x_MAP, normal_MAP, 90.0)`: Cela calcule le degré d'appartenance de 90.0 à la fonction d'appartenance floue "NORMAL" de la pression artérielle moyenne (MAP). `MAP_hi = fuzz.interp_membership(x_MAP, high_MAP, 90.0)`: Cela calcule le degré d'appartenance de 90.0 à la fonction d'appartenance floue "HIGH" de la pression artérielle moyenne (MAP). De même, les lignes suivantes calculent les degrés d'appartenance pour le débit urinaire horaire (HUO) pour une valeur de 110.0. Ensuite, les degrés d'appartenance sont affichés à l'aide de la fonction `print()`. Les degrés d'appartenance donnent une indication de l'intensité de l'appartenance d'une valeur donnée à chaque ensemble flou ("LOW", "NORMAL" et "HIGH") pour les variables MAP et HUO respectivement. Ce code applique des règles floues pour déterminer l'activation des ensembles flous d'IFR (Intravenous Fluid Rate) en fonction des valeurs d'appartenance floue de MAP (Mean Arterial Blood Pressure) et HUO (Hourly Urine Output). Les variables `active_rule1` à `active_rule9` représentent les parties actives des règles floues individuelles. Par exemple, `active_rule1` correspond à la règle 1, qui est "si MAP est faible et HUO est faible, alors IFR est très élevé". Enfin, la variable `IFR0` est initialisée avec des valeurs nulles pour représenter l'ensemble flou IFR vide. L'application de ces règles permet de déterminer l'activation des ensembles flous d'IFR en fonction des conditions floues définies par les ensembles flous de MAP et HUO. Ce code permet de visualiser les ensembles flous d'IFR (Intravenous Fluid Rate) résultants après l'application des règles floues. Les ensembles flous sont représentés par des courbes de membres flous et des zones de remplissage colorées pour indiquer l'activation des ensembles flous correspondants. Les trois sous-graphiques représentent les ensembles flous d'IFR pour les différentes combinaisons de règles floues activées. Ces visualisations permettent de comprendre l'activation des ensembles flous d'IFR en fonction des conditions floues définies par les ensembles flous de MAP et HUO, et de faciliter l'interprétation des résultats du système de logique floue. 3.3.3 Aggregation & Defuzzification Dans cette partie du code, nous agrégeons les fonctions d'appartenance de sortie en une seule fonction agrégée. La fonction agrégée est obtenue en prenant le maximum des degrés d'appartenance des différentes fonctions d'appartenance de sortie. Dans cette partie du code, nous visualisons le résultat agrégé et le résultat défuzzifié. Le graphique affiche les fonctions d'appartenance de sortie pour les catégories "very high", "high", "moderate", "maintain" et "low" sous forme de lignes en pointillés. La fonction d'appartenance agrégée est remplie en rose. Ensuite, une ligne verticale est tracée à la position du résultat défuzzifié (`output_IFR`). La longueur de cette ligne est déterminée par le degré d'appartenance du résultat défuzzifié à la fonction d'appartenance agrégée (`output_IFR_activation`). 3.3.4 Creating the Tipping Controller Dans cette partie du code, nous créons de nouveaux objets `Antecedent` et `Consequent` pour les variables d'univers et les fonctions d'appartenance. Pour l'antécédent "Mean Arterial Pressure" (MAP), nous utilisons la méthode `.automf()` pour générer automatiquement trois fonctions d'appartenance : "poor", "average" et "good". Ensuite, nous définissons une fonction d'appartenance personnalisée pour chaque étiquette en utilisant la méthode `.trapmf()`. De même, pour l'antécédent "Hourly Urine Output" (HUO), nous utilisons `.automf()` pour générer trois fonctions d'appartenance, puis nous définissons des fonctions d'appartenance personnalisées pour chaque étiquette. Pour le conséquent "Intravenous Fluid Rate" (IFR), nous définissons cinq fonctions d'appartenance personnalisées : "low", "mantain", "moderate", "high" et "veryhigh". Chaque fonction est définie en utilisant `.trapmf()` avec des valeurs appropriées pour décrire la forme trapézoïdale. 3.3.5 Fuzzy Rules Dans cette partie du code, nous créons des règles de contrôle pour relier les antécédents aux conséquents. Les règles sont définies en utilisant la classe `Rule` du module `ctrl`. Chaque règle est créée en spécifiant les antécédents et le conséquent correspondant à l'aide de leurs fonctions d'appartenance respectives. Voici les règles définies : - Rule 1 : Si MAP est "poor" et HUO est "poor", alors IFR est "veryhigh". - Rule 2 : Si MAP est "poor" et HUO est "average", alors IFR est "high". - Rule 3 : Si MAP est "poor" et HUO est "good", alors IFR est "moderate". - Rule 4 : Si MAP est "average" et HUO est "poor", alors IFR est "moderate". - Rule 5 : Si MAP est "average" et HUO est "average", alors IFR est "mantain". - Rule 6 : Si MAP est "average" et HUO est "good", alors IFR est "mantain". - Rule 7 : Si MAP est "good" et HUO est "poor", alors IFR est "low". - Rule 8 : Si MAP est "good" et HUO est "average", alors IFR est "low". - Rule 9 : Si MAP est "good" et HUO est "good", alors IFR est "low". Chaque règle est ensuite visualisée à l'aide de la méthode `.view()` pour afficher les graphiques correspondants. 3.3.6 Résumons ce qu’on a fait En conclusion, ce projet a utilisé la logique floue pour modéliser et contrôler le taux d'administration de liquide intraveineux en fonction de la pression artérielle moyenne et du débit urinaire horaire. Nous avons défini des univers de discours, des fonctions d'appartenance floues et des règles linguistiques pour représenter la relation entre les variables d'entrée et la sortie. En agrégeant les règles et en effectuant des simulations, nous avons pu recommander un niveau d'IFR approprié en fonction des valeurs d'entrée données. La logique floue offre une approche flexible pour prendre des décisions basées sur des variables incertaines, permettant ainsi une régulation efficace du taux d'administration de liquide intraveineux dans un contexte médical. 4. Raisonnement à partir de cas 4.3 Projet concret Le projet utilise le principe de Raisonnement à partir de cas (CBR) pour résoudre des problèmes en se basant sur des solutions de problèmes similaires rencontrés par le passé. En particulier, il se concentre sur la recherche des valeurs manquantes dans un ensemble de données en utilisant des caractéristiques similaires présentes dans d'autres variables. Pour cela, on utilise la distance euclidienne pour trouver les variables similaires et prédire les caractéristiques manquantes. Le projet comprend deux scripts Python. Le premier script permet de trouver les valeurs manquantes dans un ensemble de données, tandis que le deuxième script calcule les caractéristiques (colonnes) qui influencent ou définissent le plus les valeurs manquantes. Les données utilisées dans ce projet sont issues des statistiques collectées auprès des utilisateurs d'une entreprise de télécommunications. En utilisant ces données, il est possible de former un modèle et de vérifier l'exactitude des résultats obtenus. Ce projet permet donc de résoudre le problème des valeurs manquantes dans un ensemble de données en se basant sur des caractéristiques similaires, offrant ainsi une approche pratique pour compléter les données manquantes dans un contexte de télécommunications. 4.3.1 Trouver les valeurs manquantes Le code fourni définit la classe `ScriptSetting`, qui contient les paramètres de configuration du script. Ces paramètres sont utilisés pour charger un fichier CSV contenant des données. La fonction `load_data_frame_from_csv` charge les données à partir du fichier CSV spécifié en utilisant les paramètres de configuration de la classe `ScriptSetting`. Elle renvoie un objet DataFrame contenant les données chargées à partir du fichier CSV. De plus, la fonction affiche le nombre de lignes et de colonnes dans le DataFrame chargé. En résumé, ce code permet de charger les données à partir d'un fichier CSV en utilisant les paramètres de configuration spécifiés dans la classe `ScriptSetting`. Le code fournit trois fonctions utilitaires pour manipuler un DataFrame : 1. `get_missing_columns` : Cette fonction renvoie une liste des noms des colonnes qui contiennent des valeurs manquantes dans le DataFrame donné. 2. `subset_columns` : Cette fonction renvoie une liste des noms des colonnes qui ne font pas partie d'une liste spécifiée de colonnes. Elle permet de sélectionner uniquement certaines colonnes à partir du DataFrame. 3. `columns_to_number` : Cette fonction convertit les colonnes de type chaîne de caractères du DataFrame en colonnes numériques en ajoutant des catégories numériques. Elle modifie le DataFrame en place. En résumé, le code fournit des fonctionnalités pour identifier les colonnes avec des valeurs manquantes, sélectionner des colonnes spécifiques et convertir les colonnes en types numériques. La fonction `normalize_data` permet de normaliser les colonnes numériques du DataFrame en utilisant la méthode de la mise à l'échelle Z (Z-scaling). Les colonnes qui contiennent des valeurs manquantes ou qui sont spécifiées comme étant en dehors de la prédiction sont exclues de la normalisation. La normalisation est effectuée en soustrayant la moyenne de chaque colonne et en divisant par l'écart-type. La fonction `get_predict_columns` renvoie une liste des noms de colonnes à partir desquelles nous allons calculer la distance Euclidienne. Cette liste est obtenue en excluant la colonne manquante spécifiée et les colonnes spécifiées comme étant en dehors de la prédiction. La fonction `euclid_distance` permet de calculer la distance euclidienne entre les lignes qui contiennent des valeurs manquantes pour une colonne spécifiée (`missing_column`) et les lignes qui ne contiennent pas de valeurs manquantes pour cette colonne. Elle utilise la méthode de comparaison des valeurs des colonnes spécifiées dans la liste `columns` à partir du DataFrame. Pour chaque ligne contenant une valeur manquante, la fonction parcourt toutes les lignes sans valeur manquante et calcule la distance euclidienne en comparant les valeurs des colonnes. La valeur la plus proche est déterminée en trouvant la distance minimale. Les valeurs trouvées sont stockées dans un dictionnaire, où la clé est l'identifiant de la ligne correspondante et la valeur est la valeur trouvée. La fonction `start` est la fonction principale du script. Elle charge le DataFrame à partir du fichier CSV spécifié dans les paramètres, puis effectue les étapes suivantes : 1. Normalisation (mise à l'échelle Z) de toutes les colonnes numériques, à l'exception des colonnes contenant des valeurs manquantes. 2. Transformation des colonnes alpha en nombres. 3. Recherche des valeurs manquantes en utilisant la distance euclidienne. 4. Affichage des valeurs trouvées. 5. Systèmes multi-agents 5.4 Projet concret 6. Traitement du langage naturel 6.3 Projet concret 8. Conclusion En résumé, les outils tels que les réseaux de neurones, la logique floue, le raisonnement basé sur des cas, les systèmes multi-agents et le traitement du langage naturel offrent différentes approches pour résoudre des problèmes complexes. Chacun de ces outils a ses avantages et ses utilisations spécifiques. Cependant, les réseaux de neurones se distinguent souvent comme étant particulièrement performants et polyvalents dans de nombreux domaines, notamment en matière d'apprentissage à partir de données et de modélisation complexe. Par conséquent, les réseaux de neurones sont généralement considérés comme l'un des outils les plus puissants parmi ceux mentionnés. 8. Références https://github.com/andirian98/Medical-Decision-Making-using-Fuzzy-Logic-Project https://github.com/anisayari/Youtube-apprendre-le-deeplearning-avec-tensorflow