La décomposition en valeurs singulières, ou SVD (Singular Value Decomposition), est l’une des décompositions matricielles les plus utiles en maths appliquées et en machine learning. Sa force : elle s’applique à n’importe quelle matrice, rectangulaire ou carrée, inversible ou non, et elle révèle la structure géométrique cachée derrière une application linéaire.
Derrière une seule formule, A = U \Sigma V^\top, se cachent l’ACP, la compression d’images, les systèmes de recommandation (Netflix), le calcul du rang ou encore la pseudo-inverse. La SVD est aux matrices rectangulaires ce que la diagonalisation est aux matrices carrées : un outil qui ramène n’importe quelle transformation à des objets simples.
Dans cet article, on construit la SVD de A à Z : définition, interprétation géométrique, lien avec la diagonalisation de A^\top A, calcul pas-à-pas sur un exemple, troncature de rang k et applications ML, le tout avec une implémentation Python et trois exercices corrigés.
Définition de la SVD
Énoncé du théorème
Soit A \in \mathbb{R}^{m \times n} une matrice quelconque. Il existe trois matrices :
- U \in \mathbb{R}^{m \times m} matrice orthogonale : U^\top U = I_m
- V \in \mathbb{R}^{n \times n} matrice orthogonale : V^\top V = I_n
- \Sigma \in \mathbb{R}^{m \times n} matrice « diagonale » de coefficients positifs ou nuls rangés dans l’ordre décroissant,
telles que :
\boxed{A = U \Sigma V^\top}Les coefficients diagonaux \sigma_1 \geq \sigma_2 \geq \cdots \geq \sigma_r > 0 (où r est le rang de A) sont appelés valeurs singulières de A.
Les colonnes de U sont les vecteurs singuliers à gauche et les colonnes de V les vecteurs singuliers à droite.
À quoi ressemble Σ
La matrice \Sigma a la même taille que A : m \times n. Ses seuls coefficients non nuls sont sur la diagonale principale. Par exemple, pour m = 3 et n = 2 :
\Sigma = \left(\begin{array}{cc} \sigma_1 & 0 \\ 0 & \sigma_2 \\ 0 & 0 \end{array}\right)Pour m = 2 et n = 3 :
\Sigma = \left(\begin{array}{ccc} \sigma_1 & 0 & 0 \\ 0 & \sigma_2 & 0 \end{array}\right)Le nombre de valeurs singulières non nulles est exactement le rang de A. Si A est carrée et inversible, toutes les valeurs singulières sont strictement positives.
Propriétés immédiates
- Rang : \text{rg}(A) est le nombre de valeurs singulières strictement positives.
- Norme spectrale : \lVert A \rVert_2 = \sigma_1 (la plus grande valeur singulière).
- Norme de Frobenius : \lVert A \rVert_F^2 = \sigma_1^2 + \sigma_2^2 + \cdots + \sigma_r^2.
- Unicité : les valeurs singulières \sigma_i sont uniques. Les vecteurs singuliers ne sont pas uniques en cas de valeurs singulières multiples, ni en signe (on peut changer u_i et v_i simultanément en leurs opposés).
Interprétation géométrique
La SVD a une interprétation géométrique particulièrement parlante. Toute application linéaire x \mapsto Ax peut s’écrire comme la composition de trois transformations élémentaires :
- Une rotation (ou plus généralement une isométrie) V^\top dans l’espace de départ.
- Une dilatation \Sigma le long des axes (facteurs \sigma_1, \sigma_2, \ldots).
- Une rotation U dans l’espace d’arrivée.

