Adloun

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.