Découvrez nos
ressources

đŸš© Programmation IA : KNN

Matériel nécessaire :

  • 1 robot minimum ou simulation dans le logiciel
  • 1 ordinateur/robot
  • Petite arĂšne minimum

‍

Configuration logiciel :

  • configuration d'exemple : dĂ©pend de la mise en situation du code

‍

Durée :

2 heures

Age :

16 ans et +

‍

Les + de cette activité :

  • Peut ĂȘtre rĂ©alisĂ©e avec le simulateur

‍

Activité  ludique pour classe avec plusieurs robots : les élÚves entraßnent les robots à rouler dans un circuit puis une course est organisée. Les élÚves apprennent par la manipulation le principe de l'apprentissage supervisé et l'importance de la qualité des données d'entraßnement.

[Contenu vidéo à venir]

‍

‍

Introduction

Le Machine Learning est une branche de l’intelligence artificielle qui a pour but de donner la possibilitĂ© aux ordinateurs d’apprendre. Un ordinateur n’est pas intelligent, il ne fait qu’exĂ©cuter des tĂąches. On lui dĂ©crit sous forme de programmes quoi faire et comment le faire. C’est ce qu’on appelle la programmation.

Le Machine Learning traite des sujets complexes oĂč la programmation traditionnelle trouve ses limites. Construire un programme qui conduit une voiture serait trĂšs complexe voire impossible. Cela Ă©tant dĂ» aux trĂšs nombreux cas possibles Ă  traiter
 Le Machine Learning traite cette problĂ©matique diffĂ©remment. Au lieu de dĂ©crire quoi faire, le programme apprendra par lui-mĂȘme comment conduire en “observant” des expĂ©rimentations.

Machine Learning : Donner la possibilitĂ© Ă  un programme d’apprendre des tĂąches qui n’ont pas Ă©tĂ© programmĂ©es.

En fonction des donnĂ©es d’expĂ©rimentations que prendra l’algorithme d’apprentissage en entrĂ©e, il dĂ©duira par lui-mĂȘme une hypothĂšse de fonctionnement. Il utilisera cette derniĂšre pour de nouveaux cas, et affinera son expĂ©rience au fil du temps.

Il existe trois types d‘apprentissages en Machine Learning :

  • Apprentissage SupervisĂ©
  • Apprentissage Non supervisĂ©
  • Apprentissage par Renforcement

L’apprentissage supervisĂ© est le type le plus courant. Il s’agit de fournir aux algorithmes d’apprentissages un jeu de donnĂ©es d’apprentissage (Training Set) sous forme de couples (X, Y) avec X les variables prĂ©dictives (ou donnĂ©es d’entrĂ©e), et Y le rĂ©sultat de l’observation (ou dĂ©cision). En se basant sur le Training Set, l’algorithme va trouver une fonction mathĂ©matique qui permet de transformer (au mieux) X vers Y. En d’autres termes l’algorithme va trouver une fonction F tel que Y≈F(X) .

Ainsi, dans une situation X, il saura quelle décision Y doit prendre.

Situation d'étude et training set du robot AlphAI

Il convient désormais de préciser les situations X et les décisions Y attendues. 

Le cas d’étude proposĂ© est le dĂ©placement du robot dans une arĂšne rouge. L’objectif est que le robot se dĂ©place tout seul sans jamais toucher les murs.

Pour cela le robot pourra prendre les décisions suivantes :

  • Tourner Ă  gauche 
  • Aller tout droit 
  • Tourner Ă  droite 

Afin de prendre la dĂ©cision il faut nĂ©cessairement un retour d’information afin de disposer de donnĂ©es (data ou training set).

Cela est donnĂ© par les capteurs. Le choix effectuĂ© ici est d’utiliser la camĂ©ra. De la zone d’image de la camĂ©ra il est extrait deux zones qui seront appelĂ©es super pixels (voir ci-contre). La quantitĂ© de rouge de chaque super-pixel augmente lorsque le robot s’approche des murs en raison du contraste entre la piste blanche et les murs rouges.

‍

‍

Activité 1. Indiquer dans le tableau ci-dessous le résultat attendu comme décision en fonction de ce qui est repéré dans les superpixels.