Concrètement, si on part du cercle unité de \mathbb{R}^n (l’ensemble des vecteurs x tels que \lVert x \rVert = 1), son image par A est une ellipse (ou un ellipsoïde en dimension supérieure) dans \mathbb{R}^m. Les demi-axes de cette ellipse ont pour longueurs exactement les valeurs singulières \sigma_1, \sigma_2, \ldots et pour directions les colonnes de U.
Cette interprétation explique pourquoi la SVD capture si bien la géométrie d’une matrice : \sigma_1 mesure l’amplification maximale du vecteur unité, \sigma_r mesure l’amplification minimale sur le sous-espace « utile » de A, et le rapport \sigma_1 / \sigma_r donne le conditionnement de la matrice.
Lien avec la diagonalisation
Comment calculer concrètement une SVD ? La clé est le lien avec la diagonalisation des matrices symétriques A^\top A et A A^\top.
La matrice AᵀA
Partons de A = U \Sigma V^\top et calculons A^\top A :
A^\top A = (U \Sigma V^\top)^\top (U \Sigma V^\top) = V \Sigma^\top U^\top U \Sigma V^\top = V (\Sigma^\top \Sigma) V^\top
Comme U^\top U = I, il reste V (\Sigma^\top \Sigma) V^\top. Or \Sigma^\top \Sigma est une matrice diagonale de taille n \times n dont les coefficients diagonaux sont \sigma_1^2, \sigma_2^2, \ldots (complétés par des zéros si n > r).
C’est donc la diagonalisation de la matrice symétrique A^\top A :
- les valeurs propres de A^\top A sont les \sigma_i^2,
- les vecteurs propres de A^\top A sont les colonnes de V (vecteurs singuliers à droite).
La matrice AAᵀ
De façon symétrique :
A A^\top = U \Sigma V^\top V \Sigma^\top U^\top = U (\Sigma \Sigma^\top) U^\top
\Sigma \Sigma^\top est une matrice diagonale de taille m \times m avec les mêmes \sigma_i^2 sur la diagonale. Donc :
- les valeurs propres de A A^\top sont les mêmes \sigma_i^2 (complétées par des zéros),
- les vecteurs propres de A A^\top sont les colonnes de U (vecteurs singuliers à gauche).
Algorithme pour calculer la SVD à la main
Ce lien donne une méthode directe pour calculer la SVD d’une matrice A \in \mathbb{R}^{m \times n} à la main :
- Calculer A^\top A (taille n \times n, souvent plus petite).
- Trouver les valeurs propres \lambda_i de A^\top A et les ranger par ordre décroissant. Les valeurs singulières sont \sigma_i = \sqrt{\lambda_i}.
- Calculer les vecteurs propres orthonormés v_i de A^\top A : ils forment les colonnes de V.
- En déduire les vecteurs singuliers à gauche par u_i = \dfrac{1}{\sigma_i} A v_i pour \sigma_i > 0. Compléter les colonnes restantes de U par une base orthonormée du noyau de A^\top si nécessaire.
Cette recette fonctionne bien pour de petites matrices (2×2, 3×2). En pratique, NumPy et les bibliothèques numériques utilisent des algorithmes plus stables (Golub-Reinsch) qui ne forment pas explicitement A^\top A, car cela dégrade le conditionnement.
Calcul pas-à-pas sur un exemple 3×2
Appliquons cette méthode à la matrice :
A = \left(\begin{array}{cc} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{array}\right)Étape 1 : calculer AᵀA.
A^\top A = \left(\begin{array}{ccc} 1 & 0 & 1 \\ 0 & 1 & 1 \end{array}\right) \left(\begin{array}{cc} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{array}\right) = \left(\begin{array}{cc} 2 & 1 \\ 1 & 2 \end{array}\right)Étape 2 : valeurs propres. Le polynôme caractéristique est :
\det(A^\top A - \lambda I) = (2 - \lambda)^2 - 1 = \lambda^2 - 4\lambda + 3 = (\lambda - 3)(\lambda - 1)
D’où \lambda_1 = 3 et \lambda_2 = 1, puis :
\sigma_1 = \sqrt{3}, \quad \sigma_2 = 1Étape 3 : vecteurs propres de AᵀA.
Pour \lambda_1 = 3, on résout \left(A^\top A - 3 I\right) v = 0 :
\left(\begin{array}{cc} -1 & 1 \\ 1 & -1 \end{array}\right) v = 0 \quad \Longrightarrow \quad v_1 = \frac{1}{\sqrt{2}} \left(\begin{array}{c} 1 \\ 1 \end{array}\right)Pour \lambda_2 = 1 :
\left(\begin{array}{cc} 1 & 1 \\ 1 & 1 \end{array}\right) v = 0 \quad \Longrightarrow \quad v_2 = \frac{1}{\sqrt{2}} \left(\begin{array}{c} 1 \\ -1 \end{array}\right)D’où :
V = \frac{1}{\sqrt{2}} \left(\begin{array}{cc} 1 & 1 \\ 1 & -1 \end{array}\right)Étape 4 : vecteurs singuliers à gauche. On calcule u_i = \dfrac{1}{\sigma_i} A v_i.
A v_1 = \frac{1}{\sqrt{2}} \left(\begin{array}{c} 1 \\ 1 \\ 2 \end{array}\right), \quad u_1 = \frac{1}{\sigma_1} A v_1 = \frac{1}{\sqrt{6}} \left(\begin{array}{c} 1 \\ 1 \\ 2 \end{array}\right)A v_2 = \frac{1}{\sqrt{2}} \left(\begin{array}{c} 1 \\ -1 \\ 0 \end{array}\right), \quad u_2 = \frac{1}{\sigma_2} A v_2 = \frac{1}{\sqrt{2}} \left(\begin{array}{c} 1 \\ -1 \\ 0 \end{array}\right)Il manque une troisième colonne pour U : elle doit être unitaire et orthogonale à u_1 et u_2. Un calcul direct (ou un produit vectoriel dans \mathbb{R}^3) donne :
u_3 = \frac{1}{\sqrt{3}} \left(\begin{array}{c} 1 \\ 1 \\ -1 \end{array}\right)Résultat final :
U = \left(\begin{array}{ccc} 1/\sqrt{6} & 1/\sqrt{2} & 1/\sqrt{3} \\ 1/\sqrt{6} & -1/\sqrt{2} & 1/\sqrt{3} \\ 2/\sqrt{6} & 0 & -1/\sqrt{3} \end{array}\right), \quad \Sigma = \left(\begin{array}{cc} \sqrt{3} & 0 \\ 0 & 1 \\ 0 & 0 \end{array}\right), \quad V = \frac{1}{\sqrt{2}} \left(\begin{array}{cc} 1 & 1 \\ 1 & -1 \end{array}\right)On peut vérifier numériquement que U \Sigma V^\top = A (à la précision machine près).
SVD réduite et troncature
SVD réduite
Quand m \neq n, la SVD complète contient beaucoup de zéros inutiles. On préfère souvent la SVD réduite (ou thin SVD), qui ne garde que les r premières colonnes (où r = \text{rg}(A)) :
A = U_r \Sigma_r V_r^\top
avec U_r \in \mathbb{R}^{m \times r}, \Sigma_r \in \mathbb{R}^{r \times r} diagonale, V_r \in \mathbb{R}^{n \times r}. Cette forme est équivalente à la SVD complète mais économise énormément de mémoire quand r \ll \min(m, n).
Troncature de rang k et théorème d’Eckart-Young
L’idée la plus puissante de la SVD est la troncature. On garde seulement les k premières valeurs singulières (avec k < r) :
A_k = \sum_{i=1}^{k} \sigma_i u_i v_i^\top = U_k \Sigma_k V_k^\topoù U_k contient les k premières colonnes de U, \Sigma_k = \text{diag}(\sigma_1, \ldots, \sigma_k) et V_k les k premières colonnes de V.

