Tous les articles par thierryp

Algorithme des k plus proches voisins

  1. Introduction
    L’algorithme des k plus proches voisins appartient à la famille des algorithmes d’apprentissage automatique (machine learning).
    L’idée d’apprentissage automatique ne date pas d’hier, puisque le terme de machine learning a été utilisé pour la première fois par
    l’informaticien américain Arthur Samuel en 1959. Les algorithmes d’apprentissage automatique ont connu un fort regain d’intérêt
    au début des années 2000 notamment grâce à la quantité de données disponibles sur internet.
    L’algorithme des k plus proches voisins est un algorithme d’apprentissage supervisé, il est nécessaire d’avoir des données labellisées. À partir d’un ensemble E de données labellisées, il sera possible de classer (déterminer le label) d’une nouvelle donnée (donnée n’appartenant pas à E). À noter qu’il est aussi possible d’utiliser l’algorithme des k plus proches voisins à des fins de régression (on cherche à déterminer une valeur à la place d’une classe), mais cet aspect des choses ne sera pas abordé ici. L’algorithme des k plus proches voisins est une bonne introduction aux principes des algorithmes d’apprentissage automatique, il est en effet relativement simple à appréhender (l’explication donnée aux élèves peut être très visuelle). Cette première approche des algorithmes d’apprentissage peut aussi amener les élèves à réfléchir sur l’utilisation de leurs données personnelles (même si ce sujet a déjà abordé auparavant) : de nombreuses sociétés (exemple les GAFAM) utilisent les données concernant leurs utilisateurs afin de ”nourrir” des algorithmes de machine learning qui permettront à ces sociétés d’en savoir toujours plus sur nous et ainsi de mieux cerné nos ”besoins” en termes de consommation.
  1. Principe de l’algorithme
    L’algorithme de k plus proches voisins ne nécessite pas de phase d’apprentissage à proprement parler, il faut juste stocker le jeu de
    données d’apprentissage.
    Soit un ensemble E contenant n données labellisées : E = {(yi
    , x⃗i)} avec i compris entre 1 et n, où yi correspond à la classe
    (le label) de la donnée i et où le vecteur x⃗i de dimension p (x⃗i = (x1i
    , x2i, …, xpi)) représente les variables prédictrices de la donnée i. Soit une donnée u qui n’appartient pas à E et qui ne possède pas de label (u est uniquement caractérisée par un vecteur x⃗u de dimension p). Soit d une fonction qui renvoie la distance entre la donnée u et une donnée quelconque appartenant à E. Soit un entier k inférieur ou égal à n. Voici le principe de l’algorithme de k plus proches voisins :
    ▷ On calcule les distances entre la donnée u et chaque donnée appartenant à E à l’aide de la fonction d
    ▷ On retient les k données du jeu de données E les plus proches de u
    ▷ On attribue à u la classe qui est la plus fréquente parmi les k données les plus proches.
  1. Étude d’un exemple
    3.1. Les données
    Nous avons choisi ici de nous baser sur le jeu de données ”iris de Fisher” (il existe de nombreuses autres possibilités). Ce jeu de
    données est composé de 50 entrées, pour chaque entrée nous avons :
    ▷ la longueur des sépales (en cm)
    ▷ la largeur des sépales (en cm)
    ▷ la longueur des pétales (en cm)
    ▷ la largeur des pétales (en cm)
    ▷ l’espèce d’iris : Iris setosa, Iris virginica ou Iris versicolor (label)
    Il est possible de télécharger ces données au format csv, par exemple sur le site GitHub Gist ou en le téléchargeant ici
    Une fois ces données téléchargées, Il est nécessaire de les modifier à l’aide d’un tableur :
    ▷ dans un souci de simplification, nous avons choisi de travailler uniquement sur la taille des pétales, nous allons donc supprimer les colonnes ”sepal_length” et ”sepal_width”
    ▷ il est nécessaire d’encoder les espèces avec des chiffres : 0 pour Iris setosa, 1 pour Iris virginica et 2 pour Iris versicolor (ce
    processus d’encodage des données textuelles est relativement classique en apprentissage automatique).
    3.2. Bibliothèques Python utilisées
    Nous allons utiliser 3 bibliothèques Python :
    ▷ Pandas [3] qui va nous permettre d’importer les données issues du fichier csv
    ▷ Matplotlib [4] qui va nous permettre de visualiser les données (tracer des graphiques)
    ▷ Scikit-learn [5] qui propose une implémentation de l’algorithme des k plus proches voisins.
    Ces bibliothèques sont facilement installables notamment en utilisant la distribution Anaconda (ou Miniconda).
    3.3. Première visualisation des données
    Une fois le fichier csv modifié, il est possible d’écrire un programme permettant de visualiser les données sous forme de graphique
    (abscisse : ”petal_length”, ordonnée : ”petal_width”) :