‍

Les cas simplifiés ci-dessus, ne se produisent que trÚs rarement. Pour pouvoir prendre la décision dans tous les cas possibles, il faut obtenir la valeur numérique du niveau de rouge. 

L’image issue de la camĂ©ra est de taille 48*64 pixels. La position et la gĂ©omĂ©trie des super-pixels est dĂ©finie par la figure suivante :

‍

‍

ActivitĂ© 2. Ouvrir le fichier get_values.py. Indiquer le chemin d’accĂšs de l’image forward_0.jpg et exĂ©cuter le code ci-dessous permettant d’afficher l’image dans python.

from PIL import Image

import numpy as np

import matplotlib.pyplot as plt

def read_image(name):

    return np.array(Image.open(name, "r"))

img1=read_image("forward_0.jpg") #indiquer le chemin d'accĂšs de l'image

plt.imshow(img1)

plt.show()

Vous devez obtenir une image de la forme ci-dessous d’une taille de 48 pixels par 64 pixels, codĂ©e avec les trois couleurs RVB (Rouge Vert Bleu).

« img1 » est un tableau de pixels de taille 48*64*3

Dans le tableau de pixel on retrouve les 3 niveaux de couleurs Rouge Vert Bleu codés entre 0 et 255.

A partir de cette image, il va falloir extraire les deux super-pixels dĂ©finis prĂ©cĂ©demment et dĂ©terminer une mĂ©thode permettant d’obtenir le niveau de rouge pour chacun.

‍

‍

Nous allons comparer différentes techniques pour obtenir le meilleur contraste entre le rouge et le blanc de chaque super-pixel :

  • le niveau de gris moyen de chaque super-pixel
  • le niveau de rouge moyen de chaque super-pixel
  • le niveau de vert moyen de chaque super-pixel

‍

Dans un premier temps, l’image est transformĂ©e en niveau de gris Ă  l’aide de la fonction rgb2gray de la façon suivante :

def rgb2gray(rgb):

    return np.dot(rgb[...,:3], [0.299, 0.587, 0.144])

img2=rgb2gray(img1)

plt.imshow(img2, cmap="gray")

plt.show()

« img2 » correspond Ă  l’image en niveau de gris. Ainsi il n’y a qu’une seule valeur numĂ©rique entre 0 et 255 pour chaque pixel. 0 correspond Ă  un pixel blanc et 255 un pixel noir. Les super pixels Ă©tant dans la zone « basse » de l’image

‍

‍

ActivitĂ© 3. Ecrire une fonction moyenne(img,x,y,height,width)   qui va prendre en argument un tableau de pixels « img » Ă  un niveau de couleur, les coordonnĂ©es « x » et « y » du pixel en haut Ă  gauche d’un super-pixel, la hauteur « height » et la largeur « width » d’un super-pixel et qui renvoie la moyenne du niveau de couleur du super-pixel. 

‍

Il est ainsi possible de rĂ©cupĂ©rer deux valeurs avec les deux super-pixels dĂ©finis prĂ©cĂ©demment Ă  l’aide du code :

def get_two_values(img, x1=10, y1=28, x2=42, y2=28, height=16, width=13):

    value1 = moyenne(img, x1, y1, height, width)

    value2 = moyenne(img, x2, y2, height, width)

    return np.array((value1, value2))

Le niveau de couleur du super-pixel gauche est noté value1, le niveau de couleur du super-pixel droit est noté value2. Il est ainsi possible de définir un point de coordonnées (value1, value2)

‍

‍

ActivitĂ© 4. Executer le code pour rĂ©cupĂ©rer les valeurs value1 et value2 de l’image en niveau de gris obtenue prĂ©cĂ©demment.

Le choix effectuĂ© dans le logiciel AlphAI est d’utiliser la fonction de python mean qui va calculer la valeur moyenne du tableau.

‍

‍

‍

Activité 5. Appliquer la méthode du logiciel AlphAI et celle avec le niveau de gris et compléter avec les valeurs value1 et value2 dans les deux cas.

Fonction mean

Niveau Gris

Forward_0

Forwad_1

Left_0

Left_1