Théorème d’Eckart-Young-Mirsky : parmi toutes les matrices B de rang au plus k, A_k est la meilleure approximation de A au sens de la norme de Frobenius et de la norme spectrale :
\lVert A - A_k \rVert_F^2 = \sum_{i=k+1}^{r} \sigma_i^2, \quad \lVert A - A_k \rVert_2 = \sigma_{k+1}Autrement dit, l’erreur d’approximation est exactement la somme des valeurs singulières négligées (au carré) pour Frobenius, et la première valeur singulière négligée pour la norme spectrale.
Interprétation : si les \sigma_i décroissent vite, une faible partie des termes de la somme suffit à reconstruire A avec une bonne précision. C’est exactement ce qui rend la SVD utile en compression et en réduction de dimension.
Applications en machine learning
ACP : le lien fondamental
La SVD est l’outil de calcul de l’ACP (analyse en composantes principales). Si X \in \mathbb{R}^{n \times p} est une matrice de données centrée (chaque colonne de moyenne nulle), alors :
X = U \Sigma V^\top \quad \Longrightarrow \quad \Sigma_{\text{cov}} = \frac{1}{n} X^\top X = \frac{1}{n} V \Sigma^2 V^\topLes colonnes de V sont donc les directions principales, les \sigma_i^2 / n sont les valeurs propres de la matrice de covariance, et les composantes principales sont Z = X V = U \Sigma.
Application ML : quand p \gg n (images, génomique, texte en grande dimension), on ne construit pas la matrice p \times p de covariance ; on calcule directement la SVD de X, ce qui est bien plus rapide et numériquement stable.
Compression d’images
Une image en niveaux de gris est une matrice A \in \mathbb{R}^{m \times n} (un pixel par coefficient). Sa SVD permet de la compresser en ne gardant que les k premières valeurs singulières :
A_k = \sum_{i=1}^{k} \sigma_i u_i v_i^\topLe stockage passe de m \times n coefficients à k(m + n + 1) (les k colonnes de U, les k valeurs singulières, les k colonnes de V). Pour une image 1000×1000 et k = 50, on passe d’un million à environ 100 050 coefficients : facteur de compression ≈ 10, souvent sans perte visible.
Application ML : ce même principe est utilisé en analyse sémantique latente (LSA) pour traiter les matrices termes-documents en traitement du langage naturel, ou en embeddings de mots à faible rang.
Systèmes de recommandation
Dans un système comme Netflix, on dispose d’une matrice R \in \mathbb{R}^{m \times n} où R_{ij} est la note donnée par l’utilisateur i au film j. Cette matrice est gigantesque et très creuse (la plupart des cases sont manquantes).
L’hypothèse fondamentale : il existe un petit nombre de facteurs latents (genre, humeur, acteurs préférés) qui expliquent les notes. Mathématiquement, cela signifie que R est bien approchée par une matrice de rang faible k.
En factorisant R \approx U_k \Sigma_k V_k^\top, on obtient :
- pour chaque utilisateur, un vecteur de k caractéristiques (colonne de U_k \Sigma_k^{1/2}),
- pour chaque film, un vecteur de k caractéristiques (colonne de V_k \Sigma_k^{1/2}).
Le produit scalaire entre les deux donne une prédiction de la note, même pour des couples (utilisateur, film) sans note connue : c’est le filtrage collaboratif par factorisation matricielle, algorithme central dans les systèmes de recommandation modernes.
Implémentation Python
SVD avec NumPy
La fonction \texttt{np.linalg.svd} calcule la SVD d’une matrice en une ligne :
import numpy as npA = np.array([[1.0, 0.0], [0.0, 1.0], [1.0, 1.0]])U, s, Vt = np.linalg.svd(A, full_matrices=False)print("Valeurs singulières :", s)# [1.7320508 1. ] ≈ [sqrt(3), 1]# Reconstruction de AA_reconstruite = U @ np.diag(s) @ Vtprint("Erreur max :", np.max(np.abs(A - A_reconstruite)))# ~1e-16 : précision machinefull_matrices=False demande la SVD réduite (plus économe). On retrouve bien \sigma_1 = \sqrt{3} et \sigma_2 = 1.
Troncature de rang k sur une image
Appliquons la troncature à une image réelle pour voir la compression en action :
import numpy as npimport matplotlib.pyplot as pltfrom skimage import data, color# Image en niveaux de gris (auto-fournie par scikit-image)image = color.rgb2gray(data.astronaut()) # 512 x 512U, s, Vt = np.linalg.svd(image, full_matrices=False)fig, axes = plt.subplots(1, 4, figsize=(14, 4))for ax, k in zip(axes, [5, 20, 50, 200]): # Troncature rang k A_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k, :] ax.imshow(A_k, cmap='gray') ax.set_title(f"k = {k}") ax.axis('off')plt.tight_layout()plt.show()Avec k = 5, l’image est floue mais les grandes structures sont visibles. Dès k = 50 (sur 512), l’image est quasi indiscernable de l’originale. La taille de stockage passe de 512^2 = 262 ,144 coefficients à 50 \times (512 + 512 + 1) = 51 ,250, soit une compression d’un facteur 5.
ACP via SVD
On peut implémenter une ACP complète en quelques lignes à partir de la SVD :
from sklearn.datasets import load_irisiris = load_iris()X = iris.data # 150 x 4# 1. CentrageX_centre = X - X.mean(axis=0)# 2. SVD de la matrice centréeU, s, Vt = np.linalg.svd(X_centre, full_matrices=False)# 3. Composantes principalesZ = U @ np.diag(s) # équivalent à X_centre @ V# 4. Variance expliquéen = X_centre.shape[0]valeurs_propres = s**2 / nvariance_expliquee = valeurs_propres / valeurs_propres.sum()print("Variance expliquée :", variance_expliquee)# [0.9246 0.0531 0.0171 0.0052]Les deux premières composantes principales capturent à elles seules 97,8 % de la variance. C’est exactement ce que fait sklearn.decomposition.PCA en interne.
Exercices corrigés
Exercice 1 : calcul de la SVD d’une matrice 2×2
Calculer la SVD de la matrice :
A = \left(\begin{array}{cc} 2 & 1 \\ 1 & 2 \end{array}\right)Correction.
Étape 1. On calcule A^\top A. Ici A est symétrique, donc A^\top A = A^2 :
A^\top A = \left(\begin{array}{cc} 5 & 4 \\ 4 & 5 \end{array}\right)Étape 2. Valeurs propres de A^\top A :
\det(A^\top A - \lambda I) = (5 - \lambda)^2 - 16 = \lambda^2 - 10\lambda + 9 = (\lambda - 9)(\lambda - 1)
D’où \lambda_1 = 9, \lambda_2 = 1, puis \sigma_1 = 3 et \sigma_2 = 1.
Étape 3. Vecteurs propres de A^\top A :
Pour \lambda_1 = 9 : -4 v_1 + 4 v_2 = 0, soit v_1 = \frac{1}{\sqrt{2}}(1, 1).
Pour \lambda_2 = 1 : 4 v_1 + 4 v_2 = 0, soit v_2 = \frac{1}{\sqrt{2}}(1, -1).
D’où V = \frac{1}{\sqrt{2}} \left(\begin{array}{cc} 1 & 1 \\ 1 & -1 \end{array}\right).
Étape 4. Vecteurs singuliers à gauche :
u_1 = \frac{1}{\sigma_1} A v_1 = \frac{1}{3 \sqrt{2}} \left(\begin{array}{c} 3 \\ 3 \end{array}\right) = \frac{1}{\sqrt{2}} \left(\begin{array}{c} 1 \\ 1 \end{array}\right)u_2 = \frac{1}{\sigma_2} A v_2 = \frac{1}{\sqrt{2}} \left(\begin{array}{c} 1 \\ -1 \end{array}\right)Résultat :
A = \underbrace{\frac{1}{\sqrt{2}} \left(\begin{array}{cc} 1 & 1 \\ 1 & -1 \end{array}\right)}_{U} \underbrace{\left(\begin{array}{cc} 3 & 0 \\ 0 & 1 \end{array}\right)}_{\Sigma} \underbrace{\frac{1}{\sqrt{2}} \left(\begin{array}{cc} 1 & 1 \\ 1 & -1 \end{array}\right)^\top}_{V^\top}Remarque : comme A est symétrique (et même définie positive), on a U = V, et la SVD coïncide avec la diagonalisation orthogonale. Pour une matrice quelconque, U et V sont en général distinctes.
Exercice 2 : meilleure approximation de rang 1
En utilisant la SVD de l’exercice précédent, calculer la meilleure approximation de rang 1 de A au sens de la norme de Frobenius, et vérifier que :
\lVert A - A_1 \rVert_F^2 = \sigma_2^2
Correction. D’après Eckart-Young, la meilleure approximation de rang 1 est :
A_1 = \sigma_1 u_1 v_1^\top = 3 \cdot \frac{1}{\sqrt{2}} \left(\begin{array}{c} 1 \\ 1 \end{array}\right) \cdot \frac{1}{\sqrt{2}} \left(\begin{array}{cc} 1 & 1 \end{array}\right) = \frac{3}{2} \left(\begin{array}{cc} 1 & 1 \\ 1 & 1 \end{array}\right)On calcule le résidu :
A - A_1 = \left(\begin{array}{cc} 2 & 1 \\ 1 & 2 \end{array}\right) - \left(\begin{array}{cc} 1{,}5 & 1{,}5 \\ 1{,}5 & 1{,}5 \end{array}\right) = \left(\begin{array}{cc} 0{,}5 & -0{,}5 \\ -0{,}5 & 0{,}5 \end{array}\right)Et la norme de Frobenius au carré :
\lVert A - A_1 \rVert_F^2 = 4 \times 0{,}5^2 = 1 = \sigma_2^2 Comme \sigma_1 = 3 et \sigma_2 = 1, on reconstitue donc 90 % de la norme de Frobenius au carré de A avec une seule composante, et l’approximation est exactement optimale au sens de Frobenius.
Exercice 3 : ACP via SVD sur un mini-jeu de données
On dispose de 5 points dans \mathbb{R}^2 :
x_1 = (1, 2), x_2 = (3, 4), x_3 = (5, 6), x_4 = (2, 3), x_5 = (4, 5)
- Centrer les données.
- Calculer la SVD de la matrice centrée \tilde{X}.
- En déduire la première composante principale et sa variance.
Correction.
1. La moyenne vaut \bar{x} = (3, 4). Les points centrés :
\tilde{X} = \left(\begin{array}{cc} -2 & -2 \\ 0 & 0 \\ 2 & 2 \\ -1 & -1 \\ 1 & 1 \end{array}\right)2. On constate que les lignes sont toutes colinéaires à \left(1, 1\right), donc \tilde{X} est de rang 1. Calculons \tilde{X}^\top \tilde{X} :
\tilde{X}^\top \tilde{X} = \left(\begin{array}{cc} 10 & 10 \\ 10 & 10 \end{array}\right)Valeurs propres : \lambda_1 = 20, \lambda_2 = 0. Donc \sigma_1 = \sqrt{20} = 2\sqrt{5} et \sigma_2 = 0.
Vecteur propre associé à \lambda_1 : v_1 = \frac{1}{\sqrt{2}}(1, 1).
3. La première composante principale est la projection z_i = \tilde{x}_i \cdot v_1 :
z_1 = -2\sqrt{2}, z_2 = 0, z_3 = 2\sqrt{2}, z_4 = -\sqrt{2}, z_5 = \sqrt{2}Sa variance empirique est :
\text{Var}(Z_1) = \frac{\sigma_1^2}{n} = \frac{20}{5} = 4Comme \sigma_2 = 0, la seconde composante capture 0 % de variance : les données vivent entièrement sur la droite y = x. L’ACP réduit ici la dimension de 2 à 1 sans aucune perte d’information.
Exercices d’entraînement
- Calculer numériquement (ou avec NumPy) la SVD de A = \left(\begin{array}{cc} 4 & 0 \\ 3 & 5 \end{array}\right). Vérifier que \sigma_1^2 + \sigma_2^2 = \lVert A \rVert_F^2 = 50.
- Soit A \in \mathbb{R}^{m \times n} avec m \geq n. Montrer que A a au plus n valeurs singulières non nulles et que A est de rang plein si et seulement si toutes ses valeurs singulières sont strictement positives. En déduire la relation \text{rg}(A) = \text{rg}(A^\top A).
- On souhaite compresser une image en niveaux de gris de taille 1000 \times 1000 par troncature de rang k. Combien de coefficients faut-il stocker pour la version tronquée ? À partir de quelle valeur de k la « compression » devient-elle contre-productive (plus de coefficients stockés que dans l’image originale) ?
FAQ
La SVD, ou décomposition en valeurs singulières, est une factorisation A = U Σ Vᵀ d’une matrice quelconque. U et V sont des matrices orthogonales (leurs colonnes forment des bases orthonormées), Σ est une matrice « diagonale » de coefficients positifs rangés par ordre décroissant : les valeurs singulières. Elles mesurent l’amplification de la matrice le long de directions privilégiées.
La diagonalisation A = PDP⁻¹ ne s’applique qu’à certaines matrices carrées (celles qui sont diagonalisables). La SVD s’applique à toute matrice, même rectangulaire. De plus, U et V de la SVD sont toujours orthogonales, alors que P de la diagonalisation n’est pas forcément orthogonale. Enfin, les valeurs singulières sont toujours positives, contrairement aux valeurs propres qui peuvent être négatives ou complexes.
La SVD est au cœur de plusieurs algorithmes fondamentaux. Elle est utilisée pour calculer l’ACP (réduction de dimension), pour compresser des images et des matrices de grande taille, pour les systèmes de recommandation par factorisation matricielle (Netflix, Amazon), pour l’analyse sémantique latente (LSA) en traitement du langage, et pour calculer la pseudo-inverse d’une matrice (régression des moindres carrés).
On calcule d’abord AᵀA (matrice symétrique de taille n×n). Ses valeurs propres sont les σᵢ² et ses vecteurs propres orthonormés sont les colonnes de V. Les valeurs singulières sont σᵢ = √λᵢ. Enfin, les colonnes de U sont obtenues par uᵢ = Avᵢ / σᵢ pour σᵢ > 0. Cette méthode marche bien pour de petites matrices. En pratique numérique, NumPy utilise un algorithme plus stable (Golub-Reinsch) qui ne forme pas explicitement AᵀA.








