SVD (décomposition en valeurs singulières) : cours complet 

SVD (décomposition en valeurs singulières) : cours complet, interprétation géométrique et applications en machine learning

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 :

  1. Une rotation (ou plus généralement une isométrie) V^\top dans l’espace de départ.
  2. Une dilatation \Sigma le long des axes (facteurs \sigma_1, \sigma_2, \ldots).
  3. Une rotation U dans l’espace d’arrivée.
SVD : le cercle unité est transformé en ellipse par rotation (Vᵀ), dilatation (Σ) puis rotation (U)

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 :

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 :

  1. Calculer A^\top A (taille n \times n, souvent plus petite).
  2. 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}.
  3. Calculer les vecteurs propres orthonormés v_i de A^\top A : ils forment les colonnes de V.
  4. 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^\top

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.

Troncature de rang k : schéma de la décomposition A = U Σ Vᵀ où seules les k premières colonnes et valeurs singulières sont conservées

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^\top

Les 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^\top

Le 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}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 np
A = 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 A
A_reconstruite = U @ np.diag(s) @ Vt
print("Erreur max :", np.max(np.abs(A - A_reconstruite)))
# ~1e-16 : précision machine

full_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 np
import matplotlib.pyplot as plt
from skimage import data, color
# Image en niveaux de gris (auto-fournie par scikit-image)
image = color.rgb2gray(data.astronaut()) # 512 x 512
U, 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_iris
iris = load_iris()
X = iris.data # 150 x 4
# 1. Centrage
X_centre = X - X.mean(axis=0)
# 2. SVD de la matrice centrée
U, s, Vt = np.linalg.svd(X_centre, full_matrices=False)
# 3. Composantes principales
Z = U @ np.diag(s) # équivalent à X_centre @ V
# 4. Variance expliquée
n = X_centre.shape[0]
valeurs_propres = s**2 / n
variance_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)
  1. Centrer les données.
  2. Calculer la SVD de la matrice centrée \tilde{X}.
  3. 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} = 4

Comme \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

  1. 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.
  2. 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).
  3. 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

Qu’est-ce que la décomposition en valeurs singulières ?

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.

Quelle est la différence entre SVD et diagonalisation ? 

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.

À quoi sert la SVD en machine learning ? 

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).

Comment calculer une SVD à la main ?

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.

Laisser un commentaire

Articles similaires

En savoir plus sur Progresser-en-maths

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture