L'unité change le voisin
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 26 — Apprentissage automatique
Énoncé
On classe des objets par leur masse et leur longueur. Deux exemples : étiqueté « petit », étiqueté « gros ». On veut classer par le plus proche voisin, distance euclidienne. Que répond l'algorithme ? Et si l'on exprime les masses en grammes ?
Corrigé
En (kg, mm) : et . Le plus proche est : l'algorithme répond gros.
En (g, mm) : , , , d'où et . Le plus proche est : l'algorithme répond petit.
La même donnée, la même distance, deux réponses opposées. La distance euclidienne additionne des carrés d'écarts exprimés dans leurs unités : elle n'a aucune raison d'être invariante par changement d'échelle. En kilogrammes, la masse pèse trop peu et la longueur décide seule ; en grammes, c'est l'inverse.
La parade est le centrage-réduction : on remplace chaque coordonnée par , où et sont la moyenne et l'écart type de cette coordonnée sur les données d'entraînement. Les valeurs réduites ne portent plus d'unité, et le calcul refait sur les données réduites donne et — les mêmes deux nombres en kilogrammes et en grammes, comme il se doit.
(* Renvoie la fonction qui centre et réduit un point, calibrée sur pts.
Précondition : pts non vide, aucun écart type nul. *)
let reduire pts =
let d = Array.length (List.hd pts) in
let n = float_of_int (List.length pts) in
let moy = Array.init d (fun j ->
List.fold_left (fun s p -> s +. p.(j)) 0.0 pts /. n) in
let ec = Array.init d (fun j ->
sqrt (List.fold_left (fun s p -> s +. (p.(j) -. moy.(j)) ** 2.0) 0.0 pts /. n)) in
fun p -> Array.init d (fun j -> (p.(j) -. moy.(j)) /. ec.(j))
Deux pièges dans ces six lignes. Le premier : et se calculent sur les données d'entraînement seules, et la même fonction s'applique ensuite au test — les calculer sur l'ensemble complet ferait fuiter de l'information du test vers l'entraînement, et le problème 26.4 montre ce que cela coûte. Le second : un écart type nul, c'est-à-dire une coordonnée constante, produit une division par zéro ; cette coordonnée n'apporte rien et doit être retirée.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.