Right_0

Right_1

Right_2

Test_0

Test_1

‍

‍

Activité 6. Placer les points sur le graphique et identifier les zones correspondant aux différentes décisions (tourner à gauche, aller tout droit, tourner à droite). Conclure sur la méthode qui vous semble la plus appropriée pour distinguer les différentes décisions.

Intensité super-pixel droit

Intensité  super-pixel gauche

‍

À ce stade, il serait possible de piloter le robot Ă  partir d’actions conditionnelles portant sur ces valeurs de super-pixels. L’approche va ĂȘtre diffĂ©rente dans la suite. Nous allons utiliser une mĂ©thode portant le nom d’algorithme des K plus proches voisins.

‍

‍

L’algorithme des k plus proches voisins, KNN

Nous allons Ă©tudier de prĂšs un algorithme trĂšs connu parmi les algorithmes de machine learning : l’algorithme des K plus proches voisins, ou KNN en anglais pour « K Nearest Neighbours ». Cet algorithme a l’avantage d’ĂȘtre trĂšs simple, et donc de fournir une bonne base pour comprendre l’apprentissage supervisĂ©.

L'idĂ©e est d'utiliser un grand nombre de donnĂ©es afin "d'apprendre Ă  la machine" Ă  rĂ©soudre un certain type de problĂšmes. L’algorithme est particuliĂšrement intuitif quand les donnĂ©es se prĂ©sentent comme des points dans un espace de dimension 2, qui pourront donc ĂȘtre affichĂ©s Ă  l’écran. Nous allons donc choisir une configuration avec seulement 2 entrĂ©es capteurs, Ă  savoir 2 « super-pixels » de la camĂ©ra afin de permettre au robot de repĂ©rer les murs et de circuler dans l’arĂšne sans blocage. Dans un premier temps ce sera Ă  nous d’indiquer au robot l’action associĂ©e pour chaque nouvelle donnĂ©e (2 « super-pixels »), mais ensuite il sera capable de circuler par lui-mĂȘme en choisissant l’action majoritaire prise par les K plus proches voisins parmi les donnĂ©es entrĂ©es pendant la phase d’entraĂźnement.

Cet algorithme d’apprentissage supervisĂ© permet de classifier des donnĂ©es en fonction de leur proximitĂ© avec celles existantes constituant les donnĂ©es d’entraĂźnement. Les nouvelles donnĂ©es considĂšrent k voisins, les k plus proches, pour choisir quelle classification appliquer. Avec des donnĂ©es discrĂštes, comme des points dans un plan ou dans l’espace, les plus proches voisins sont sĂ©lectionnĂ©s en utilisant la distance euclidienne, mais d’autres mĂ©thodes peuvent ĂȘtre utilisĂ©es dans d’autres situations, comme la distance Manhattan si les donnĂ©es se placent sur un quadrillage ou un Ă©chiquier. L’intĂ©rĂȘt de cet algorithme rĂ©side dans le choix de k : trop petit et l’algorithme devient trop sensible aux erreurs ou aux donnĂ©es manquantes, trop grand et il considĂšre des donnĂ©es qui ne devraient pas ĂȘtre considĂ©rĂ©es.

On peut schĂ©matiser le fonctionnement de k-NN en l’écrivant en pseudo-code suivant :

Début Algorithme

Données en entrée :

  • un jeu de donnĂ©es D, correspondant au training set Ă©laborĂ©
  • une fonction de calcul de distance entre les deux points considĂ©rĂ©s de coordonnĂ©es [x1,y1] et [x2,y2]. d=x2-x12+y2-y12
  • Un nombre entier k, reprĂ©sentant le nombre de voisins Ă  prendre en compte

Pour une nouvelle observation X dont on veut prédire sa décision Y Faire :

  1. Calculer toutes les distances de cette observation X avec les autres observations du jeu de données D
  2. Retenir les K observations du jeu de données D les plus proches de X en utilisation la fonction de calcul de distance d
  3. Prendre les valeurs de Y des k observations retenues. Effectuer une régression et calculer la moyenne (ou la médiane) de Y retenues 
  4. Retourner la valeur calculĂ©e dans l’étape 3 comme Ă©tant la valeur qui a Ă©tĂ© prĂ©dite par K-NN pour l’observation X.