import pandas
import matplotlib.pyplot as plt
iris=pandas.read_csv("iris.csv")
x=iris.loc[:,"petal_length"]
y=iris.loc[:,"petal_width"]
lab=iris.loc[:,"species"]
plt.scatter(x[lab == 0], y[lab == 0], color='g', label='setosa')
plt.scatter(x[lab == 1], y[lab == 1], color='r', label='virginica')
plt.scatter(x[lab == 2], y[lab == 2], color='b', label='versicolor')
plt.scatter(2.5, 0.75, color='k')
plt.legend()
plt.show()
FIGURE 1 – Représentation graphique des données
FIGURE 1 – Représentation graphique des données

3.4. Utilisation de l’algorithme des k plus proches voisins Le graphique ci-dessus (figure 1) montre que les 3 classes (Iris setosa, Iris virginica et Iris versicolor) sont relativement bien séparées. On peut alors ajouter une donnée non labellisée n’appartenant pas à l’ensemble d’origine (voir figure 2) :

FIGURE 2 – Ajout d’une donnée non labellisée

Dans l’exemple ci-dessus (figure 2) les élèves n’auront aucune difficulté à déterminer l’espèce de l’iris qui a été ajouté au jeu de données.
Dans certains cas (exemple : largeur pétale = 0,75 cm ; longueur pétale = 2,5 cm) il est un peu plus difficile de se prononcer ”au premier coup d’oeil” (voir figure 3) :

FIGURE 3 – Cas plus difficile…



À partir de l’exemple ci-dessus (voir figure 3), il est possible de demander aux élèves de proposer une méthode permettant de traiter
ce genre de cas litigieux. L’enseignant peut, grâce à une série de ”questions-réponses”, amener doucement les élèves à la solution
proposée par l’algorithme des k plus proches voisins :
▷ on calcule la distance entre notre point (largeur du pétale = 0,75 cm ; longueur du pétale = 2,5 cm) et chaque point issu du
jeu de données ”iris” (à chaque fois c’est un calcul de distance entre 2 points tout ce qu’il y a de plus classique) ;
▷ on sélectionne uniquement les k distances les plus petites (les k plus proches voisins) ;

▷ parmi les k plus proches voisins, on détermine quelle est l’espèce majoritaire. On associe à notre ”iris mystère” cette ”espèce
majoritaire parmi les k plus proches voisins”.
Dans l’exemple évoqué ci-dessus (largeur pétale = 0,75 cm ; longueur pétale = 2,5 cm), pour k=3, nous obtenons graphiquement :

FIGURE 4 – 3 plus proches voisins dans le cas : largeur pétale = 0,75 cm ; longueur pétale = 2,5 cm

Un iris ayant une largeur de pétale égale à 0,75 cm et une longueur de pétale égale à 2,5 cm a une ”forte” probabilité (cette notion
de probabilité d’obtenir un résultat correct grâce à cet algorithme, bien que très intéressante, pourra difficilement être abordée avec
des élèves de première) d’appartenir à l’espèce setosa.

3.5. Utilisation de scikit-learn (à installer si absente de votre éditeur)
La bibliothèque Python scikit-learn propose un grand nombre d’algorithmes lié à l’apprentissage automatique (c’est sans aucun
doute la bibliothèque la plus utilisée en apprentissage automatique). Parmi tous ces algorithmes, scikit-learn propose l’algorithme
des k plus proches voisins. Voici un programme Python permettant de résoudre le problème évoqué ci-dessus (largeur pétale = 0,75
cm ; longueur pétale = 2,5 cm) :

import pandas
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

#traitement CSV
iris=pandas.read_csv("iris.csv")
x=iris.loc[:,"petal_length"]
y=iris.loc[:,"petal_width"]
lab=iris.loc[:,"species"]
#fin traitement CSV

#valeurs
longueur=2.5
largeur=0.75
k=3
#fin valeurs

