Reprendre l'avertissement du cours sur les grandeurs non comparables
Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 8 — Dichotomie, voisins et gloutons · Les voisins, pour de vrai
Énoncé
Reprendre l'avertissement du cours sur les grandeurs non comparables. Construire un jeu où une coordonnée est une taille (autour de ) et l'autre un nombre de frères et sœurs (de à ), puis montrer que la normalisation change la prédiction.
Corrigé
BRUT = [((168, 0), "A"), ((169, 0), "A"), ((167, 1), "A"),
((150, 5), "B"), ((185, 5), "B"), ((190, 4), "B")]
def normaliser(exemples):
"""Ramene chaque coordonnee dans [0, 1]. Precondition : au moins deux
valeurs distinctes par coordonnee."""
d = len(exemples[0][0])
mini = [min(c[i] for c, _ in exemples) for i in range(d)]
maxi = [max(c[i] for c, _ in exemples) for i in range(d)]
for i in range(d):
assert maxi[i] > mini[i], "coordonnee constante"
return [(tuple((c[i] - mini[i]) / (maxi[i] - mini[i]) for i in range(d)), cl)
for c, cl in exemples], mini, maxi
def normaliser_point(p, mini, maxi):
return tuple((p[i] - mini[i]) / (maxi[i] - mini[i]) for i in range(len(p)))
Le résultat, sur le point avec .
norm, mini, maxi = normaliser(BRUT)
point = (168, 5)
pn = normaliser_point(point, mini, maxi)
assert knn(BRUT, point, 3) == "A" # la taille ecrase tout
assert knn(norm, pn, 3) == "B" # la normalisation CHANGE la prediction
Les distances brutes valent , et pour les , contre à pour les : les tailles sont séparées de vingt à quarante unités, quand les fratries ne diffèrent que de cinq. Une fois les deux coordonnées ramenées à , l'ordre s'inverse complètement.
La démonstration la plus parlante tient en deux lignes :
assert knn(BRUT, (168, 0), 3) == knn(BRUT, (168, 5), 3) == "A"
assert knn(norm, normaliser_point((168, 0), mini, maxi), 3) == "A"
assert knn(norm, normaliser_point((168, 5), mini, maxi), 3) == "B"
Sans normalisation, avoir zéro ou cinq frères et sœurs ne change rien à la prédiction : la seconde coordonnée ne pèse littéralement rien. L'algorithme n'a pas tort — il mesure exactement ce qu'on lui a donné à mesurer. C'est le choix des unités qui décide de ce qu'il « voit », et ce choix est celui du programmeur, pas de la machine.
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.