modifications des tp, exercices, ajouts d'indications en JS, d'exemples en gloutons, 3 semaines de boulot enfin voilà

This commit is contained in:
2026-01-15 18:32:27 +01:00
parent 2048ebb9b7
commit ec1ccf9460
18 changed files with 3821 additions and 172 deletions

View File

@@ -48,7 +48,7 @@ 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']
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
@@ -70,6 +70,130 @@ Ce code génère un graphique en nuage de points où chaque point représente un
--------
### Implémentation de l'algorithme KNN
Maintenant que nous savons visualiser nos données, passons à l'implémentation de l'algorithme.
#### Étape 1 : Calculer la distance entre deux points
```python
import math
def calculer_distance(point1, point2):
"""
Calcule la distance euclidienne entre deux points.
point1 et point2 sont des listes de coordonnées [x, y]
"""
somme = 0
for i in range(len(point1)):
somme += (point1[i] - point2[i]) ** 2
return math.sqrt(somme)
# Test
print(calculer_distance([0, 0], [3, 4])) # Affiche 5.0
```
#### Étape 2 : Trouver les k plus proches voisins
```python
def trouver_voisins(echantillons, mystere, k):
"""
Trouve les k plus proches voisins de mystere dans echantillons.
Paramètres:
echantillons : liste de dictionnaires {'coords': [x, y], 'classe': 'Type'}
mystere : liste [x, y] du point à classifier
k : nombre de voisins à retourner
Retourne:
Liste des k plus proches voisins
"""
# Calculer la distance pour chaque échantillon
distances = []
for echantillon in echantillons:
dist = calculer_distance(echantillon['coords'], mystere)
distances.append({'echantillon': echantillon, 'distance': dist})
# Trier par distance croissante
distances_triees = sorted(distances, key=lambda x: x['distance'])
# Retourner les k premiers
return [d['echantillon'] for d in distances_triees[:k]]
```
#### Étape 3 : Déterminer la classe majoritaire
```python
def classe_majoritaire(voisins):
"""
Détermine la classe la plus représentée parmi les voisins.
Paramètres:
voisins : liste de dictionnaires avec une clé 'classe'
Retourne:
La classe majoritaire (str)
"""
compteur = {}
for voisin in voisins:
classe = voisin['classe']
if classe in compteur:
compteur[classe] += 1
else:
compteur[classe] = 1
# Trouver la classe avec le plus grand nombre
classe_max = None
max_count = 0
for classe, count in compteur.items():
if count > max_count:
max_count = count
classe_max = classe
return classe_max
```
#### Étape 4 : L'algorithme KNN complet
```python
def knn(echantillons, mystere, k):
"""
Algorithme des k plus proches voisins.
Paramètres:
echantillons : liste de dictionnaires {'coords': [x, y], 'classe': 'Type'}
mystere : liste [x, y] du point à classifier
k : nombre de voisins à considérer
Retourne:
La classe prédite pour mystere
"""
voisins = trouver_voisins(echantillons, mystere, k)
return classe_majoritaire(voisins)
```
#### Exemple complet
```python
# Échantillon de Pokémon
pokemons = [
{'coords': [49, 49], 'classe': 'Eau'}, # Ecayon
{'coords': [50, 95], 'classe': 'Psy'}, # Deoxys
{'coords': [80, 45], 'classe': 'Psy'}, # Eoko
{'coords': [90, 75], 'classe': 'Psy'}, # Groret
{'coords': [90, 75], 'classe': 'Eau'}, # Tarpaud
]
# Pokémon mystère à classifier
pokemon_mystere = [65, 40]
# Prédiction avec k=3
prediction = knn(pokemons, pokemon_mystere, k=3)
print(f"Le Pokémon mystère est probablement de type : {prediction}")
```
--------
Auteur : Florian Mathieu
Licence CC BY NC