Fin Algorithme

Il faut donc pouvoir calculer la distance entre deux points. Dans un graphique en deux dimensions comme c’est le cas dans notre exemple, cela correspond simplement à la norme du vecteur entre les deux points.

Activité 1. Ecrire la fonction distance(point1, point2)   qui prend en argument deux points (point1=[x1,y1], point2=[x2,y2])  et qui renvoie la distance entre ces deux points.

Activité 2. Compléter le tableau ci-aprÚs en déterminant la distance entre les super-pixels des images précédentes (forward_0.jpg, forward_1.jpg,
) et des deux images tests (test_0.jpg et test_1.jpg).

‍

ActivitĂ© 3. Appliquer les Ă©tapes 3 et 4 de l’algorithme K-NN en en prenant K=1,2,3 et 4 et en dĂ©duire la dĂ©cision qui doit ĂȘtre prise (aller tout droit, tourner Ă  gauche, tourner Ă  droite).

‍

‍

Entrainement du robot

Phase de prĂ©paration de l’environnement de travail

  • Dans le menu ParamĂštres - > Charger des configurations d'exemples, sĂ©lectionner la configuration exemple « apprentissage supervisĂ© - KNN CamĂ©ra». 
Une image contenant texte, horlogeDescription générée automatiquement

Attention : Pour ce scĂ©nario, afin d’obtenir le meilleur contraste possible, mettez une surface blanche au sol, et Assurez-vous d’avoir un Ă©clairage uniforme sur la surface de l’arĂšne.

‍

Phase d’entraünement

Activité 1. Suivre le protocole afin de réaliser la phase d'entraßnement

‍

Vous ĂȘtes maintenant connectĂ© au robot, et votre Ă©cran doit ressembler Ă  l’image ci-dessous. Le niveau de sa batterie doit s’afficher en bas Ă  droite (vĂ©rifiez que le robot est bien chargĂ©).

  • Tant que le robot a de la place pour avancer, appuyez sur aller tout droit. 
  • Si le robot s’approche d’un mur, appuyez sur virage sur place Ă  gauche ou Ă  droite. 

À chaque instruction envoyĂ©e au robot, un nouveau point est ajoutĂ© au graphique. L’abscisse de ce point correspond Ă  la valeur du super-pixel de gauche et son ordonnĂ©e correspond Ă  la valeur du super-pixel de droite. La couleur de chaque point correspond Ă  l’action choisie : jaune pour aller tout droit, vert pour tourner Ă  droite et rouge pour tourner Ă  gauche. Ces points sont les donnĂ©es d’entraĂźnement. Cette phase d’entraĂźnement est primordiale pour que l’IA puisse apprendre correctement. Si les donnĂ©es d’entraĂźnement contiennent trop d’erreurs ou d’approximations, le comportement de l’IA risque de ne pas ĂȘtre satisfaisant. 

Notez bien :

Les pixels deviennent plus sombres lorsque le robot s’approche des murs. Normalement si le pixel de gauche est le plus sombre, il faut tourner Ă  droite, et si le pixel de droite est le plus sombre, il faut tourner Ă  gauche. AprĂšs avoir ajoutĂ© quelques points sur le graphique, vous pouvez activer la couleur d’arriĂšre-plan dans l’onglet des paramĂštres de visualisation. Cette option colore chaque pixel du graphique de la couleur du point de donnĂ©e le plus proche.

Lorsque vous aurez trois rĂ©gions bien claires sur le graphique, arrĂȘtez la phase d’entraĂźnement et rĂ©activez l’autonomie pour passer Ă  la phase de test.  Ne pas hĂ©siter Ă  bouger le robot Ă  la main, lorsqu’une zone du graphique contient trop peu de points.

‍

‍

Tests

Si le robot est bien entraĂźnĂ©, il saura Ă©viter les bords par lui-mĂȘme. Si au contraire il est mal entraĂźnĂ© ou la luminositĂ© dans l’arĂšne n’est pas homogĂšne, cela va produire du bruit dans les rĂ©gions créées et le robot fera plus d’actions inappropriĂ©es.

