SESSION 2020 PSISIN
GP
CONCOURS
COMMUN
INP
ÉPREUVE MUTUALISÉE AVEC E3A-POLYTECH
ÉPREUVE SPÉCIFIQUE - FILIÈRE PSI
INFORMATIQUE
Mercrediémai:8h-1ilh
N.B. : le candidat attachera la plus grande importance à la clarté, à la
précision et à la concision de la rédaction.
Si un candidat est amené à repérer ce qui peut lui sembler être une erreur
d'énoncé, il le signalera sur sa copie
et devra poursuivre sa composition en expliquant les raisons des initiatives
qu'il a été amené à prendre.
RAPPEL DES CONSIGNES
«_ Utiliser uniquement un stylo noir ou bleu foncé non efjaçable pour la
rédaction de votre composition ; d'autres
couleurs, excepté le vert, peuvent être utilisées, mais exclusivement pour les
schémas et la mise en évidence
des résultats.
° Ne pas utiliser de correcteur.
«_ Écrire le mot FIN à la fin de votre composition.
Les calculatrices sont interdites
Le sujet est composé de trois parties indépendantes.
L'épreuve est à traiter en langage Python. La syntaxe de Python est rappelée en
Annexe, page 8 du
Document Réponse.
Les différents algorithmes doivent être rendus dans leur forme définitive sur
le document réponse dans
l'espace réservé à cet effet en respectant les éléments de syntaxe du langage
(les brouillons ne sont
pas acceptés).
La réponse ne doit pas se cantonner à la rédaction de l'algorithme sans
explication, les programmes
doivent être expliqués et commentés.
Énoncé : page 1 à page 12
Document réponse et Annexe : page | à page 8
Seul le Document Réponse est à rendre.
1/12
Détection d'obstacles par un sonar de sous-marin
Partie I - Introduction
Pour détecter des obstacles sous l'eau, en l'absence de visuel direct, les
sous-marins sont équipés
de sonars. L'onde ultrasonore émise par le sonar est réfléchie sur l'obstacle
et le signal en retour est
détecté et analysé pour obtenir la distance de l'obstacle au sous-marin. Une
des difficultés rencontrée
lors de l'analyse du signal de retour est de déterminer si l'obstacle est une
roche ou un objet métallique
donc un danger potentiel.
Il existe des techniques d'aide à la décision faisant partie des algorithmes
dits d'Intelligence Arti-
ficielle permettant d'analyser le signal de retour d'un sonar et de déterminer
de quelle nature est
l'obstacle.
Objectif
L'objectif du travail proposé est de découvrir des algorithmes d'Intelligence
Artificielle en s'ap-
puyant sur ce problème de détection d'obstacle. À partir d'une base de données
comportant des
mesures de sonar réalisées sur des roches et sur du métal, il s'agira d'être
capable de déterminer
à partir d'une mesure inconnue, si l'objet situé devant le sous marin est une
roche ou un objet
métallique.
Le sujet abordera les points suivants :
- analyse et représentation des données,
- construction des arbres de décisions.
- prédiction par la méthode « random forest ».
Dans tout le sujet, 1l sera supposé que les modules python numpy,
matplotlib.pyplot sont déjà
importés dans le programme (cf. Annexe), on utilisera donc les fonctions de ces
modules sans préciser
l'origine de celles-ci. Lorsqu'il est demandé de définir des vecteurs ou des
matrices, 1l est demandé
d'utiliser le type array du module numpy.
Partie II - Analyse des données
IL.1 - Présentation
Les données utilisées pour l'apprentissage de l'algorithme ont été obtenues
suite à une campagne
d'essais réalisés dans l'océan à partir des mesures d'un sonar situé à environ
10 mètres d'un cylindre
métallique ou d'un cylindre en pierre pour différentes incidences angulaires du
signal émis par le
SONT.
Le signal émis par le sonar et le signal reçu sont numériques et représentés
avec N valeurs sur une
durée totale T;. Les variables Tf et N sont définies dans le programme.
Q1. Écrire une instruction permettant de définir la variable temps, vecteur
décrivant les instants de
0 à T ; uniformément répartis (exclu).
Le signal émis par le sonar (appelé CHIRP) est un signal modulé en fréquence
linéairement en partant
d'une fréquence f, jusqu'à la fréquence f;, (figure 1), ceci permet d'atteindre
de grandes portées et
une bonne réception du signal lors du retour de l'onde malgré les bruits de
mesure.
2/12
L'expression du signal émis est la suivante :
e(f) = Eosin(2x f.(t)t) S0 1 -- P; où k est le nombre de
classes possibles, 1c1 2
i=0
(0 ou 1), p; est la proportion des éléments du jeu de données appartenant à la
classe 5. On rappelle que
la valeur de la classe est contenue dans la dernière colonne du tableau de
données.
Pour obtenir l'indice de concentration de Gin1 total pour les deux groupes
(gauche et droite), on réalise
une somme des deux indices de concentration Gini,, pondérée d'un coefficient de
taille relative : taille
du jeu de données du groupe divisé par le nombre de données des deux groupes
(nombre de données
totales).
Q14. Compléter les instructions notées 1 à 5 de la fonction Gini_groupes donnée
sur le document
réponse qui prend en argument groupes la liste contenant les deux groupes à
tester et qui
renvoie l'indice de concentration de Gin1.
Lors de la construction de l'arbre, on peut fixer plusieurs critères permettant
d'arrêter la construction
en calculant une feuille :
- premier critère : quand le nombre de données à séparer est inférieur à une
valeur que l'on notera
taille_min,
- deuxième critère : quand le nombre de séparations a atteint une valeur
maximale notée sep_max.
On donne à la feuille associée au jeu de données restant en fin de séparation
la valeur du groupe
majoritaire. Si la majorité des données est dans la classe 0 (roche) alors la
feuille prendra la valeur 0,
sinon elle prendra la valeur 1 (métal).
Q15. Écrire une fonction feuille(data) qui prend en argument un jeu de données
data et qui
renvoie la valeur de la classe majoritaire. La variable data est du même format
que la variable
donnees.
La fonction permettant de lancer la construction de l'arbre est la suivante :
def construire _arbre(data_train , sep_ max, taille min , p_var):
arbre = separe(data_train , p_var)
construit(arbre , sep _ max, taille min , p_var, Î)
return arbre
10/12
avec :
- data_train des données dont on connaît déjà la classe ;
- Sep_max : le nombre de séparations maximales pouvant être effectuées avant de
placer une
feuille ;
- taille _min : le nombre de données minimales sous lequel on impose de mettre
une feuille
plutôt que de séparer les données en deux ;
- p_var : le nombre de valeurs à tirer aléatoirement pour le calcul de l'indice
de concentration
de Gini.
La construction de l'arbre est réalisée récursivement avec la fonction
construit(arbre, sep_max,
taille _ min, p_var, ind_rec) après avoir créé un arbre initial à deux branches
avec la fonction
separe.
La fonction construit prend en argument entre autres :
- arbre : structure de type noeud constituée de 4 éléments [ind, val, gauche,
droite];
- Sep_max;
- taille_min;
- p_var;
- ind_rec : l'indice de récursivité donnant le nombre de séparations déjà
effectuées.
La fonction separe peut renvoyer un groupe gauche ou droite vide ([]), cela
signifie qu'il n'y à
pas eu de critères permettant de séparer les données en deux groupes. Dans ce
cas, 1l faut calculer la
feuille terminale associée au groupe non vide et imposer la valeur de cette
feuille à droite et à gauche.
Les variables gauche et droite peuvent être des nombres 0 ou 1 (feuilles) ou
des structures de type
noeud (cf. question Q10).
Dans la fonction récursive, la variable arbre de type noeud est modifiée au
cours des appels succes-
SIfs.
Q16. Compléter les conditions numérotées 1 à 4 de la fonction récursive
construit donnée sur le
document réponse.
IIL.3 - Test d'une prédiction sur un arbre simple
À partir des fonctions présentées précédemment, il est possible de construire
un arbre de décision
classique en prenant en compte toutes les colonnes disponibles pour faire les
séparations. Pour le cas
que l'on traite, on prendra ainsi p_var = 60.
Pour tester les performances de prédiction dans ce cas, on utilise un jeu de
100 données connues pour
construire l'arbre. On réalise ensuite une prédiction sur un jeu de 50 données
(non utilisées pour la
construction mais dont on connait la classe) : pour chaque donnée, on parcourt
l'arbre jusqu'à arriver
sur une feuille qui donnera le groupe prédit. On compare cette prédiction à la
classe connue. On
compte le nombre de succès pour en déduire un taux de réussite. On recommence
cette analyse en
faisant une nouvelle construction d'arbre à partir des 100 données (ce qui
correspond aux prédictions
notées 1, 2 et 3). On étudie également l'influence du nombre de données pour
construire l'arbre en
effectuant la même démarche pour des jeux de 125 et 150 données.
Arbre construit à partir
de 100 données
Arbre construit à partir
de 125 données
Arbre construit à partir
de 150 données
Test de prédiction 1 | 79 14 % 88 %
Test de prédiction 2 | 76 % 718 % 84 %
Test de prédiction 3 | 74 % 718 % TT %
Temps moyen 0,425 0,645 0,865
Tableau 1 - Pourcentages de réussite obtenus et temps de prédiction
11/12
Le tableau 1 liste une synthèse des pourcentages de réussite obtenus ainsi que
le temps pour réaliser
une prédiction.
Q17. Au vu de ces quelques résultats d'analyse de la méthode des arbres de
décision, indiquer de
quels problèmes semblent souffrir cette méthode.
IIL.4 - Algorithme des forêts aléatoires : « random forest »
Pour palier les problèmes observés précédemment, on utilise un algorithme des
forêts aléatoires.
L'idée de l'algorithme des forêts aléatoires est de construire plusieurs arbres
de décision (n_arbres)
basés sur une vision partielle du problème en se limitant à quelques variables
(d'où l'introduction de
la fonction indice_aleatoire dans la partie précédente). En pratique, on
utilise la racine carrée du
nombre de variables, soit 7 au lieu de 60 dans notre exemple.
Ensuite, on réalise une prédiction sur les différents arbres construits et on
associe à la donnée à classer
la classe majoritaire issue des différentes prédictions élémentaires.
On suppose que l'on dispose des fonctions : construire_foret qui renvoie une
liste d'arbres (non
détaillée 1c1) et prediction qui pour un arbre connu et une donnée renvoie la
valeur de sa classe.
Q18. Compléter les 4 instructions manquantes de la fonction récursive
prediction(arbre,donnee) donnée sur le document réponse qui prend en argument
un arbre de décision noté arbre de type noeud et une donnée à classer donnee.
La fonction
isinstance(var,type) renvoie True si var est du type type.
On note :
- data_train, les données d'entraînement de l'algorithme qui vont servir à
construire les arbres ;
- data_test, les données permettant de tester l'efficacité de l'algorithme en
comparant le clas-
sement proposé par rapport à la valeur connue.
Q19. Écrire une fonction random_forest(data_train, data_test, sep_max,
taille min, n_arbres, p_var) qui renvoie une liste contenant la classe de chaque
donnée contenue dans la variable data_test.
Conclusion
On réalise des tests de prédiction comme cela a été présenté en sous-partie
IIL.3.
Le tableau 2 liste une synthèse des pourcentages de réussite obtenus ainsi que
le temps pour réaliser
une prédiction avec une forêt de 20 arbres.
Arbre construit à partir
de 100 données
Arbre construit à partir
de 125 données
Arbre construit à partir
de 150 données
Test de prédiction 1 | 88 % 84 % 91
Test de prédiction 2 | 91 % 86 % 91
Test de prédiction 3 | 86 % 83 % 88 %
Temps moyen 0,235 0,355 0,55
Tableau 2 - Pourcentages de réussite et temps de prédiction pour une forêt de
20 arbres
Q20. Conclure sur l'intérêt de cet algorithme des forêts aléatoires.
FIN
12/12
IMPRIMERIE NATIONALE - 20 1166 - D'après documents fournis
| N
Numéro
d'inscription N
C Nom :
| N D Numéro
de table
CONCOURS >
COMMUN Prénom :
Née) le
Session: 2020
Épreuve de: Informatique
Emplacement
QR Code
+ Remplir soigneusement l'en-tête de chaque feuille avant de commencer à
composer
+ Rédiger avec un stylo non effaçable bleu ou noir
Consignes ° Ne rien écrire dans les marges (gauche et droite)
+. Numéroter chaque page (cadre en bas à droite)
* Placer les feuilles A3 ouvertes, dans le même sens et dans l'ordre
PSISIN
DOCUMENT RÉPONSE
Q1 - Instruction pour la création de la variable temps
Q2 - Fonction chirp(temps,f0,Deltafe,T,E0@)
Q3 - Instructions pour stocker f, t, S. Taille de f, t, S en fonction de net N
1/8
Q4 - Intérêt du
- Fonction w(t,f,eta)
- Fonction envelo
e(eta,sS,
,dt,df)
218
Q7 - Fonction normalisation(P)
Q8 - Valeur de la variable donnees (deux premières lignes lues seulement)
Q9 - Taille mémoire minimale pour stocker les données
Q10 - Représention en Python de l'arbre de la figure 5(a)
Q11 - Classification de la donnée. Justification
318
12 - Fonction indices_aleatoires(m,p_var)
13 - Fonction [gauche, droite
test_separation(ind,val,donnees)
418
| N
Numéro
d'inscription N
C Nom :
| N D Numéro
de table
CONCOURS >
COMMUN Prénom :
Née) le
Filière: PSI Session: 2020
Épreuve de: Informatique
Emplacement
QR Code
+ Remplir soigneusement l'en-tête de chaque feuille avant de commencer à
composer
+ Rédiger avec un stylo non effaçable bleu ou noir
Consignes ° Ne rien écrire dans les marges (gauche et droite)
+. Numéroter chaque page (cadre en bas à droite)
* Placer les feuilles A3 ouvertes, dans le même sens et dans l'ordre
PSISIN
Q14 - Compléter les instructions notées 1 à 5
def Gini_groupes (groupes ):
#nombre de données total
n_ donnees -- #Hinstructionl
gini = 0.0 #somme pondérée des indices Gini de chaque groupe
for donnees in groupes:
taille = len(donnees) #taille d'un groupe
if taille != 0:
gini_gr = 0.0
for val in [0,1]:
p=0
for ligne in donnees
if ligne[-1] == val:
#instruction2
#H#instruction3
gini_gr += #instructiond4
#ajout de gini_gr avec Île poids relatif
gini += #instructions
return gini
(C) | 518
NE RIEN ÉCRIRE DANS CE CADRE
Q15 - Fonction feuille(data)
Q16 - Compléter les conditions numérotées 1 à 4 de la fonction récursive
construit
def construit(arbre , sep _ max, taille min , p_var, ind_rec ):
gauche, droite = arbre[2], arbre[3]
#conditionli
#condition2
#condition3
ind_rec+1l)
#condition4
if
valeur = feuille (gauche + droite)
arbre[2] = valeur
arbre[3] = valeur
return
if
arbre[2], arbref[3] = feuille(gauche), feuille (droite)
if
arbre[2] = feuille (gauche)
else :
arbre[2] = separe(gauche, p_var)
construit(arbre[2], sep_ max, taille min , p_var,
if
arbre[3] = feuille(droite)
else :
arbre[3|] = separe(droite , p_var)
construit(arbre[3], sep_ max, taille min , p_var,
ind_rec+1l)
6/8
Q17 - Problèmes de la méthode
Q18 - Compléter les 4 instructions manquantes
def prediction(arbre , donnee ):
[ind , val , gauche , droite ]=arbre
if donneel[ind] < val: if isinstance(gauche, list ): else : else : if isinstance(droite , list ): else : #H#instructionli #Hinstruction2 #H#instruction3 #H#instructiond4 Q19 - Fonction random_forest(data_train, data_test, sep_ max, taille _ min, n_arbres, p_var) (espace libre page suivante) 118 Q20 - Conclusion sur l'intérêt de l'algorithme des forêts aléatoires ANNEXE Rappels des syntaxes en Python Remarque : sous Python, l'import du module numpy permet de réaliser des opérations pratiques sur les ta- bleaux : from numpy import *. Les indices de ces tableaux commencent à 0. Python L=[1,2,3] (liste) v=array([1,2,3]) (vecteur) accéder à un élément V[0] renvoie 1 (L[O] également) ayouter un élément L.append(5) uniquement sur les listes séquence équirépartie quelconque de 0 à I0.I (exclus) par pas de 0.1 tableau à une dimension arange(®6,160.1,6.1) définir une chaîne de caractères mot="Python' taille d'une chaîne len(mot) extraire des caractères mot[2:7] éliminer le \n en fin d'une ligne ligne.str1ip() découper une chaîne de caractères selon un ca- ractère passé en argument. On obtient une liste | mot.split(",") qui contient les caractères séparés with open("'nom_fichier",'r'}) as file: ouverture d'un fichier en lecture | | | instructions avec file 8/8