À quoi sert le produit scalaire ?
Le produit scalaire est un nombre qui dit à quel point deux vecteurs vont dans le même sens. Vous saurez le calculer, en tirer un angle et comparer deux textes avec la similarité cosinus.
Un site de recettes veut proposer des plats proches de celui que vous venez de cuisiner. Il compare des vecteurs d’ingrédients.
À la fin de cette leçon
Remarque
Je peux utiliser le produit scalaire pour dire à quel point deux vecteurs vont dans le même sens.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Produit scalaire | la somme des produits des composantes de même rang |
| Orthogonaux | deux vecteurs à angle droit, de produit scalaire nul |
| Angle | l’écart de direction entre deux vecteurs |
| Cosinus | un nombre de −1 à 1 lié à l’angle, 1 pour le même sens |
| Similarité cosinus | le produit scalaire divisé par les deux longueurs |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le produit scalaire multiplie puis additionne
Un guichet vend 2 billets adulte à 12 €, 1 billet enfant à 6 € et 3 billets étudiant à 8 €. Les quantités forment le vecteur (2, 1, 3), les prix le vecteur (12, 6, 8).
On multiplie les composantes de même rang, puis on additionne : 24, 6 et 24 font 54 €. Ce calcul est le produit scalaire. Le résultat est un nombre, pas un vecteur.
Exemple travaillé : deux produits scalaires
| Vecteurs | Produits de même rang | Produit scalaire |
|---|---|---|
| (2, 1, 3) et (12, 6, 8) | 24, 6 et 24 | 54 |
| (1, 2, 3) et (4, 5, 6) | 4, 10 et 18 | 32 |
| (1, 0) et (0, 1) | 0 et 0 | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le total du guichet en Python
# Quantités de billets : adulte, enfant, étudiant.
quantites = [2, 1, 3]
# Prix en euros de chaque sorte de billet.
prix = [12, 6, 8]
total = 0
for i in range(len(quantites)):
total = total + quantites[i] * prix[i]
print("total :", total, "euros")
# Remplacez 3 par 0 dans quantites, puis relancez.
# Le total monte-t-il ou descend-il ?
Un produit scalaire avec NumPy
docker exec jupyter python3 -c "import numpy as np; print(np.dot([1, 2, 3], [4, 5, 6]))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le signe du produit donne le sens
Si deux vecteurs vont à peu près dans le même sens, leur produit scalaire est positif. À angle droit, il vaut 0 : on dit qu’ils sont orthogonaux. Dans des sens opposés, il est négatif.
Le produit scalaire vaut aussi la longueur du premier, fois celle du second, fois le cosinus de l’angle entre eux. On en tire l’angle.
Exemple travaillé : trois directions
| Vecteurs | Produit scalaire | Ce que cela dit |
|---|---|---|
| (1, 0) et (2, 0) | 2 | même sens |
| (1, 0) et (0, 3) | 0 | angle droit |
| (1, 0) et (−1, 0) | −1 | sens opposés |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Cosinus et angle de deux vecteurs
docker exec jupyter python3 -c "import numpy as np; a = np.array([1, 0]); b = np.array([1, 1]); c = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)); print(round(c, 3), round(float(np.degrees(np.arccos(c))), 1))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La similarité cosinus compare des textes
Un grand produit scalaire peut venir de grands vecteurs. Pour comparer des directions, on divise par les deux longueurs : c’est la similarité cosinus.
On compte les mots « pain », « lait » et « sucre » dans deux recettes : (2, 1, 0) et (1, 1, 1). Le produit scalaire vaut 3, les longueurs √5 et √3. La similarité vaut 3 divisé par √15, soit 0,775.
Exemple travaillé : deux recettes
| Étape | Calcul | Résultat |
|---|---|---|
| Produit scalaire | 2 × 1 + 1 × 1 + 0 × 1 | 3 |
| Longueur de la recette A | √(4 + 1 + 0) | √5, soit 2,236 |
| Longueur de la recette B | √(1 + 1 + 1) | √3, soit 1,732 |
| Similarité cosinus | 3 ÷ (2,236 × 1,732) | 0,775 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La similarité des deux recettes
docker exec jupyter python3 -c "import numpy as np; a = np.array([2, 1, 0]); b = np.array([1, 1, 1]); print(round(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)), 3))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu’un grand produit scalaire veut dire des vecteurs très semblables. Il grandit aussi quand les vecteurs sont longs. Pour juger la ressemblance, divisez par les deux longueurs : le résultat reste entre −1 et 1.
Pour aller plus loin
Dans un carnet, comptez trois mots dans vos propres phrases, puis calculez la similarité de deux phrases avec np.dot et np.linalg.norm.
Les moteurs de recherche sur documents et les systèmes de recommandation reposent sur cette idée : un texte devient un vecteur de comptes.