Notez bien :

Afin d’obtenir le meilleur comportement du robot, il faut tester plusieurs valeurs de k. Pour changer cette valeur, allez dans l’onglet « IA » et changer la valeur du paramĂštre « nombre de voisins ».

Une bonne valeur de k rĂ©duit l’effet du bruit et permet au robot de mieux gĂ©rer les rĂ©gions inexplorĂ©es.

Une fois que le robot est bien entraßné et que les tests se déroulent bien, vous pouvez passer aux activités.

‍

ActivitĂ© 1. Comparez le comportement du robot avec k=1, k=3, k=10 et k=30. Ensuite, d’aprĂšs ce que vous constatez, essayer de dĂ©terminer la valeur de k qui minimise l’effet des erreurs et donne le meilleur comportement du robot, c’est-Ă -dire la plus grande distance parcourue sans heurter un mur. La bonne valeur va dĂ©pendre du nombre de points de donnĂ©es, et du nombre d’erreurs dans ces donnĂ©es.

‍

ActivitĂ© 2. Maintenant que vous avez bien compris l’algorithme, essayez d’entrainer le robot avec le minimum de donnĂ©es possibles qui lui permettent de tourner sans taper contre les murs. 

‍

Commencez par faire une version théorique en dessinant les zones que vous voudriez obtenir sur votre graphique. Quels points sont à placer pour la réaliser ? Testez ces points avec le robot aprÚs les avoir rentrés dans le logiciel. Votre modÚle théorique a-t-il été applicable à la réalité, ou avez-vous dû y faire des modifications ? Quelles sont les limitations de cette méthode pour un robot tel que celui-là ?

Astuce : Vous pouvez déplacer le robot à la main pour choisir les points que vous voulez lui apprendre.

Remarque : Nous avons rĂ©ussi Ă  apprendre au robot Ă  circuler dans l’arĂšne sans taper les murs avec 3 points seulement.

Pour aller plus loin :

‍

ActivitĂ© 3. S’il vous reste du temps et que vous voulez expĂ©rimenter, changez d’algorithme et regardez quelles diffĂ©rences le robot a dans son comportement par rapport Ă  KNN. Quel autre algorithme proposĂ© Ă  un apprentissage plus rapide ? Et quel autre algorithme permettrait, selon vous, l’apprentissage de tĂąches plus complexes, comme taper dans un ballon vert ou reconnaĂźtre des ordres communiquĂ©s avec des signes de la main ?

‍

‍

Programmer l’algorithme des K plus proches voisins

1. Stoppez le robot et réactivez le bouton « Autonome ».

Une image contenant texte  Description générée automatiquement

2. Dans l’onglet IA, sĂ©lectionnez  Algorithme : code Ă©lĂšve , cela ouvrira une nouvelle fenĂȘtre vous demandant de nommer le fichier. 

3. AprĂšs lui avoir donnĂ© un nom, le fichier apparaĂźt dans l’explorateur Windows : ouvrez-le dans votre Ă©diteur de code prĂ©fĂ©rĂ© (Spyder, par exemple).

Ce code présente 3 fonctions déjà existantes : init, learn et take_decision. Ces fonctions seront appelées par le logiciel principal. Seule la fonction take_decision est importante pour ce TP.

4. Remarquez que quand vous vous déconnectez, un mini-robot simulé apparaßt en bas à droite. Si vous le voulez, vous pouvez faire les questions ci-dessous avec ce mini-robot et revenir au vrai robot à la fin du TP ; mais vous pouvez aussi faire tout le TP en restant connecté au vrai robot : comme vous préférez !

‍

‍

PROGRAMMER LE ROBOT DIRECTEMENT

Avant de programmer une intelligence artificielle, commençons par comprendre le principe de la fonction take_decision. Vous allez pouvoir modifier cette fonction pour changer le comportement du robot : aprĂšs chaque modification, sauvegardez votre code et cliquez sur le bouton « RĂ©initialiser l’IA ». Cette Ă©tape est Ă  rĂ©pĂ©ter pour chaque modification du code : sauver puis recharger le code.

La fonction a le prototype suivant :