#graphique
plt.scatter(x[lab == 0], y[lab == 0], color='g', label='setosa')
plt.scatter(x[lab == 1], y[lab == 1], color='r', label='virginica')
plt.scatter(x[lab == 2], y[lab == 2], color='b', label='versicolor')
plt.scatter(longueur, largeur, color='k')
plt.legend()
#fin graphique

#algo knn
d=list(zip(x,y))
model = KNeighborsClassifier(n_neighbors=k)
model.fit(d,lab)
prediction= model.predict([[longueur,largeur]])
#fin algo knn

#Affichage résultats
txt="Résultat : "
if prediction[0]==0:
    txt=txt+"setosa"
if prediction[0]==1:
    txt=txt+"virginica"
if prediction[0]==2:
    txt=txt+"versicolor"
plt.text(3,0.5, f"largeur : {largeur} cm longueur : {longueur} cm", fontsize=12)
plt.text(3,0.3, f"k : {k}", fontsize=12)
plt.text(3,0.1, txt, fontsize=12)
#fin affichage résultats

plt.show()

Nous obtenons le résultat suivant (voir figure 5) :

FIGURE 5 – 3 plus proches voisins à l’aide de scikit-learn dans le cas : largeur pétale = 0,75 cm ; longueur pétale = 2,5 cm

Il est ensuite possible de demander aux élèves de m le programme ci-dessus afin d’étudier les changements induits par la
modification du paramètre k (notamment pour k=5) en gardant toujours les mêmes valeurs de largeur et de longueur (largeur pétale
= 0,75 cm ; longueur pétale = 2,5 cm).
Pour terminer, il est aussi possible de demander aux élèves de travailler avec d’autres valeurs de longueur et largeur.

  1. Possibilité de projet
    Il est possible, dans le cadre d’un projet, de faire travailler les élèves sur un autre jeu de données, par exemple, ”Prédire les survivants
    du Titanic”. Le jeu de données peut être récupéré sur le site kaggle [6]. Le label est ”survivant” ou ”décédé”. Il sera nécessaire de
    retravailler les données comme nous l’avons fait pour le jeu de données ”Iris” (supprimer des colonnes, encodage…). Dans ce projet
    il sera possible de faire travailler les élèves sur des vecteurs d’entrée de dimension supérieure à 2 (le genre, l’âge, la classe occupée
    par le passager sur le bateau, …).

voici un lien vers le projet Titanic développé par Benoit Fourlegnie:

projet titanic

Robot Sumo

Le SUMO est un style de lutte traditionnel japonais. Les lutteurs essaient de se pousser hors du ring.

Plus ils sont lourds, plus il est difficile de les pousser hors du ring.
 

This image has an empty alt attribute; its file name is sumo1.png

Eh bien, nous ne vous opposerons pas à un vrai lutteur japonais de sumo; vous auriez autant de chance de réussir que le jeune dans la photo ci-dessus! Mais nous pourrions nous amuser à fabriquer des modèles de lutteurs Robot SUMO.

Robot SUMO en lutte

