<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/k plus proches voisins (k-NN)</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Algorithme des k plus proches voisins (k-NN) : exemple<br/>
d'algorithme d'apprentissage supervisé. Distance entre<br/>
points, vote majoritaire, choix de k, applications,<br/>
forces et limites.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q01 : k-NN : qu'est-ce que c'est ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait l'algorithme des <strong>k plus proches voisins</strong><br/>
(k-NN, <em>k-Nearest Neighbors</em>) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Apprentissage supervisé : on dispose d'exemples<br/>
étiquetés (avec leur classe connue), on<br/>
apprend à prédire la classe pour de nouveaux<br/>
exemples.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Prédire la classe d'un point selon ses voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est un algorithme<br/>
d'<strong>apprentissage supervisé</strong> par<br/>
mémorisation. On classe un nouveau point<br/>
selon ses voisins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cherche un élément dans une liste triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la recherche dichotomique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trie une liste par ordre croissant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec le tri.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Mesure la complexité d'un programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mesure de<br/>
complexité algorithmique<br/>
n'a aucun rapport avec<br/>
l'algorithme des k plus<br/>
proches voisins.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q02 : Des mesures lues dans un fichier CSV</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour préparer un k-NN, on lit le fichier fruits.csv avec<br/>
csv.reader. Sa première ligne contient 102,7,pomme et devient<br/>
la liste ligne. Quel est le type de ligne[0] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une table importée depuis un fichier CSV ne contient que du texte.<br/>
Avant d'appliquer k-NN, on convertit les colonnes numériques avec<br/>
float pour pouvoir calculer les distances.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un entier, car la valeur 102 n'a pas de partie décimale</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : csv.reader ne convertit aucune valeur, quelle que soit<br/>
son écriture. ligne[0] est la chaîne '102', qu'il faut<br/>
convertir avec int ou float avant de calculer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un p-uplet de trois caractères, un par chiffre de 102</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la ligne est découpée aux virgules, pas chiffre par<br/>
chiffre. ligne[0] est la chaîne entière '102'.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un flottant, car le module csv convertit les nombres qu'il lit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le module csv ne devine pas le type des valeurs, il<br/>
renvoie toujours des chaînes. ligne[0] vaut '102', pas<br/>
102.0.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une chaîne, à convertir avant de calculer une distance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : csv.reader découpe chaque ligne en chaînes de<br/>
caractères, sans rien convertir : ligne[0] vaut '102'. Pour<br/>
calculer une distance, il faut écrire float(ligne[0]) ; sinon la<br/>
soustraction avec un nombre provoque TypeError.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q03 : Distance euclidienne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment calcule-t-on la <strong>distance euclidienne</strong><br/>
entre deux points A=(x_A, y_A) et B=(x_B, y_B) du plan ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette formule se généralise en dimension n :<br/>
d = \\sqrt{\\sum_{i=1}^{n}(b_i - a_i)^2}.<br/>
Pour comparer des distances, on peut omettre<br/>
la racine carrée.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>d = √(x_B - x_A) + (y_B - y_A)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans les carrés, les écarts<br/>
négatifs se compensent et l'expression<br/>
sous la racine peut être négative.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>d = (x_B - x_A)² + (y_B - y_A)²</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le <strong>carré</strong> de la distance,<br/>
il manque la racine carrée. Comparer des<br/>
carrés de distances reste possible pour<br/>
k-NN, mais ce n'est pas la distance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>d = |x_B - x_A| + |y_B - y_A|</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la distance de Manhattan<br/>
(somme des écarts absolus), une autre<br/>
distance possible, mais pas l'euclidienne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>d = √(x_B - x_A)² + (y_B - y_A)²</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : formule de Pythagore.<br/>
C'est la distance « à vol d'oiseau »<br/>
entre les deux points.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q04 : Vote majoritaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une fois les k plus proches voisins<br/>
identifiés, comment k-NN détermine-t-il la<br/>
classe à attribuer ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variante : <strong>vote pondéré</strong> par la distance<br/>
(les voisins plus proches comptent plus).<br/>
Permet de gérer les ex æquo.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Par vote majoritaire parmi les k voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si parmi les 5 voisins<br/>
les plus proches, 3 sont de la classe A et<br/>
2 de la classe B, on prédit A.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En choisissant la classe du voisin le plus proche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est k-NN avec k = 1, cas particulier. En<br/>
général on utilise plusieurs voisins pour<br/>
plus de robustesse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En faisant la moyenne des classes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne fait pas la moyenne d'une<br/>
classe (c'est une catégorie, pas un<br/>
nombre).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Au hasard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : k-NN est déterministe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q05 : Choix de k</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi prend-on souvent k <strong>impair</strong> quand<br/>
on classe en deux classes ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour trois classes ou plus, un<br/>
k impair n'évite pas<br/>
forcément les ex æquo : trois<br/>
classes peuvent par exemple<br/>
obtenir chacune k/3 voix.<br/>
On peut alors recourir à la<br/>
classe du voisin le plus<br/>
proche, ou à un vote pondéré<br/>
par la distance.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les nombres impairs sont plus rapides à calculer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun lien n'existe entre la<br/>
parité d'un nombre et la<br/>
rapidité de calcul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que k pair ne fonctionne pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ça fonctionne, mais on doit gérer<br/>
les ex æquo.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour éviter les égalités lors du vote</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec k pair (par exemple<br/>
k = 4), on peut avoir 2 votes pour chaque<br/>
classe → indécision. Avec k impair (k = 5),<br/>
impossible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune raison particulière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette parité répond au<br/>
contraire à un besoin<br/>
technique précis : éviter<br/>
les égalités lors du<br/>
vote, comme expliqué dans<br/>
la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q06 : Exemple typique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lequel de ces problèmes est un <strong>bon candidat</strong><br/>
pour l'algorithme k-NN ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Autres exemples : reconnaissance de<br/>
chiffres manuscrits, classification de<br/>
fleurs (jeu de données Iris), recommandation<br/>
de films.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Calculer la racine carrée exacte d'un nombre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas un problème d'apprentissage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier une liste de nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas un problème de<br/>
classification.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compresser un fichier pour gagner de la place</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La compression de fichiers<br/>
est une tâche très<br/>
différente, sans rapport<br/>
avec la classification.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Reconnaître un spam à partir d'exemples</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tâche de classification<br/>
binaire (spam / non spam). On peut<br/>
comparer le mail aux exemples connus<br/>
selon des caractéristiques (mots-clés,<br/>
longueur, etc.).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q07 : Pas d'entraînement explicite</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle particularité de k-NN le distingue<br/>
d'autres algorithmes d'apprentissage ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Conséquence : prédiction lente quand le jeu<br/>
d'entraînement est gros (il faut calculer la<br/>
distance à tous les exemples). Compromis :<br/>
stockage important, calcul à la prédiction.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il invente de nouveaux exemples au cours de la prédiction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun exemple n'est<br/>
inventé. L'algorithme se<br/>
contente de comparer le<br/>
point à classer aux<br/>
exemples déjà connus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il fonctionne sans aucune donnée d'entraînement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Au contraire, l'algorithme<br/>
a besoin d'exemples<br/>
étiquetés pour pouvoir<br/>
comparer le nouveau<br/>
point.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Presque aucun entraînement, calcul à la prédiction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : k-NN est un algorithme<br/>
dit « paresseux ». Pas de modèle interne ;<br/>
tout le travail est fait à la prédiction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il a une phase d'entraînement très longue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse. La phase<br/>
d'entraînement consiste juste à<br/>
<strong>mémoriser</strong> les exemples.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q08 : Squelette de l'algorithme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la <strong>structure générale</strong> de<br/>
l'algorithme k-NN pour classer un nouveau<br/>
point p ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>En Python, les trois premières étapes s'écrivent<br/>
par exemple :<br/>
``python<br/>
def cle(couple):<br/>
    return couple[0]</p>