take_decisionsensors:listint

L’entrĂ©e sensors est l’état des capteurs du robot, c’est-Ă -dire dans notre cas une liste de deux valeurs sensors[0] et sensors[1] qui sont l’intensitĂ© de ce que voit le robot Ă  sa gauche et Ă  sa droite. Sa sortie est le numĂ©ro de l’action choisie.

  1. Ajoutez l’instruction print(sensors) Ă  l’intĂ©rieur de la fonction. Sauvegardez, cliquez « RĂ©initialiser l’IA » dans le logiciel, et dĂ©marrez le robot. La valeur de sensors s’affiche maintenant dans la console (cliquer dans la barre des tĂąches sur l’icĂŽne pour afficher la console). Quelle est Ă  peu prĂšs la valeur de sensors quand le robot est face Ă  un mur ? quand il n’est pas face Ă  un mur ? quand il y a un mur Ă  sa gauche ou Ă  sa droite ?

‍

  1. Pour l’instant la fonction renvoie 0. Quelle valeur faut-il renvoyer pour que le robot aille tout droit ? (Faites l’essai)

‍

  1. Utilisez la variable x pour programmer un comportement cohĂ©rent du robot : « s’il n’y a pas de mur, je vais tout droit ; s’il y a un mur, je me tourne. »

‍

‍

PROGRAMMATION DE L’ALGORITHME

Calcul de distance

Si vous ne l’avez pas dĂ©jĂ  fait lors de l’activitĂ© prĂ©cĂ©dente, programmez une nouvelle fonction distance qui prend comme arguments deux points a et b qui sont deux tableaux de deux Ă©lĂ©ments chacun contenant leurs coordonnĂ©es et qui renvoie la distance euclidienne de ces deux points. Le prototype de la fonction est le suivant :

distancea:list, b:listfloat

Avec a=x1, y1 et b=x2, y2

Pour rappel, la distance euclidienne entre ces deux points est : d=x2-x12+y2-y12.

La racine carrĂ©e peut ĂȘtre utilisĂ©e en Python en important la bibliothĂšque math (ou numpy) en haut du fichier :

import math

et s’écrit ainsi :

y = math.sqrt(x)

L’opĂ©rateur carrĂ© peut ĂȘtre fait de la façon suivante :

y = x**2

  1. Programmez la nouvelle fonction distance. Puis pour la tester, écrivez en bas du fichier :

# compute distance

a = [0, 0]
b = [1, 2]
print("distance", distance(a, b))

Sauvez, chargez le code avec « RĂ©initialiser l’IA » et notez ci-dessous le rĂ©sultat qui s’affiche dans la console :

‍

Calcul de toutes les distances

Maintenant que vous avez une mĂ©thode pour calculer une distance, Ă©crivez une nouvelle fonction all_distances qui calcule toutes les distances d’un point par rapport Ă  la variable train_sensors qui sont les donnĂ©es d’entrĂ©e d’entrainement. Cette fonction prendra comme argument un nouveau point x qui est une liste de deux Ă©lĂ©ments comme prĂ©cĂ©demment, et renverra un tableau contenant toutes ces distances. Son prototype est :

all_distances(a:list[float], train_sensors:list[list[float]])→list[float]

Avec a=x0, y0 et train_sensors=x1, y1, x2, y2, 
, xn, yn Le tableau train_sensors étant de longueur n.

‍

  1. Programmez all_distances, puis testez avec le code suivant en bas du fichier :

# compute all distances

a = [0.4, 0.6]

train_sensors = [[0, 0], [0, 1], [1, 0]]

distance_list = all_distances(a, train_sensors)

print('distances to data', distance_list)

Rechargez le code et recopiez votre résultat :

‍

Trouver le plus petit element d’un tableau

CrĂ©ez une fonction s’appelant find_minimum prenant comme unique argument un tableau et renvoyant l’indice du premier plus petit Ă©lĂ©ment. Son prototype est :

find_minimum(dlist:listfloat)→int

  1. Programmez et testez find_minimum avec le code suivant :

# minimum in a list

idx_min = find_minimum(distance_list)

print('index of minimum', idx_min)

Notez le résultat :