Nous ne respecterons pas les règles officielles de Mini Robot SUMO, nous cherchons simplement à produire des robots SUMO pour le plaisir; (mais si vous êtes intéressé par la lecture du règlement officiel, vous pouvez en voir un résumé à l’adresse http://www.robotroom.com/SumoRules.html).

Le but:

Pousser les autres robots hors de l’anneau, tout en restant dans l’anneau.

Le ring:

Le mini ring officiel mesure environ 75 cm de diamètre, peint en noir avec une bande blanche sur le pourtour.

Les robots:

Les robots  SUMO mesurent 20 cm par 20 cm maximum. Leur poids ne devra pas dépasser 500 g. Vous pouvez les construire de la manière la plus ingénieuse possible, de manière à ce qu’ils soient capables de pousser votre adversaire hors du ring.

Le combat:

Les robots seront placés à l’intérieur du ring, l’un en face de l’autre. Ils doivent être contrôlés uniquement par votre programme informatique; vous n’êtes pas autorisé à les pousser à la main!

Le programme:

Vous pourrez utiliser n’importe quel langage de programmation, soit graphique soit code.
Comment écrire rapidement un programme qui permettra à notre robot de pousser le robot de l’autre équipe hors du ring? – Pensez-y…

La victoire:

marquer trois points pour une victoire et un pour une défaite; le gagnant est le robot avec le plus de points après 2 combats. Si les robots sont égaux après deux combats, un troisième combat décisif est exécuté.

La conception du robot:

Vous pouvez utiliser tous types de  robots  pour commencer, puis les modifier plus tard, si vous pensez que cela vaut la peine de les modifier.

 
L’idée d’un robot mini sumo est illustrée ci dessus. L’idée est que un appendice soulèvera les roues du robot adverse, ce qui facilitera le déplacement de l’adversaire hors de la patinoire.

Vous pouvez trouver des modèles de robots ici :

http://www.edurobot.ch/?p=1032

http://www.damienkee.com/robots/


Mais est-ce la seule façon de construire un robot SUMO? – Votre idée peut être meilleure!

Stratégie – et autres options sournoises…


Quelles sont les possibilités – l’une des pratiques suivantes est-elle pratique?
• Utilisez un “bloc aléatoire” afin que votre robot ne tourne pas la même quantité chaque fois qu’il revient du bord de la patinoire (est-ce utile)?
• Utilisez une feuille avant presque plate (à glisser sous les roues d’un adversaire)?
• Utilisez plus de deux roues motorisées (pour donner à votre robot plus de «punch»)?
• Utilisez des roues plus petites ou plus grandes (quelle serait la meilleure?)
• Utilisez des chenilles au lieu de roues (cela aiderait-il)?
• Utilisez une sorte de bélier (un troisième moteur pour assommer votre adversaire)?
• Utilisez sonar (pour trouver votre adversaire afin de pouvoir le recharger avant qu’il ne vous reproche)?
Pouvez-vous penser à d’autres options en plus de celles mentionnées ci-dessus? Vous pouvez essayer beaucoup de choses – laquelle est la meilleure pour votre robot en pratique?

Pas d’idée:

Faites des recherches sur le net!

Mais vos idées sont bonnes!

Commencez à rivaliser avec vos mini lutteurs SUMO!


Que le meilleur robot gagne…


  Bonne chance – Amusez-vous – Profitez-en!

Radar vélo

Vous allez réaliser un radar de vélo .

Garmin commercialise un accessoire de ce type voir la vidéo  .

Radar de vélo Varia™

Ce radar détecte les véhicules arrivant de l’arrière,  l’avertisseur lumineux se modifie lorsque un véhicule se rapproche et la distance entre le véhicule et le cycliste s’affiche sur le compteur Garmin.

Pour cela vous réaliser un projet avec une carte Arduino un capteur ultrason et un afficheur lcd ou autre.

 

pour commencer vous aller devoir concevoir un chenillard de Leds et mesurer une distance avec le capteur ultrason .

Répartissez vous les taches et au travail.

Projet: Voir comme un daltonien

Fonctionnalités attendues :

  1. Le projet sera réalisé en javascript avec la bibliothèque p5.js.
  2. L’application devra fonctionner aussi bien sur PC ou smartphone et s’adapter à la taille de l’écran.
  3. Capturer une image ou une vidéo avec soit une webcam soit le capteur intégré de votre tablette ou smartphone.
  4. Modifier une image ou une vidéo pour en faire un rendu correspondant à la vision d’un daltonien.
  5. Proposer un test de dépistage du daltonisme.

Ressources :

Prototypage Arduino

Nous allons entrer dans le monde ARDUINO,

en fait vous avez déjà utiliser arduino, le robot Mbot de chez Makerblock utilise une carte du monde Arduino.

L’Arduino est une plateforme de prototypage électronique open-source, basée d’une part sur du matériel et d’autre part sur un ensemble de logiciels faciles à utiliser. Arduino est très utilisé dans le monde, il existe une très forte communauté sur internet.

Il existe énormément de ressources en ligne, vous allez réalisé un apprentissage sur le site openclassroom .

Inscrivez vous sur le site .

Pour tester vos réalisations 2 possibilités:

  • avec du matériel Arduino fourni par le lycée.
  • en simulation en ligne avec Tinkercad   

Inscrivez vous sur le site .

C’est à vous commencer le cours Programmez vos premiers montages avec Arduino et tester vos programmes sur Tinkercad.

Voici une vidéo YouTube de prise en main de Tinkercad

si vous avez un problème, après avoir réfléchi et tenter de trouver une solution appelez le professeur.

Il existe d’autres tutoriaux en ligne , il suffit de chercher…

Par exemple robot-maker.com

projet:

  • Jeu Simon

voici le principe sur un jeu en ligne Free Simon

  • Jeu Quizz