<p>distances = [(dist(p, e), c) for (e, c) in exemples]<br/>
distances = sorted(distances, key=cle)<br/>
voisins = [distances[i] for i in range(k)]<br/>
``</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>1. Calculer la distance de p à chaque exemple connu.<br/>
2. Trier les exemples par distance croissante.<br/>
3. Garder les k premiers.<br/>
4. Retourner la classe majoritaire parmi ces k voisins.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : algorithme en quatre<br/>
étapes claires. Les étapes 1 et 2<br/>
dominent le coût.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1. Calculer la distance de p à chaque exemple connu.<br/>
2. Trier les exemples par distance croissante.<br/>
3. Garder les k premiers.<br/>
4. Retourner la classe du plus proche d'entre eux.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : retourner la classe du seul plus<br/>
proche voisin revient à prendre k = 1 ; le<br/>
vote majoritaire parmi les k voisins est<br/>
justement ce qui rend k-NN robuste au<br/>
bruit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1. Calculer la moyenne des exemples de chaque classe.<br/>
2. Calculer la distance de p à chacune de ces moyennes.<br/>
3. Garder la moyenne la plus proche.<br/>
4. Retourner sa classe.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un autre algorithme (le<br/>
plus proche centre). k-NN ne calcule<br/>
aucune moyenne : il compare p aux<br/>
exemples eux-mêmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1. Calculer la distance de p à chaque exemple connu.<br/>
2. Trier les exemples par distance décroissante.<br/>
3. Garder les k premiers.<br/>
4. Retourner la classe majoritaire parmi ces k voisins.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trié par distance décroissante,<br/>
les k premiers sont les k exemples les<br/>
plus <strong>éloignés</strong> de p, l'inverse de ce<br/>
que l'on veut.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q09 : Paramètre k</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que se passe-t-il si l'on prend <strong>k = 1</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choix de k : compromis. k trop petit →<br/>
sensibilité au bruit. k trop grand → frontières<br/>
lissées, perte de précision locale. On choisit<br/>
souvent k empiriquement.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La classe du seul voisin, très sensible au bruit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un seul exemple aberrant<br/>
peut fausser la prédiction. Augmenter k<br/>
rend la décision plus robuste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme ne fonctionne pas avec k = 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le choix k = 1 est tout<br/>
à fait valide d'un point<br/>
de vue algorithmique. Il<br/>
est simplement peu<br/>
robuste face au bruit<br/>
des données.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La prédiction est plus stable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse. k = 1 est très<br/>
sensible au bruit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La complexité du calcul devient alors logarithmique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le coût d'un calcul de<br/>
prédiction ne dépend pas<br/>
du choix de k : il<br/>
reste linéaire en<br/>
N (nombre d'exemples).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q10 : Trace simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Avec k = 3, on classe un nouveau point P. Ses<br/>
3 plus proches voisins ont les classes : A, B,<br/>
A. Quelle classe prédit k-NN pour P ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le vote se programme simplement : un dictionnaire compte les<br/>
occurrences de chaque classe parmi les voisins, puis on retient<br/>
la classe qui a le plus grand compte.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>B (le plus proche)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait k = 1. Avec k = 3, on<br/>
fait un vote majoritaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux à la fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : k-NN renvoie une seule classe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>A (deux votes contre un pour B)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : vote majoritaire. A<br/>
obtient 2 votes, B obtient 1. La classe<br/>
prédite est A.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune des deux (égalité)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'y a pas d'égalité (2 vs 1).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q11 : Code distance</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code calcule correctement la <strong>distance euclidienne</strong> entre deux points 2D représentés<br/>
comme tuples a = (xa, ya) et b = (xb, yb) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Astuce : pour comparer des distances, on<br/>
peut omettre la racine carrée (la fonction<br/>
racine est croissante). Plus rapide.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>((a[0] - b[0]) <strong> 2 + (a[1] - b[1]) </strong> 2) ** 1/2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de priorité : <strong> est prioritaire<br/>
sur /, donc l'expression vaut<br/>
(...) </strong> 1 / 2, la moitié du carré de la<br/>
distance. Il faut <strong> 0.5 ou </strong> (1/2).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>abs(a[0] - b[0]) + abs(a[1] - b[1])</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la distance de Manhattan<br/>
(|Δx| + |Δy|), pas l'euclidienne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a[0] <em> b[0] + a[1] </em> b[1]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le produit scalaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>((a[0] - b[0]) <strong> 2 + (a[1] - b[1]) </strong> 2) ** 0.5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Pythagore en Python.<br/>
** 0.5 calcule la racine carrée. Variante :<br/>
math.sqrt(...).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q12 : Sélection des voisins</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour trouver les k plus proches voisins d'un<br/>
point P parmi N exemples, quelle approche est<br/>
la plus simple ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Des méthodes plus rapides existent pour de très grands jeux de<br/>
données, mais l'approche directe suffit pour comprendre<br/>
l'algorithme.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Calculer la moyenne des exemples</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas le rôle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune solution simple n'existe vraiment pour ce problème</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Plusieurs solutions<br/>
existent au contraire ;<br/>
la plus simple est<br/>
précisément celle qu'on<br/>
vient de décrire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Calculer les distances, trier, garder les k premiers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : simple à implémenter. On calcule les N distances,<br/>
on les trie par ordre croissant et on garde les k premières.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Choisir k exemples au hasard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas k-NN.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q13 : Le plus proche en une seule passe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Avec k = 1, il suffit de trouver le plus proche voisin. On propose<br/>
(la fonction dist(a, b) renvoie la distance entre deux points) :</p>
<p>`<code>python<br/>
def plus_proche(p, exemples):<br/>
    # exemples : liste non vide de couples (point, classe)<br/>
    d_min = 0<br/>
    classe = exemples[0][1]<br/>
    for (x, c) in exemples:<br/>
        if dist(p, x) &lt; d_min:<br/>
            d_min = dist(p, x)<br/>
            classe = c<br/>
    return classe<br/>
</code>`</p>
<p>Que renvoie cette fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour chercher un minimum, on initialise avec une valeur réellement<br/>
atteinte, par exemple la distance au premier exemple, puis on<br/>
parcourt la liste en ne gardant que les valeurs strictement plus<br/>
petites. Ce parcours séquentiel a un coût linéaire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La classe du premier exemple, quel que soit p</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une distance n'est jamais strictement inférieure<br/>
à 0, donc le test dist(p, x) &lt; d_min est toujours faux. classe<br/>
garde sa valeur initiale, la classe du premier exemple. Il<br/>
fallait initialiser d_min avec la distance au premier exemple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe du plus proche voisin de p</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'intention, mais d_min part de 0. Aucune<br/>
distance n'étant strictement inférieure à 0, la condition n'est<br/>
jamais vraie et la variable classe n'est jamais mise à jour.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe de l'exemple le plus éloigné de p</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le test &lt; ne retient jamais un exemple plus éloigné.<br/>
En fait il ne retient aucun exemple, car aucune distance n'est<br/>
strictement inférieure à la valeur initiale 0.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe du dernier exemple de la liste examinée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : classe n'est modifiée que si la condition est vraie,<br/>
ce qui n'arrive jamais ici. Elle garde donc la classe du premier<br/>
exemple, pas celle du dernier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q14 : Compromis sur k</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel <strong>risque</strong> y a-t-il à choisir un k <strong>trop grand</strong> (par exemple k = nombre total<br/>
d'exemples) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un k petit rend la prédiction sensible au bruit, par exemple à un<br/>
exemple mal étiqueté ; un k grand lisse les résultats mais efface<br/>
les différences locales. On choisit k selon la taille du jeu de<br/>
données.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun risque ; un grand k est toujours préférable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Au contraire, un k trop<br/>
grand pose un problème<br/>
spécifique, comme expliqué<br/>
dans la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le coût d'un calcul explose en n³</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le coût d'un calcul de<br/>
prédiction reste linéaire<br/>
en N : il ne dépend pas<br/>
du choix de k.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La prédiction tend vers la classe majoritaire globale</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si k = N, tous les<br/>
exemples votent. Le résultat est toujours<br/>
la classe la plus représentée dans tout<br/>
le jeu de données, indépendamment de la<br/>
position de P. Plus rien d'utile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme cesse alors complètement de fonctionner</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'algorithme continue de<br/>
fonctionner, mais le<br/>
résultat qu'il produit<br/>
n'est plus pertinent.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q15 : Rôle des données d'entraînement</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que sont les <strong>données d'entraînement</strong><br/>
(training set) pour k-NN ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>En pratique, on divise un jeu étiqueté en<br/>
<strong>train</strong> (entraînement) + <strong>test</strong><br/>
(évaluation) pour mesurer la performance<br/>
sans tricher.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les exemples étiquetés servant de comparaison</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : plus le jeu<br/>
d'entraînement est riche et représentatif,<br/>
meilleures sont les prédictions.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une formule mathématique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les données d'entraînement<br/>
ne sont pas une formule,<br/>
mais un ensemble<br/>
d'exemples concrets,<br/>
chacun étiqueté avec sa<br/>
classe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code source de l'algorithme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code source est une<br/>
notion distincte des<br/>
données d'entraînement,<br/>
qui sont les exemples<br/>
utilisés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les nouvelles données que l'on cherche à classer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont les données de <strong>test</strong><br/>
(à classer).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q16 : Code k-NN simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code en Python implémente correctement<br/>
k-NN pour classer un point p ?<br/>
`<code>python<br/>
# exemples = [(point, classe), ...]<br/>
# k entier, dist(a, b) renvoie la distance<br/>
# majoritaire(liste) renvoie la classe la plus<br/>
# fréquente de la liste<br/>
def premier(paire):<br/>
    return paire[0]<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Implémentation simple et lisible. La fonction majoritaire se<br/>
programme avec un dictionnaire qui compte les occurrences de<br/>
chaque classe.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
paires = [(dist(p, x), c) for (x, c) in exemples]<br/>
paires = sorted(paires, key=premier)<br/>
return paires[0][1]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on renvoie la classe du seul plus<br/>
proche voisin, comme si k valait toujours 1.<br/>
Le paramètre k est ignoré et le vote<br/>
majoritaire disparaît.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
voisins = [exemples[i][1] for i in range(k)]<br/>
return majoritaire(voisins)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on fait voter les k premiers<br/>
exemples <strong>dans l'ordre du tableau</strong>, sans<br/>
calculer aucune distance. Le vote ne porte<br/>
donc pas sur les voisins de p.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
paires = [(dist(p, x), c) for (x, c) in exemples]<br/>
paires = sorted(paires, key=premier)<br/>
voisins = [paires[i][1] for i in range(k)]<br/>
return majoritaire(voisins)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on calcule les distances, on trie par distance<br/>
croissante grâce à la fonction clé premier, on garde les k plus<br/>
proches, et majoritaire réalise le vote.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
paires = [(dist(p, x), c) for (x, c) in exemples]<br/>
paires = sorted(paires, key=premier, reverse=True)<br/>
voisins = [paires[i][1] for i in range(k)]<br/>
return majoritaire(voisins)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri <strong>décroissant</strong> fait voter<br/>
les k exemples les plus <strong>éloignés</strong> de p.<br/>
Il faut trier par distance croissante pour<br/>
retenir les plus proches voisins.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q17 : Des exemples rangés en dictionnaires</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Chaque fruit est rangé dans un dictionnaire, par exemple<br/>
e = {"masse": 152, "diametre": 5, "fruit": "pomme"}, et le<br/>
fruit à classer est p = {"masse": 150, "diametre": 7}. Quelle<br/>
expression donne le carré de la distance euclidienne entre e et<br/>
p ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Représenter un exemple par un dictionnaire rend le code lisible : on<br/>
écrit e["masse"] plutôt qu'un indice. Le calcul de distance reste<br/>
le même : somme des carrés des écarts, attribut par attribut.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>(e["masse"] - p["masse"]) <strong> 2 + (e["diametre"] - p["diametre"]) </strong> 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on accède à chaque attribut par sa clé et on<br/>
additionne les carrés des écarts, attribut par attribut :<br/>
2² + 2² = 8 pour cet exemple. Le champ "fruit" n'entre pas<br/>
dans le calcul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(e["masse"] - e["diametre"]) <strong> 2 + (p["masse"] - p["diametre"]) </strong> 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette expression soustrait le diamètre à la masse d'un<br/>
même fruit, ce qui n'a pas de sens. Il faut comparer la masse de<br/>
e à celle de p, puis le diamètre de e à celui de p ; ici on<br/>
obtiendrait 42 058 au lieu de 8.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(e[0] - p[0]) <strong> 2 + (e[1] - p[1]) </strong> 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un dictionnaire ne s'indexe pas par position mais par<br/>
clé. e[0] provoque KeyError, car 0 n'est pas une clé du<br/>
dictionnaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>e["masse"] - p["masse"] + e["diametre"] - p["diametre"]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les écarts ne sont ni mis au carré ni pris en valeur<br/>
absolue, si bien qu'ils peuvent se compenser. Ici<br/>
2 + (-2) = 0, comme si les deux fruits étaient identiques.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q18 : Coût de la prédiction</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Si l'on a N exemples d'entraînement, quel est<br/>
le <strong>coût</strong> d'une prédiction k-NN naïve ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Conséquence : la prédiction est lente sur de gros jeux<br/>
d'entraînement, car chaque nouveau point est comparé à tous les<br/>
exemples.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Constant, indépendant de N</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faut bien comparer le<br/>
nouveau point à chaque exemple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Linéaire en N (nombre d'exemples)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on calcule une distance par exemple, soit N<br/>
distances, comme dans un parcours séquentiel. Pour retenir les k<br/>
plus proches, on peut chercher k fois le minimum, ce qui reste<br/>
linéaire en N pour k fixé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Quadratique en N (double boucle)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne fait pas de double boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Logarithmique en N</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faut bien examiner tous les<br/>
exemples.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q19 : Forces et limites</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est une <strong>limite importante</strong> de k-NN ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Forces : simple, intuitif, sans phase d'entraînement. Limites :<br/>
lent à la prédiction, car chaque nouveau point est comparé à tous<br/>
les exemples, et sensible aux échelles des attributs.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il invente de nouveaux exemples au cours de la prédiction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'algorithme se contente<br/>
de comparer le nouveau<br/>
point aux exemples déjà<br/>
fournis. Il n'en invente<br/>
aucun.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il ne fonctionne qu'en dimension 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : k-NN se généralise à toute<br/>
dimension.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il ne peut pas faire de classification</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est précisément son rôle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Lent à la prédiction et sensible aux échelles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tous les calculs ont lieu à la prédiction. Pour un<br/>
million d'exemples décrits par de nombreux attributs, k-NN peut<br/>
devenir impraticable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q20 : Vote pondéré</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une variante de k-NN consiste à <strong>pondérer le vote</strong> des voisins. Pourquoi ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Vote uniforme = chaque voisin compte 1.<br/>
Vote pondéré = poids dépendant de la<br/>
distance. Variante classique du k-NN.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour économiser la mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La pondération n'a aucun<br/>
effet sur la consommation<br/>
mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour donner plus de poids aux voisins proches</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un voisin très proche<br/>
devrait peser plus qu'un voisin éloigné.<br/>
Améliore souvent la qualité des<br/>
prédictions et résout les égalités.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour rendre l'algorithme aléatoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette pondération reste<br/>
parfaitement déterministe.<br/>
Elle ne fait pas<br/>
intervenir le hasard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour ralentir intentionnellement tout le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun procédé de<br/>
pondération n'a pour but<br/>
de ralentir le<br/>
programme.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q21 : Trace détaillée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Avec k = 3, on classe un point P. Les 5<br/>
exemples les plus proches sont (par distance<br/>
croissante) : (1.0, classe A), (1.5, B), (2.0,<br/>
A), (3.0, A), (4.0, B). Quelle classe prédit<br/>
k-NN ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthode : trier par distance, garder les k<br/>
premiers, voter à la majorité. Les exemples<br/>
au-delà de k (4ᵉ et 5ᵉ ici) ne comptent pas.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Indéterminé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : k-NN est déterministe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>B</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : B n'a qu'un seul vote.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Égalité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'égalité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>A</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on garde les k = 3 plus<br/>
proches : (1.0, A), (1.5, B), (2.0, A).<br/>
Vote : A = 2, B = 1 → A gagne.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q22 : Un test réussi qui ne prouve rien</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction suivante doit prédire la classe de p par vote<br/>
majoritaire de ses k plus proches voisins (dist(a, b) renvoie la<br/>
distance euclidienne) :</p>
<p>``python<br/>
def premier(couple):<br/>
    return couple[0]</p>
<p>def predire(p, exemples, k):<br/>
    couples = [(dist(p, x), c) for (x, c) in exemples]<br/>
    couples = sorted(couples, key=premier)<br/>
    return couples[0][1]<br/>
`</p>
<p>Le test suivant passe sans erreur :</p>
<p><code>python<br/>
assert predire((0, 0), [((1, 0), "A"), ((5, 5), "B"), ((0, 2), "A")], 3) == "A"<br/>
</code>`</p>
<p>Que peut-on en conclure ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un bon jeu de tests contient des cas qui distinguent une fonction<br/>
correcte d'une fonction fausse. Pour k-NN, il faut au moins un cas<br/>
où la classe du plus proche voisin est minoritaire parmi les k<br/>
voisins.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Rien sur le vote : ce test donne A qu'on fasse voter 1 ou 3 voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la fonction renvoie la classe du seul plus proche<br/>
voisin et ignore k. Ce test ne le révèle pas, car le plus proche<br/>
voisin (1, 0) et la majorité des trois voisins désignent tous<br/>
deux A. Le test<br/>
predire((0, 0), [((1, 0), "A"), ((0, 2), "B"), ((2, 0), "B")], 3),<br/>
qui doit donner B, ferait apparaître l'erreur : la fonction<br/>
renvoie A.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le paramètre k est bien utilisé, le résultat correspondant au vote des 3 voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le résultat coïncide avec le vote des trois voisins<br/>
(A, A, B), mais la fonction ne fait aucun vote : elle renvoie<br/>
couples[0][1], la classe du plus proche. Le paramètre k<br/>
n'apparaît nulle part dans le corps.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le test est mal écrit : avec k = 3, la prédiction attendue serait B</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les trois voisins sont (1, 0) de classe A à distance 1,<br/>
(0, 2) de classe A à distance 2 et (5, 5) de classe B, plus<br/>
loin. Le vote donne A deux voix contre une, et le test attend bien<br/>
A.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction est correcte, puisque l'assertion ne déclenche pas d'erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le succès d'un test ne garantit pas la correction d'un<br/>
programme. Ici la fonction ignore k et renvoie la classe du seul<br/>
plus proche voisin ; ce test tombe simplement sur un cas où cela<br/>
donne le bon résultat.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q23 : Toujours le même voisin</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour éviter de trier toute la liste, on cherche k fois le plus<br/>
proche voisin dans une liste de couples (distance, classe) :</p>
<p>``python<br/>
def k_plus_proches(distances, k):<br/>
    retenus = []<br/>
    for etape in range(k):<br/>
        i_min = 0<br/>
        for i in range(len(distances)):<br/>
            if distances[i][0] &lt; distances[i_min][0]:<br/>
                i_min = i<br/>
        retenus.append(distances[i_min])<br/>
    return retenus</p>
<p>print(k_plus_proches([(3, "A"), (1, "B"), (2, "A"), (5, "B")], 3))<br/>
``</p>
<p>Qu'affiche ce programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chercher k fois un minimum est une bonne idée, à condition de ne pas<br/>
retrouver toujours le même élément : il faut exclure à chaque étape<br/>
les couples déjà retenus. L'erreur passe facilement inaperçue, car<br/>
les k « voisins » ont alors tous la même classe et le vote semble<br/>
fonctionner.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[(1, 'B'), (2, 'A'), (3, 'A')]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le résultat voulu par l'auteur, mais la liste<br/>
distances n'est jamais modifiée. Les trois recherches de minimum<br/>
portent sur les mêmes couples et trouvent toutes (1, 'B').</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[(1, 'B')]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle externe fait k = 3 tours et chacun ajoute un<br/>
couple à retenus. La liste finale contient donc trois couples,<br/>
tous égaux à (1, 'B').</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[(3, 'A'), (1, 'B'), (2, 'A')]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction ne recopie pas les trois premiers couples de<br/>
la liste, elle cherche à chaque étape celui de plus petite<br/>
distance, qui est toujours (1, 'B').</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[(1, 'B'), (1, 'B'), (1, 'B')]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque étape, la recherche du minimum parcourt<br/>
la même liste, qui n'a pas changé, et retrouve le couple<br/>
(1, 'B'). Il est donc ajouté trois fois. Il faudrait écarter les<br/>
couples déjà retenus, par exemple en mémorisant leurs indices.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q24 : k-NN pour la régression</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Peut-on adapter k-NN pour <strong>prédire un nombre</strong><br/>
(régression) au lieu d'une classe ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Algorithme <strong>k-NN régresseur</strong> : très utilisé<br/>
en pratique pour des prédictions de prix,<br/>
durées, scores. Même principe que la<br/>
classification.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, l'algorithme est strictement limité à la classification</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'algorithme s'adapte au<br/>
contraire très naturellement<br/>
au cas de la régression,<br/>
comme expliqué dans la<br/>
bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui, en remplaçant le vote par la moyenne des k voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si la cible est<br/>
numérique (prix d'une maison, note<br/>
attendue), la classe « majoritaire » est<br/>
remplacée par la moyenne des cibles des<br/>
k voisins. Idée générale identique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais à condition de doubler la valeur de k</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le passage à la régression<br/>
n'a aucun rapport avec un<br/>
doublement de k. C'est<br/>
la nature de l'agrégation<br/>
finale (vote majoritaire<br/>
ou moyenne) qui change.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, il faut nécessairement un autre algorithme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'algorithme des k plus<br/>
proches voisins s'étend<br/>
naturellement à la<br/>
régression, sans qu'il<br/>
soit nécessaire de le<br/>
remplacer.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur k-NN,<br/>
laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mnémonique : k petit = local, sensible au<br/>
bruit ; k grand = global, lissé. Choisir k<br/>
empiriquement par validation.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Plus k est grand, plus l'algorithme est sensible au bruit local.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : c'est<br/>
l'<strong>inverse</strong>. Avec k grand, le vote<br/>
intègre beaucoup de voisins, ce qui<br/>
<strong>lisse</strong> la décision et la rend<br/>
<strong>moins</strong> sensible aux exemples isolés<br/>
(bruit). Avec k petit (k = 1), un seul<br/>
exemple aberrant change la prédiction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distance euclidienne est un choix courant pour la mesure de proximité.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est la mesure standard, mais<br/>
d'autres existent (Manhattan, cosinus).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La phase d'entraînement se résume essentiellement à mémoriser les exemples.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : algorithme paresseux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>k-NN est un algorithme d'apprentissage supervisé.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : il apprend depuis des exemples<br/>
étiquetés.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q26 : Choix de la distance</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Outre la distance euclidienne, on rencontre<br/>
souvent la <strong>distance de Manhattan</strong><br/>
(|Δx| + |Δy|). Quel critère permet de choisir<br/>
entre ces deux distances ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Repère pratique : essayer plusieurs distances, mesurer la qualité<br/>
des prédictions sur des exemples dont on connaît la classe, et<br/>
retenir la meilleure.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distance de Manhattan est plus rapide à calculer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la différence est négligeable en pratique, les deux<br/>
distances demandant un calcul par coordonnée. La rapidité n'est<br/>
pas le critère qui motive le choix.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun critère, on choisit au hasard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le choix de la distance influence<br/>
fortement les résultats de l'algorithme. Il<br/>
faut le justifier en fonction du problème,<br/>
pas le tirer au hasard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distance euclidienne est toujours préférable car elle est plus précise</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces deux distances sont des choix<br/>
valides selon le contexte. Aucune n'est<br/>
universellement meilleure. Le choix dépend<br/>
de la nature des données et de la<br/>
structure de la proximité que l'on veut<br/>
modéliser.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Cela dépend du problème (espace continu ou grille)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la distance de Manhattan est moins sensible aux<br/>
valeurs aberrantes dans les coordonnées, car elle n'élève pas les<br/>
écarts au carré. Elle est aussi plus naturelle quand on se déplace<br/>
sur une grille, comme dans les rues d'une ville. La distance<br/>
euclidienne, qui mesure la ligne droite, convient bien aux espaces<br/>
géométriques classiques.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q27 : Classes déséquilibrées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut détecter une maladie rare avec k-NN.<br/>
Le jeu d'entraînement contient 95 % d'exemples<br/>
« sain » et 5 % d'exemples « malade ». Avec<br/>
k = 7, que va prédire l'algorithme pour<br/>
presque tous les nouveaux patients ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quand une classe est très rare, le vote majoritaire la prédit<br/>
rarement. Mesurer uniquement le taux global de bonnes prédictions<br/>
est trompeur : il faut aussi vérifier combien d'exemples de la<br/>
classe rare sont bien reconnus.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>« sain » presque toujours, les voisins étant surtout sains</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le piège classique des classes déséquilibrées.<br/>
Parmi les 7 voisins, les exemples « malade » sont presque toujours<br/>
minoritaires, et le vote donne « sain » même pour un patient malade.<br/>
Le taux global de bonnes prédictions peut sembler élevé (95 %) alors<br/>
que presque aucun malade n'est détecté.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>« malade » à 5 % des nouveaux patients, par symétrie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le comportement attendu<br/>
d'une distribution aléatoire. Or k-NN ne<br/>
tire rien au hasard ; il prédit en<br/>
fonction des voisins, et ceux-ci sont<br/>
principalement « sain ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>« malade » dans la majorité des cas, par sécurité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : k-NN n'a aucune logique de prudence sanitaire. Il vote<br/>
simplement à la majorité des voisins, et ceux-ci sont presque<br/>
toujours « sain ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une classe choisie au hasard, l'algorithme étant non déterministe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : k-NN est strictement<br/>
déterministe. Pour une même entrée et un<br/>
même jeu d'entraînement, il prédit<br/>
toujours la même classe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q28 : Calcul concret</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On classe le point P = (3, 4) avec k = 3 et<br/>
la distance euclidienne. Les exemples<br/>
étiquetés sont :<br/>
(0, 0, A), (6, 8, A), (2, 1, B),<br/>
(5, 4, B), (3, 0, A). Quelle classe<br/>
prédit k-NN ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthode systématique : (1) calculer la<br/>
distance de P à chaque exemple ; (2) trier par<br/>
distance croissante ; (3) garder les k<br/>
premiers ; (4) voter à la majorité. Sur les<br/>
petits jeux, refaire le calcul à la main est<br/>
le meilleur exercice de compréhension.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>B</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse. Distances calculées :<br/>
(0, 0) → 5 ; (6, 8) → 5 ; (2, 1) →<br/>
√10 ≈ 3,16 ; (5, 4) → 2 ; (3, 0) → 4.<br/>
Les 3 plus proches sont (5, 4, B),<br/>
(2, 1, B), (3, 0, A). Vote : B = 2,<br/>
A = 1 → B gagne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Indéterminé sans plus d'informations</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : toutes les informations<br/>
nécessaires sont fournies (point, k,<br/>
distance, exemples étiquetés). Le résultat<br/>
est parfaitement calculable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Égalité entre A et B</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec k = 3 (impair) et deux<br/>
classes, il ne peut pas y avoir égalité.<br/>
Le calcul donne B = 2 voix, A = 1 voix.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>A</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait correct si A obtenait<br/>
la majorité parmi les 3 plus proches.<br/>
Refaire le calcul des distances : (0, 0)<br/>
→ 5 ; (6, 8) → 5 ; (2, 1) → √10 ≈ 3,16 ;<br/>
(5, 4) → 2 ; (3, 0) → 4. Les 3 plus<br/>
proches sont (5, 4, B) (2), (2, 1, B)<br/>
(3,16) et (3, 0, A) (4).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q29 : La distance de Manhattan</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la distance de Manhattan, somme des écarts en valeur<br/>
absolue sur chaque coordonnée, entre les points (1, 2) et<br/>
(4, 6) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La distance de Manhattan compte les déplacements le long des axes,<br/>
comme dans une ville quadrillée ; elle se calcule sans racine<br/>
carrée.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 3 n'est que l'écart sur la première coordonnée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>12</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les écarts s'additionnent, ils ne se multiplient pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est la distance euclidienne, à vol d'oiseau ; la<br/>
distance de Manhattan additionne les écarts.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>7</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : |1 - 4| + |2 - 6| = 3 + 4 = 7.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q30 : Comparer des distances sans racine carrée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour trouver les plus proches voisins de (0, 0), un programme<br/>
compare les carrés des distances euclidiennes au lieu des<br/>
distances. Quelle valeur calcule-t-il pour le point (3, 4),<br/>
et pourquoi ce choix ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour classer des distances, le carré suffit : si d₁ &lt; d₂, alors<br/>
d₁² &lt; d₂². On économise une racine carrée par exemple.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>25, mais ce choix fausse l'ordre des voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la valeur est juste, mais l'ordre est préservé, puisque<br/>
la racine carrée est croissante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5, la distance elle-même, seule valeur exacte</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 est la distance, mais le programme s'en passe ;<br/>
son carré 25 suffit pour comparer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>7, la somme des coordonnées, plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la somme des coordonnées n'est pas une distance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>25, la racine ne changeant pas l'ordre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 3² + 4² = 25. Comparer les carrés donne<br/>
le même classement que comparer les distances, en évitant un<br/>
calcul coûteux.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q31 : Des attributs d'échelles différentes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour prédire si un client achète, on utilise son âge, entre 18 et<br/>
80, et son revenu annuel, entre 10 000 et 100 000. Quel<br/>
problème pose la distance euclidienne sur ces deux attributs tels<br/>
quels ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avant un k-NN, on normalise souvent chaque attribut, par exemple<br/>
entre 0 et 1, pour qu'aucun ne domine la distance.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distance ne peut pas se calculer avec deux attributs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la distance euclidienne se calcule avec autant<br/>
d'attributs que l'on veut.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'âge domine la distance, étant le premier attribut</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre des attributs n'intervient pas ; c'est<br/>
l'ampleur des écarts qui compte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le revenu domine, l'âge n'ayant presque plus d'influence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un écart de 10 000 sur le revenu écrase un<br/>
écart de 20 sur l'âge. Il faut ramener les attributs à une<br/>
même échelle avant de calculer les distances.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, les deux attributs étant des nombres positifs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : être des nombres ne suffit pas, les échelles doivent<br/>
être comparables.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q32 : Le cas k égal à un</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Avec k = 1, quelle classe l'algorithme des k plus proches voisins<br/>
attribue-t-il à un nouveau point ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le plus proche voisin est l'algorithme le plus simple de la<br/>
famille : efficace sur des données propres, fragile sur des<br/>
données bruitées.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe la plus fréquente dans tout le jeu de données</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le cas où k vaut le nombre total<br/>
d'exemples.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe de l'exemple le plus éloigné</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seuls les voisins proches votent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une classe tirée au hasard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'algorithme est déterministe, hors cas d'égalité des<br/>
distances.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La classe de l'exemple le plus proche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec un seul voisin, le vote se réduit à sa<br/>
classe. C'est le cas le plus simple, et le plus sensible aux<br/>
exemples mal étiquetés.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q33 : Un vote sans majorité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Avec k = 4, les quatre plus proches voisins d'un point ont pour<br/>
classes A, A, B et B. Que se passe-t-il, et comment l'éviter ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choisir k impair est une règle pratique pour deux classes ; avec<br/>
davantage de classes, une règle de départage reste nécessaire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le vote est indécis ; un k impair évite cette égalité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : deux voix contre deux ne désignent rien. Avec<br/>
deux classes, un k impair garantit une majorité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le point est rejeté du jeu de données faute de majorité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le point doit recevoir une classe ; c'est le paramètre<br/>
k qu'il faut ajuster.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe A l'emporte, étant la première rencontrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre d'apparition n'a aucune valeur ; il faut une<br/>
règle explicite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme recommence avec k = 8, le double</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : doubler k garde un nombre pair et le risque<br/>
d'égalité.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q34 : Quand k vaut le nombre d'exemples</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le jeu de données compte 100 exemples, 70 de classe A et 30 de<br/>
classe B. Que prédit l'algorithme pour tout nouveau point si k<br/>
vaut 100 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un k trop petit suit le bruit, un k trop grand ignore la<br/>
position : le bon k se trouve entre les deux, par essais.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe du point le plus proche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait k = 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours B, la classe la plus rare du jeu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le vote donne la majorité, A.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, k devant être inférieur à 10</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune règle n'impose cette borne, mais un k trop<br/>
grand noie les voisins proches.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Toujours A, la classe majoritaire du jeu entier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tous les exemples votent, quelle que soit la<br/>
position du point. Le résultat ne dépend plus du point, ce qui<br/>
rend l'algorithme inutile.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q35 : Un exemple mal étiqueté</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans le jeu de données, un exemple de classe A a été étiqueté B<br/>
par erreur. Quels nouveaux points cette erreur affecte-t-elle le<br/>
plus, et pour quelle valeur de k ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Augmenter k lisse les erreurs d'étiquetage, au prix d'une<br/>
frontière entre classes moins précise.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les points proches de cet exemple, surtout avec k petit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec k = 1, l'exemple fautif impose sa classe à<br/>
tout son voisinage ; avec un k plus grand, les autres voisins<br/>
corrigent son vote.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tous les points du jeu, quel que soit k</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'exemple ne vote que pour les points dont il est<br/>
voisin.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les points les plus éloignés de cet exemple</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les points éloignés ne le comptent pas parmi leurs<br/>
voisins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun point, une erreur isolée étant toujours ignorée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec k = 1, elle n'est pas ignorée du tout.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>k plus proches voisins (k-NN) — Q36 : Mesurer la qualité des prédictions</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour savoir si son k-NN prédit bien, Théo l'évalue sur les<br/>
exemples qui ont servi à construire le jeu de données et obtient<br/>
100 % de bonnes réponses. Pourquoi ce chiffre ne prouve-t-il<br/>
rien ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Séparer les données en un jeu pour prédire et un jeu pour évaluer<br/>
est la règle pour mesurer honnêtement un algorithme<br/>
d'apprentissage.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le pourcentage est mal calculé, les erreurs étant oubliées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le calcul est juste, c'est le protocole qui est<br/>
biaisé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Chaque exemple est son propre voisin, à distance nulle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'algorithme retrouve la classe de l'exemple<br/>
lui-même. Il faut évaluer sur des exemples mis de côté, qui<br/>
n'ont pas servi à prédire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le k-NN ne s'évalue pas, faute de phase d'entraînement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il s'évalue très bien, sur des données séparées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>100 % est impossible pour un algorithme d'apprentissage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien n'interdit un score parfait sur des données<br/>
faciles ; ici il est seulement trompeur.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
