Module 3 — Normes, distances et similarité cosinus
Dès qu'un modèle doit dire « ces deux choses se ressemblent » — recommander un produit, regrouper des clients, retrouver un document —, il mesure une distance ou une similarité entre vecteurs. Ce module donne les trois outils qui fondent la recherche vectorielle, le clustering et les embeddings modernes.
La norme : la taille d'un vecteur
La norme mesure la « longueur » d'un vecteur. La plus courante, la norme euclidienne (dite ), généralise le théorème de Pythagore :
import numpy as np
x = np.array([3, 4])
np.linalg.norm(x) # 5.0 — le classique triangle 3-4-5
La norme sert à normaliser un vecteur (le ramener à une longueur de 1 en le divisant par sa norme), opération omniprésente : elle permet de comparer des directions indépendamment de l'échelle. On rencontre aussi la norme (somme des valeurs absolues), qui jouera un rôle clé dans la régularisation des modèles.
La distance euclidienne : la proximité « à vol d'oiseau »
La distance entre deux observations est la norme de leur différence :
a = np.array([72, 3, 15])
b = np.array([90, 4, 8])
np.linalg.norm(a - b) # distance entre deux logements
C'est la distance qu'utilise l'algorithme des k plus proches voisins et le clustering k-means. Elle a un piège majeur : elle est dominée par les caractéristiques de grande amplitude. Ici, la surface (dizaines) écrase le nombre de chambres (unités) : la distance ne reflète presque que la surface. D'où la nécessité de mettre les caractéristiques à la même échelle avant tout calcul de distance — un point sur lequel le module 6 et le cours d'ingénierie des caractéristiques reviennent longuement.
La distance de Manhattan : par les rues, pas à vol d'oiseau
La distance de Manhattan () additionne les écarts absolus, comme un taxi qui suit le quadrillage des rues :
Moins sensible aux valeurs extrêmes que la distance euclidienne, elle est parfois préférée en grande dimension. Le choix euclidienne / Manhattan est un vrai levier de réglage selon les données.
La similarité cosinus : comparer les directions, pas les longueurs
Souvent, ce qui compte n'est pas la distance mais l'orientation. Deux textes qui parlent du même sujet ont des vecteurs pointant dans la même direction, même si l'un est bien plus long (document plus verbeux). La similarité cosinus mesure l'angle, en ignorant les longueurs :
def cosinus(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
Elle vaut 1 pour deux vecteurs de même direction, 0 pour deux vecteurs perpendiculaires (sans rapport), −1 pour des directions opposées. Le numérateur est le produit scalaire, brique qui mesure à quel point deux vecteurs « vont dans le même sens ».
Les modèles modernes — recherche sémantique, systèmes RAG, recommandation — représentent textes et images par des vecteurs (embeddings) de grande dimension. On y compare presque toujours par similarité cosinus, car seule la direction porte le sens ; la longueur du vecteur ne fait que refléter des artefacts comme la taille du texte. Quand vous lirez qu'une base vectorielle « cherche les voisins les plus proches », c'est ce calcul, massivement optimisé, qui tourne dessous.
En résumé
- La norme mesure la longueur d'un vecteur ; la normalisation le ramène à une longueur de 1 pour comparer des directions.
- La distance euclidienne mesure la proximité « à vol d'oiseau » ; elle est dominée par les caractéristiques de grande amplitude, d'où l'importance de la mise à l'échelle.
- La distance de Manhattan () somme les écarts absolus, plus robuste aux valeurs extrêmes.
- La similarité cosinus compare les directions en ignorant les longueurs ; c'est la mesure reine des embeddings et de la recherche sémantique.
Module suivant : valeurs propres et réduction de dimension — comment compresser des données à des centaines de caractéristiques en gardant l'essentiel.