From 94dd0b4a7a97645399f58b717ea4bf2b0c866875 Mon Sep 17 00:00:00 2001 From: Florian Mathieu Date: Wed, 27 Mar 2024 18:05:50 +0100 Subject: [PATCH] =?UTF-8?q?ajout=20cours,=20fichiers=20donn=C3=A9es=20poke?= =?UTF-8?q?mons,=20et=20python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knn/DISTANCE.md | 10 +++++- knn/EXERCICES.md | 15 +++++++++ knn/IMPLEMENTATION.md | 77 +++++++++++++++++++++++++++++++++++++++++++ knn/poke.py | 22 +++++++++++++ knn/pokemons.csv | 35 ++++++++++++++++++++ 5 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 knn/EXERCICES.md create mode 100644 knn/IMPLEMENTATION.md create mode 100644 knn/poke.py create mode 100644 knn/pokemons.csv diff --git a/knn/DISTANCE.md b/knn/DISTANCE.md index db8a741..125a675 100644 --- a/knn/DISTANCE.md +++ b/knn/DISTANCE.md @@ -27,4 +27,12 @@ $$ - Distance de Hamming Ici, il s'agit de compter le nombre de bits qui diffèrent entre deux mots binaires. -Exemple : si a = 0001 et b = 1101, alors d(a,b) = 2. \ No newline at end of file +Exemple : si a = 0001 et b = 1101, alors d(a,b) = 2. + +------------ + +Auteur : Florian Mathieu + +Licence CC BY NC + +Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. diff --git a/knn/EXERCICES.md b/knn/EXERCICES.md new file mode 100644 index 0000000..fbc5eb8 --- /dev/null +++ b/knn/EXERCICES.md @@ -0,0 +1,15 @@ +### Exercices + +1. **Écrire une fonction `calculer_distance`** qui prend en entrée les caractéristiques de deux Pokémon et retourne la distance euclidienne entre eux. +2. **Tester la fonction** avec des exemples simples pour vérifier son bon fonctionnement + +Conseil : n'oubliez pas d'importer la bibliothèque `pandas`qui permet de travailler avec des fichiers csv (le cours se trouve [ici](../données_en_table)) + +Le fichier [pokemons.csv](pokemons.csv) qui va avec. + +```python +import pandas as pd + +pokemons = pd.read_csv('chemin/vers/pokemons.csv') +``` + diff --git a/knn/IMPLEMENTATION.md b/knn/IMPLEMENTATION.md new file mode 100644 index 0000000..144d8de --- /dev/null +++ b/knn/IMPLEMENTATION.md @@ -0,0 +1,77 @@ +### Implémentation de l'algorithme des K plus proches voisins. + +On pourrait essayer de penser à un algorithme simple pour pouvoir implémenter l'algorithme knn en python: + +- Il nous faut une liste d'échantillons de taille *n* +- La donnée que l'on veut classer, appellons là *mystere* +- Un entier *k* plus petit que *n* +- La règle de calcul des distances + +Il nous faudra donc répéter ces trois étapes suivantes pour faire fonctionner l'algorithme: + +1. Trier les échantillons selon une distance croissante avec *mystere* +2. Un tableau contenant les *k* premiers voisins de la liste triée +3. Renvoyer ce tableau. + +--------------- + +### Et en langage Python ? + +Nous allons utiliser la bibliothèque `Matplotlib` + +#### Pourquoi utiliser`matplotlib` ? + +- **Visualiser les données** : Avant de plonger dans des algorithmes complexes, il est essentiel de comprendre les données avec lesquelles on travaille. Un bon graphique peut révéler des tendances, des anomalies, des clusters ou des relations entre les variables bien mieux qu'une simple inspection des chiffres. +- **Communiquer des résultats** : Les graphiques aident à communiquer les résultats d'une analyse de manière efficace et intuitive, que ce soit entre scientifiques ou pour présenter à un public non spécialiste. + +### Premiers Pas avec `matplotlib` + +Pour commencer, il faut installer `matplotlib` si ce n'est pas déjà fait. Cela se fait généralement via pip : + +```python +pip install -- update --proxy = 172.16.0.253:3128 matplotlib +``` + +Ensuite, pour utiliser `matplotlib`, on commence par importer le module `pyplot`, souvent sous l'alias `plt` : + +```python +import matplotlib.pyplot as plt +``` + +### Exemple de Base + +Imaginons que l'on souhaite représenter les statistiques d'attaque et de défense de quelques Pokémon. + +```python +import matplotlib.pyplot as plt + +# Supposons que ces listes contiennent les statistiques d'attaque et de défense de quelques Pokémon +attaques = [55, 75, 150, 45] +defenses = [45, 60, 50, 65] +noms = ['Pikachu', 'Bulbasaur', 'Charizard', 'Squirtle'] + +plt.figure(figsize=(10, 5)) # Définit la taille de la figure +plt.scatter(attaques, defenses, color='red') # Crée un nuage de points avec les statistiques d'attaque et de défense + +# Ajoute des titres et des étiquettes +plt.title('Attaque vs Défense des Pokémon') +plt.xlabel('Attaque') +plt.ylabel('Défense') + +# Ajoute des annotations pour chaque point +for i, nom in enumerate(noms): + plt.annotate(nom, (attaques[i], defenses[i])) + +plt.grid(True) # Ajoute une grille pour une meilleure lisibilité +plt.show() # Affiche le graphique +``` + +Ce code génère un graphique en nuage de points où chaque point représente un Pokémon, avec son niveau d'attaque sur l'axe des x et son niveau de défense sur l'axe des y. Les annotations permettent d'identifier chaque Pokémon sur le graphique. + +-------- + +Auteur : Florian Mathieu + +Licence CC BY NC + +Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. diff --git a/knn/poke.py b/knn/poke.py new file mode 100644 index 0000000..4130dd0 --- /dev/null +++ b/knn/poke.py @@ -0,0 +1,22 @@ +import matplotlib.pyplot as plt + +# On initialise des tableaux contenants des statistiques de Pokemon +attaques = [55, 75, 150, 45] +defenses = [45, 60, 50, 65] +noms = ['Pikachu', 'Bulbizarre', 'Salameche', 'Carapuce'] + +plt.figure(figsize=(10, 5)) # Définit la taille de la figure +plt.scatter(attaques, defenses, color='red') # Crée un nuage de points avec les statistiques d'attaque et de défense + +# Ajoute des titres et des étiquettes +plt.title('Attaque vs Défense des Pokémon') +plt.xlabel('Attaque') +plt.ylabel('Défense') + +# Ajoute des annotations pour chaque point +for i, nom in enumerate(noms): + plt.annotate(nom, (attaques[i], defenses[i])) + +plt.grid(True) # Ajoute une grille pour une meilleure lisibilité +plt.show() # Affiche le graphique + diff --git a/knn/pokemons.csv b/knn/pokemons.csv new file mode 100644 index 0000000..19ce35f --- /dev/null +++ b/knn/pokemons.csv @@ -0,0 +1,35 @@ +nom,points de vie,Pokemons de type Eau,Pokemons de type Psy +Ecayon,49,49, +Tiplouf,53,51, +Carabaffe,59,63, +Prinplouf,64,66, +Gobou,50,70, +Gamblast,71,73, +Mateloutre,75,75, +Tarpaud,90,75, +Crocrodil,65,80, +Phione,80,80, +Rosabyss,55,84, +Bargantua,70,92, +Poissoroy,80,92, +Clamiral,95,100, +Octillery,75,105, +Aligatueur,85,105, +Nucleos,45,,30 +Deoxys,50,,70 +Deoxys,50,,95 +Deoxys,50,,150 +Deoxys,50,,180 +Spoink,60,,25 +Mesmerella,60,,45 +Siderella,70,,55 +Eoko,75,,50 +Crefadet,75,,125 +Munna,76,,25 +Groret,80,,45 +Okeoke,95,,23 +Mew,100,,100 +Mewtwo,106,,110 +Mewtwo,106,,150 +Mewtwo,106,,190 +Symbios,110,,65