TP-TD
TP-TD
TP-TD
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Introduction à la Programmation par Objets<br />
(L1-IPO)<br />
<strong>TP</strong> n° 11, Printemps 2012<br />
REGRESSION LINEAIRE SUR UN NUAGE DE POINTS.<br />
Un statisticien s’intéresse aux nuages de points : il dispose d’une liste de données entières<br />
(x ; y) qu’il représente dans un plan, et va essayer de trouver une droite d’ajustement pour ce<br />
nuage. Il utilise à cet effet une droite de régression linéaire :<br />
Rappels mathématiques. La droite a pour équation y = ax + b. Il ne s’agit pas de<br />
démontrer des formules, nous allons vous les donner, en suivant la page Web :<br />
http://fr.wikipedia.org/wiki/Régression_linéaire<br />
Il suffit bien entendu de connaître a et b pour tracer la droite. On commence par noter x la<br />
moyenne des x i , et y celle des y i . Le centre du nuage a pour coordonnées ( x, y). La variance<br />
V(x) des x i mesure la dispersion des abscisses :<br />
€<br />
€<br />
€<br />
€<br />
€ cov(x,y) =<br />
V (x) = 1 ∑ (x i − x) 2<br />
n<br />
Enfin, la covariance cov(x,y) du nuage s’obtient par la formule :<br />
€<br />
1<br />
n<br />
i<br />
∑<br />
i<br />
( x i − x)<br />
y i − y<br />
( )<br />
Ah oui, la droite cherchée passe par le centre du nuage, et son coefficient directeur est<br />
cov(x, y)<br />
V (x)<br />
. Donc son équation est y =<br />
cov(x, y)<br />
V (x)<br />
cette droite pour la tracer en Processing…<br />
( x − x) +<br />
€<br />
y. Il suffit de connaître deux points de<br />
€<br />
€<br />
Ouf. Merci aux statisticiens !<br />
€<br />
€<br />
€
Travail informatique. Vous allez travailler uniquement dans Processing, où vous allez<br />
programmer une classe Nuage, puis une animation qui fera afficher le nuage et sa droite de<br />
régression.<br />
Préliminaire : ouvrez un nouveau sketch vierge dans Processing. Sauvez-le immédiatement<br />
sous le nom « regression ». Demandez un nouvel onglet et donnez-lui le nom « Nuage.java ».<br />
Vous programmerez la classe Nuage dans l’onglet « Nuage.java » en Java pur, et l’animation<br />
se fera en Processing dans l’onglet « regression ». Notez bien cette manière de faire ! Le<br />
travail sur les listes se fera en Java pur de manière à ne pas avoir à utiliser des casts… Notez<br />
aussi que Processing n’aime pas les accents dans les noms de fichiers…<br />
1. La classe Nuage [onglet « Nuage.java »]<br />
• Elle importera les classes ArrayList, Point et Random.<br />
• Un nuage sera représenté par une liste de points. Utilisez la classe Point de l’API.<br />
• Le constructeur prendra en paramètre la taille du canvas. Dans le constructeur, prenez un<br />
nombre aléatoire n de points (entre 30 et 50 points), et initialisez la liste avec n points tirés au<br />
hasard dans le canvas.<br />
• Programmez des méthodes calculant les moyennes, variances et covariance. Posez-vous le<br />
problème d’éviter de calculer plusieurs fois la même moyenne !<br />
• Programmez une méthode regression() calculant les coefficients a et b de la droite de<br />
régression y = ax+b et les retournant en résultat sous la forme d’un tableau {a,b}.<br />
N.B. Vous serez peut-être amenés lors de la section suivante, à compléter cette classe par de<br />
nouvelles méthodes auxquelles vous n’aviez pas pensé…<br />
2. La partie graphique [onglet « regression »]<br />
On définit un nuage n dans un canvas 300 × 300 et on l’affiche ainsi que sa droite de<br />
régression. Et tant qu’on y est, on peut en même temps afficher les caractéristiques<br />
statistiques du nuage (moyenne, variance, etc) en mode texte. Ceci est donc un dessin<br />
statique, pas une animation. Vous serez amenés à définir une fonction setup() ainsi que<br />
d’autres fonctions…<br />
EXERCICE COMPLEMENTAIRE<br />
On crée une animation avec un calcul et un affichage incrémental. On ajoute des points dans<br />
le canvas en cliquant avec la souris. A chaque clic, un nouveau point est affiché à l’endroit du<br />
clic, et la droite de régression s’ajuste automatiquement. Un peu plus compliqué mais cool…
Introduction à la Programmation par Objets<br />
(L1-IPO)<br />
<strong>TD</strong> n° 11, Printemps 2012<br />
Exercice 11.1 a) Programmez une classe Etudiant. Chaque étudiant aura un nom (une<br />
chaîne de caractères) et une liste de notes approchées sur 20. On pourra ajouter une note,<br />
demander la moyenne approchée d’un étudiant, et on programmera aussi une méthode<br />
renvoyant à la fois la note la plus basse et la note la plus haute (par exemple groupées dans<br />
un tableau à deux éléments).<br />
b) Programmez une classe Promotion. Un objet de cette classe modélisera un ensemble<br />
d’étudiants. On pourra :<br />
- ajouter un étudiant avec ses notes.<br />
- faire afficher la liste de tous les étudiants avec leur moyenne.<br />
- chercher la moyenne de l’étudiant dont on donne le nom (cf. le N.B. ci-dessous).<br />
c) Ecrivez une classe TestPromotion, comprenant une unique méthode de classe go(), sans<br />
résultat. Cette méthode initialisera avec des notes aléatoires entre 5 et 18 la promotion dont<br />
les étudiants ont pour noms : ”Adrien”, ”Carla”, ”Jiao”, ”Kevin”, ”Mehdi” et ”Sorayya”. On<br />
évitera bien entendu d’écrire six fois le même code d’initialisation… Elle affichera ensuite<br />
celui ou celle qui a la meilleure moyenne.<br />
N.B. Dans la recherche de la moyenne d’un étudiant dont on donne le nom, on pourra utiliser<br />
la méthode indexOf de la classe ArrayList, que l’on trouve dans l’API. Si vous avez<br />
le temps, essayez de ne PAS utiliser la méthode indexOf… On rappelle que l’égalité de<br />
deux chaînes de caractères utilise la méthode d’instance equals de la classe String.<br />
Exercice 11.2 a) Ecrire une méthode de classe listeVersTableau(liste) dont le paramètre<br />
liste représente une liste d’objets de type Integer, et retournant un tableau contenant les<br />
éléments de cette liste, sous la forme d’entiers usuels, dans le même ordre.<br />
b) Ecrire la méthode inverse tableauVersListe(tab).