Astuce. Pour comparer des distances, inutile de prendre la racine : comparer les distances au carré.
6 / 13
KNN en PythonCODE
from collections import Counter
defdistance(a, b):
returnsum((a[i]-b[i])**2for i inrange(len(a)))**0.5defknn(donnees, etiq, x, k):
d = [(distance(x, donnees[i]), etiq[i]) for i inrange(len(donnees))]
d.sort(key=lambda c: c[0])
voisins = [c for (_, c) in d[:k]]
return Counter(voisins).most_common(1)[0][0]
KNN = apprentissage « paresseux » : aucun entraînement, tout se calcule à la prédiction.
defkmeans(donnees, centres, iter_max=100):
for _ inrange(iter_max):
groupes = [[] for _ in centres]
for x in donnees:
j = plus_proche(x, centres)
groupes[j].append(x)
nouveaux = [moyenne(g) if g else centres[j]
for j, g inenumerate(groupes)]
if nouveaux == centres: break
centres = nouveaux
return centres
Minimum local. L'inertie décroît à chaque étape ⇒ convergence, mais le résultat dépend de l'initialisation. On relance plusieurs fois.
12 / 13
RécapitulatifBILAN
Supervisé = étiqueté (KNN) · non supervisé = sans étiquette (K-means).
KNN : vote des $k$ plus proches voisins, distance euclidienne.
Matrice de confusion ⇒ exactitude, précision, rappel ; guide le choix de $k$.
K-means : affectation ↔ recalcul des centres ; converge vers un minimum local.