‍

Le plus proche voisin

Maintenant que nous avons toutes les fonctions nĂ©cessaires, nous allons pouvoir crĂ©er la fonction nearest_neighbor_decision qui prend comme argument les donnĂ©es d’entrainement et l’entrĂ©e de la camĂ©ra actuelle, et qui renvoie la commande Ă  envoyer au robot. Son prototype est :

nearest_neighbor_decision(train_sensors:list[listfloat],train_decisions:list[int],a:list[float])→int

Comme prĂ©cĂ©demment, a=x0, y0 et  train_sensors=x1, y1, x2, y2, 
, xn, yn et train_decisions = d1,
,dn oĂč chaque di est la dĂ©cision prise pour le point xi, yi dans le tableau train_sensors. 

Pour réaliser la fonction, calculez les distances, trouvez la plus courte et renvoyez la commande associée en utilisant train_decisions.

‍

  1. Programmez et testez nearest_neighbors_decision avec le code suivant :

# KNN

a = [0.4, 0.6]

train_sensors = [[0, 0], [0, 1], [1, 0]]

train_decisions = [1, 2, 0]

decision = nearest_neighbor_decision(train_sensors, train_decisions, a)

print('KNN', decision)

Recopiez le résultat :

‍

‍

UTILISATION DE VOTRE ALGORITHME AVEC LE ROBOT 

FĂ©licitations, vous avez programmĂ© vous-mĂȘmes l’algorithme des K plus proches voisins dans le cas K=1. Il ne vous reste plus qu’à l’utiliser dans le programme pour entraĂźner le robot.

Pour cela, recopiez les lignes ci-dessous pour programmer la fonction take_decision pour prendre les bonnes dĂ©cisions, mais Ă©galement learn pour se rappeler des donnĂ©es d’entraĂźnement train_sensors et train_decisions qui seront créées au fur et Ă  mesure dans le programme principal :

train_sensors = train_decisions = None

def learn(X_train, y_train):
    global train_sensors, train_decisions
    train_sensors, train_decisions = X_train, y_train
    loss = 0
    return loss

def take_decision(sensors):
    if train_sensors is None:
        return 0
    return nearest_neigbor_decision(train_sensors, train_decisions, sensors)

 Et à présent, vous pouvez entraßner votre robot !

  1. Rechargez votre code
Une image contenant texte  Description générée automatiquement
  1. DĂ©sactivez l’autonomie du robot en cliquant sur l’icĂŽne
Une image contenant texte  Description générée automatiquement
Une image contenant texte  Description générée automatiquement
  1. ,
  2. Dirigez le robot en cliquant sur les flĂšches Ă  droite de l’écran. Tournez quand le robot est proche des murs et allez tout droit sinon. 

Les tableaux train_sensors et train_decisions sont remplis automatiquement par le logiciel Ă  chaque fois que vous cliquez une flĂšche.

  1. AprĂšs un court apprentissage, rĂ©activez l’autonomie
Une image contenant texte  Description générée automatiquement
Une image contenant texte  Description générée automatiquement
  1. Le robot navigue seul dans l’arĂšne. Évite-t-il les murs par lui-mĂȘme ?

‍

‍

Pour aller plus loin

L’algorithme que vous avez Ă©crit utilise le plus proche voisin pour prendre sa dĂ©cision. Modifiez votre code pour qu’il prenne en compte la majoritĂ© des dĂ©cisions prises entre un nombre k>1, k∈N. La difficultĂ© rĂ©side dans la modification de la fonction trouvant le minimum. Il faut maintenant qu’elle en trouve k et non juste 1.

‍

‍

Bilan et retours d'expérience

‍

En programmation, la liste des fonctions accessibles d’un programme s’appelle API, pour Application Programming Interface, Interface de Programmation d’Application. Elle est utilisĂ©e par les programmeurs pour savoir comment interagir avec le programme. Vous trouverez l’API du module python alphai en suivant ce lien : https://drive.google.com/file/d/1C4ovPW_eH5KFz5Y9JvSrzLhtmdOpcp6-/view

À tĂ©lĂ©charger
TP - KNN CouleurLab - KNN Color
Cursus liés