Progrès sur la rédaction du cours ML.

This commit is contained in:
Pierre-Edouard Portier 2021-09-05 16:45:04 +02:00
parent 830c3f55c3
commit 639e14824c
10 changed files with 400 additions and 3 deletions

View File

@ -84,3 +84,23 @@ lcoef <- sapply(alphas, ridge, data, 7)
matplot(alphas, t(lcoef), type=c("b"), pch=1, col=1:8, log="x") matplot(alphas, t(lcoef), type=c("b"), pch=1, col=1:8, log="x")
legend("topright", legend = 0:7, col=1:8, pch=1) legend("topright", legend = 0:7, col=1:8, pch=1)
``` ```
# Régularisation et complexité
Essayons de mieux comprendre les raisons pour lesquelles la régularisation peut être efficace. Nous allons montrer qu'elle réduit la complexité d'un modèle prédictif. Dans ce contexte, qu'est-ce que la complexité ? C'est la sensibilité du modèle au bruit présent dans les données. Qu'est-ce que le bruit ? Il est possible de le définir après avoir fait l'hypothèse d'une famille de modèles qui auraient pu générer les données observées.
Prenons l'exemple d'un modèle linéaire : $F(\mathbf{X}) = \mathbf{W}^T\mathbf{X} + b$. Posons ensuite $\mathbf{X^*} = \mathbf{X} + \mathbf{\epsilon}$ avec $\mathbf{\epsilon}$ un faible bruit ($\|\epsilon\|$ est petit). $\mathbf{X}$ et $\mathbf{X^*}$ étant proches, une hypothèse de régularité demande que $F(\mathbf{X})$ et $F(\mathbf{X^*})$ le soient aussi. La proximité de $F(\mathbf{X})$ et $F(\mathbf{X^*})$ peut se mesurer avec $|F(\mathbf{X}) - F(\mathbf{X^*})|$.
\begin{align*}
& |F(\mathbf{X}) - F(\mathbf{X^*})| \\
= \{& F(\mathbf{X}) = \mathbf{W}^T\mathbf{X} + b \} \\
& |\mathbf{W}^T\mathbf{X} - \mathbf{W}^T\mathbf{X^*}| \\
= \phantom{\{}& \\
& |\mathbf{W}^T(\mathbf{X}-\mathbf{X^*})| \\
= \{& \mathbf{X^*} = \mathbf{X} + \mathbf{\epsilon} \} \\
& |\mathbf{W}^T \mathbf{\epsilon}| \\
\leq \{& \text{Inégalité de Cauchy-Schwarz} \} \\
& \|\mathbf{W}\|_2 \|\mathbf{\epsilon}\|_2 \\
\end{align*}
Donc, en pénalisant les grandes valeurs de $\|\mathbf{W}\|_2$, on réduit la sensibilité du modèle à de petites perturbations dans les données observées. Autrement dit, par l'ajout de régularisation, les prédictions associées aux plus proches voisins de $\mathbf{X}$ tendent à être similaires à celle associée à $\mathbf{X}$.

Binary file not shown.

View File

@ -76,9 +76,63 @@ Rappelons la décomposition en valeurs singulière d'une matrice $\mathbf{A} \in
knitr::include_graphics("images/SVD_reduit.jpg") knitr::include_graphics("images/SVD_reduit.jpg")
``` ```
Nous avons les propriété fondamentales suivantes : Nous avons les propriétés fondamentales suivantes :
\begin{align*} \begin{align*}
Im(\mathbf{A}) &= Im(\mathbf{U_r}) & \mathbf{U_r}\mathbf{U_r}^T \text{ est un projecteur orthogonal sur } Im(\mathbf{A}) \\ Im(\mathbf{A}) &= Im(\mathbf{U_r}) & \mathbf{U_r}\mathbf{U_r}^T &: \text{ est un projecteur orthogonal sur } Im(\mathbf{A}) \\
Ker(\mathbf{A}) &= Im(\tilde{\mathbf{V_r}}^T) & \tilde{\mathbf{V_r}}\tilde{\mathbf{V_r}}^T \text{ est un projecteur orthogonal sur } Ker(\mathbf{A}) \\ Ker(\mathbf{A}) &= Im(\tilde{\mathbf{V_r}}) & \tilde{\mathbf{V_r}}\tilde{\mathbf{V_r}}^T &: \text{ est un projecteur orthogonal sur } Ker(\mathbf{A}) \\
Im(\mathbf{A}^T) &= Im(\mathbf{V_r}) & \mathbf{V_r}\mathbf{V_r}^T &: \text{ est un projecteur orthogonal sur } Im(\mathbf{A}^T) \\
Ker(\mathbf{A}^T) &= Im(\tilde{\mathbf{U_r}}) & \tilde{\mathbf{U_r}}\tilde{\mathbf{U_r}}^T &: \text{ est un projecteur orthogonal sur } Ker(\mathbf{A}^T) \\
\end{align*}
Montrons par exemple que $Ker(\mathbf{A})=Im(\tilde{\mathbf{V_r}})$, c'est-à-dire que les $N-r$ dernières colonnes de $\tilde{\mathbf{V_r}}$ forment une base orthonormale pour le noyau de $\mathbf{A}$, c'est-à-dire pour l'ensemble des vecteurs $\mathbf{x}$ tels que $\mathbf{A}\mathbf{x}=0$.
Considérons $\mathbf{x} \in Im(\tilde{\mathbf{V_r}})$, ce vecteur s'écrit sous la forme $\mathbf{x} = \sum_{i=r+1}^{N}w_i\mathbf{v_i}$ avec $w_i \in \mathbb{R}$ et $\mathbf{v_i}$ la i-ème colonne de $\tilde{\mathbf{V_r}}$. Nous devons montrer que $\mathbf{A}\mathbf{x}=0$.
\begin{align*}
& \mathbf{A}\mathbf{x} \\
= \{& \text{Par définition de $\mathbf{x}$.} \} \\
& \mathbf{A}\sum_{i=r+1}^{N}w_i\mathbf{v_i} \\
= \{& \text{Par linéarité.} \} \\
& \sum_{i=r+1}^{N}w_i(\mathbf{A}\mathbf{v_i}) \\
\end{align*}
Il suffit donc de montrer que chaque $\mathbf{A}\mathbf{v_i}$ est nul.
\begin{align*}
& \mathbf{A}\mathbf{v_i} \\
= \{& \text{SVD de $\mathbf{A}$} \} \\
& (\mathbf{U}\mathbf{\Sigma}\mathbf{V}^T) \mathbf{v_i} \\
= \{& \text{Les colonnes de $\mathbf{V}$ sont orthonormales et $\mathbf{v_i}$ est une colonne de $\mathbf{V}$.} \\
\phantom{=}\phantom{\{}& \text{Donc $\mathbf{V}^T \mathbf{v_i} = \mathbf{e_i}$ le vecteur avec des 0 partout sauf le 1 en position $i$.} \} \\
& \mathbf{U}\mathbf{\Sigma}\mathbf{e_i} \\
= \{& \mathbf{\Sigma}\mathbf{e_i} = 0 \text{ car à partir de la (r+1)ème ligne, toutes les lignes de $\mathbf{\Sigma}$ sont nulles et $i \geq r+1$.} \} \\
& 0 \\
\end{align*}
# Projection sur une base quelconque
Nous cherchons à projeter un vecteur $\mathbf{v}$ sur l'espace des colonnes d'une matrice $\mathbf{A}$. Notons le résultat de cette projection $\mathbf{y} \in Im(\mathbf{A})$. $\mathbf{y}-\mathbf{v}$ est orthogonal à $Im(\mathbf{A})$ (c'est-à-dire qu'il appartient à $Ker(\mathbf{A})$). Autrement dit, en posant $\mathbf{y}=\mathbf{A}\mathbf{x}$, nous avons :
\begin{align*}
& \mathbf{a_j}^T (\mathbf{y}-\mathbf{v}) = 0, \forall j \\
= \{& \text{Posons $\mathbf{y}=\mathbf{A}\mathbf{x}$.} \} \\
& \mathbf{a_j}^T (\mathbf{A}\mathbf{x}-\mathbf{v}) = 0, \forall j \\
= \{& \text{Linéarité de la multiplication matricielle.} \} \\
& \mathbf{A}^T (\mathbf{A}\mathbf{x}-\mathbf{v}) = \mathbf{0} \\
= \phantom{\{}& \\
& \mathbf{A}^T\mathbf{A}\mathbf{x} = \mathbf{A}^T\mathbf{v} \\
= \{& \text{Si $\mathbf{A}^T\mathbf{A}$ est inversible.} \} \\
& \mathbf{x} = (\mathbf{A}^T\mathbf{A})^{-1}\mathbf{A}^T\mathbf{v} \\
\end{align*}
Ainsi, la projection $\mathbf{y} = \mathbf{A}\mathbf{x} = \mathbf{A}(\mathbf{A}^T\mathbf{A})^{-1}\mathbf{A}^T\mathbf{v}$. Nous trouvons donc que $\mathbf{A}(\mathbf{A}^T\mathbf{A})^{-1}\mathbf{A}^T$ est un projecteur orthogonal sur l'espace des colonnes de $\mathbf{A}$. En fait, il est simple de vérifier que ce projecteur est $\mathbf{U_r}\mathbf{U_r}^T$ :
\begin{align*}
\mathbf{A} &= \mathbf{U_r}\mathbf{\Sigma_r}\mathbf{V_r}^T \\
\mathbf{A}^T &= \mathbf{V_r}\mathbf{\Sigma_r}\mathbf{U_r}^T \\
\mathbf{A}^T\mathbf{A} &= \mathbf{V_r}\mathbf{\Sigma_r}^2\mathbf{V_r}^T \\
(\mathbf{A}^T\mathbf{A})^{-1} &= \mathbf{V_r}\mathbf{\Sigma_r}^{-2}\mathbf{V_r}^T \\
(\mathbf{A}^T\mathbf{A})^{-1}\mathbf{A}^T &= \mathbf{V_r}\mathbf{\Sigma_r}^{-1}\mathbf{U_r}^T \\
\mathbf{A}(\mathbf{A}^T\mathbf{A})^{-1}\mathbf{A}^T &= \mathbf{U_r}\mathbf{U_r}^T \\
\end{align*} \end{align*}

Binary file not shown.

197
ML1_12_factorisation_qr.Rmd Normal file
View File

@ -0,0 +1,197 @@
---
title: "ML 12 Factorisation QR"
output:
bookdown::pdf_document2:
number_section: yes
extra_dependencies:
algorithm2e: [ruled,vlined,linesnumbered]
toc: false
classoption: fleqn
---
# Factorisation QR
Nous introduisons une décomposition matricielle qui nous permettra plus tard d'implémenter les calculs des décompositions en valeurs propres et en valeurs singulières.
Nous cherchons des vecteurs orthonormaux qui forment une base pour les espaces couverts par les colonnes successives d'une matrice $\mathbf{A} \in \mathbb{R}^{M \times N}$. Notons :
\begin{align*}
<\mathbf{a_1}> &: \text{l'espace (la ligne) couvert par la première colonne de $\mathbf{A}$} \\
<\mathbf{a_1}, \mathbf{a_2}> &: \text{l'espace (le plan) couvert par les deux premières colonne de $\mathbf{A}$} \\
\text{Etc.} &: \text{Etc.} \\
\end{align*}
Nous avons $<\mathbf{a_1}> \subseteq <\mathbf{a_1}, \mathbf{a_2}> \subseteq \dots \subseteq <\mathbf{a_1}, \mathbf{a_2}, \dots, \mathbf{a_N}>$.
Nous cherchons des vecteurs orthogonaux $\mathbf{q_i}$ tels que :
\[
<\mathbf{q_1}, \mathbf{q_2}, \dots, \mathbf{q_j}> = <\mathbf{a_1}, \mathbf{a_2}, \dots, \mathbf{a_j}> \quad \text{pour } j=1,2,\dots,N
\]
Ce qui peut s'écrire sous une forme matricielle :
\[
(\mathbf{a_1} \; \mathbf{a_2} \; \dots \; \mathbf{a_N}) =
(\mathbf{q_1} \; \mathbf{q_2} \; \dots \; \mathbf{q_N})
\left( \begin{array}{cccc}
r_{11} & r_{12} & \dots & r_{1N} \\
0 & r_{22} & \dots & r_{2N} \\
\dots & \dots & \dots & \dots \\
0 & 0 & \dots & r_{NN}
\end{array} \right)
\]
Sans perte de généralité, considérons la situation où $M>N$. Nous appelons alors cette expression, $\mathbf{A}=\mathbf{\hat{Q}}\mathbf{\hat{R}}$ (avec $\mathbf{\hat{Q}} \in \mathbb{R}^{M \times N}$ et $\mathbf{\hat{R}} \in \mathbb{R}^{N \times N}$), la forme réduite de la factorisation QR.
Nous pouvons aussi considérer la forme dite complète de la factorisation QR, avec $\mathbf{Q} \in \mathbb{R}^{M \times M}$ et $\mathbf{R} \in \mathbb{R}^{M \times N}$. Dans ce cas, les $M-N$ dernières lignes de $\mathbf{R}$ sont nulles et il suffit de compléter $\mathbf{\hat{Q}}$ en lui ajoutant $M-N$ colonnes orthogonales.
# Orthogonalisation de Gram-Schmidt
Nous présentons l'algorithme de Gram-Schmidt pour la décomposition QR.
Le principe est de construire $\mathbf{q_j}$ orthogonal à $\mathbf{q_1}, \mathbf{q_2}, \dots, \mathbf{q_{j-1}}$ en retirant à la colonne $\mathbf{a_j}$ ses composantes selon les directions de $\mathbf{q_1}, \mathbf{q_2}, \dots, \mathbf{q_{j-1}}$ :
\begin{align*}
\mathbf{v_j} &= \mathbf{a_j} - (\mathbf{q_1}^T\mathbf{a_j})\mathbf{q_1} - (\mathbf{q_2}^T\mathbf{a_j})\mathbf{q_2} - \dots - (\mathbf{q_{j-1}}^T\mathbf{a_j})\mathbf{q_{j-1}} \\
\mathbf{q_j} &= \mathbf{v_j} / \|\mathbf{v_j}\| \\
\end{align*}
Nous obtenons ainsi la matrice $\mathbf{\hat{Q}}$. Pour $\mathbf{\hat{R}}$, nous avons, par construction des $\mathbf{q_j}$ :
\begin{align*}
r_{ij} &= \mathbf{q_i}^T \mathbf{a_j} &\phantom{,} i \neq j \\
|r_{jj}| &= \| \mathbf{a_j} - \sum_{i=1}^{j-1} r_{ij} \mathbf{q_i} \| &\phantom{,} \text{par convention, nous choisissons $r_{jj}>0$} \\
\end{align*}
Nous avons ainsi dérivé l'algorithme classique de Gram-Schmidt :
\begin{algorithm}[H]
\DontPrintSemicolon
\NoCaptionOfAlgo
\SetAlgoLined
\SetKwInput{Res}{Résultat}
\SetKwInOut{Input}{Entrée}\SetKwInOut{Output}{Sortie}
\SetKwFor{Pour}{pour}{faire}{finpour}
\SetKw{KwTo}{à}
\Res{Décomposition QR de la matrice A}
\Input{$\mathbf{A} \in \mathbb{R}^{M \times N}$, avec $M \geq N$}
\Output{$\mathbf{Q} \in \mathbb{R}^{M \times N}$ une matrice orthonormale \\
$\mathbf{R} \in \mathbb{R}^{N \times N}$ une matrice triangulaire supérieure \\
telles que $\mathbf{A} = \mathbf{Q} \mathbf{R}$}
\BlankLine
\Pour{$j \gets 1$ \KwTo $N$}{
$\mathbf{v_j} \gets \mathbf{a_j}$ \;
\Pour{$i \gets 1$ \KwTo $j-1$}{
$r_{ij} \gets \mathbf{q_i}^T\mathbf{a_j}$ \;
$\mathbf{v_j} \gets \mathbf{v_j} - r_{ij}\mathbf{q_i}$ \;
}
$r_{jj} \gets \| \mathbf{v_j} \|$ \;
$\mathbf{q_j} \gets \mathbf{v_j} / r_{jj}$ \;
}
\caption{Gram-Schmidt classique (GS)}
\end{algorithm}
# Algorithme de Gram-Schmidt modifié
## Dérivation de l'algorithme de Gram-Schmidt modifié
Nous présentons une autre manière de voir ce résultat qui nous mènera à un algorithme équivalent mais numériquement plus stable.
Nous pouvons considérer que $\mathbf{q_j}$ est obtenu en projetant $\mathbf{a_j}$ sur l'espace orthogonal à $<\mathbf{a_1}, \mathbf{a_2}, \dots, \mathbf{a_{j-1}}>$, cet espace étant par construction égal à $<\mathbf{q_1}, \mathbf{q_2}, \dots, \mathbf{q_{j-1}}>$ :
\[
\mathbf{q_j} = \frac{\mathbf{P_j}\mathbf{a_j}}{\|\mathbf{P_j}\mathbf{a_j}\|} \quad ; \quad
\mathbf{P_j} = \mathbf{I} - \mathbf{Q_{j-1}}\mathbf{Q_{j-1}}^T \; \text{avec }
\mathbf{Q_{j-1}} = (\mathbf{q_1} \; \mathbf{q_2} \; \dots \mathbf{q_{j-1}})
\]
De façon équivalente, $\mathbf{P_j}$ peut s'exprimer comme le produit de projecteurs sur les espaces orthogonaux à $\mathbf{q_1}$, puis $\mathbf{q_2}$, etc. jusqu'à $\mathbf{q_{j-1}}$ :
\[
\mathbf{P_j} = \mathbf{P_{\bot \mathbf{q_{j-1}}}} \mathbf{P_{\bot \mathbf{q_{j-2}}}} \dots
\mathbf{P_{\bot \mathbf{q_{2}}}} \mathbf{P_{\bot \mathbf{q_{1}}}} \quad
\text{avec } \mathbf{P_{\bot \mathbf{q}}} = \mathbf{I} - \mathbf{q}\mathbf{q}^T
\]
Dans la version classique de Gram-Schmidt, $\mathbf{v_j}=\mathbf{P_j}\mathbf{a_j}$.
Dans la version modifiée de Gram-Schmidt :
\[
\mathbf{v_j}=\mathbf{P_{\bot \mathbf{q_{j-1}}}} \mathbf{P_{\bot \mathbf{q_{j-2}}}} \dots
\mathbf{P_{\bot \mathbf{q_{2}}}} \mathbf{P_{\bot \mathbf{q_{1}}}}
\mathbf{a_j}
\]
Ainsi, nous observons que dès que $\mathbf{q_1}$ est connu ($\mathbf{q_1} = \mathbf{v_1} / \|\mathbf{v_1}\|$, $\mathbf{v_1} = \mathbf{a_1}$), nous pouvons appliquer $\mathbf{P_{\bot \mathbf{q_{1}}}}$ à $\mathbf{a_2}, \mathbf{a_3}, \dots, \mathbf{a_N}$. Puis, quand $\mathbf{q_2}$ est connu, nous pouvons appliquer $\mathbf{P_{\bot \mathbf{q_{2}}}}$ à $\mathbf{P_{\bot \mathbf{q_{1}}}}\mathbf{a_3}, \mathbf{P_{\bot \mathbf{q_{1}}}}\mathbf{a_4}, \dots, \mathbf{P_{\bot \mathbf{q_{1}}}}\mathbf{a_N}$. Etc. Nous en déduisons l'algorithme de Gram-Schmidt modifié.
\begin{algorithm}[H]
\DontPrintSemicolon
\NoCaptionOfAlgo
\SetAlgoLined
\SetKwInput{Res}{Résultat}
\SetKwInOut{Input}{Entrée}\SetKwInOut{Output}{Sortie}
\SetKwFor{Pour}{pour}{faire}{finpour}
\SetKw{KwTo}{à}
\Res{Décomposition QR de la matrice A}
\Input{$\mathbf{A} \in \mathbb{R}^{M \times N}$, avec $M \geq N$}
\Output{$\mathbf{Q} \in \mathbb{R}^{M \times N}$ une matrice orthonormale \\
$\mathbf{R} \in \mathbb{R}^{N \times N}$ une matrice triangulaire supérieure \\
telles que $\mathbf{A} = \mathbf{Q} \mathbf{R}$}
\BlankLine
\Pour{$i \gets 1$ \KwTo $N$}{
$\mathbf{v_i} \gets \mathbf{a_i}$ \;
}
\Pour{$i \gets 1$ \KwTo $N$}{
$r_{ii} \gets \|\mathbf{v_i}\|$ \;
$\mathbf{q_i} \gets \mathbf{v_i} / r_{ii}$ \;
\Pour{$j \gets i+1$ \KwTo $N$}{
$r_{ij} \gets \mathbf{q_i}^T\mathbf{v_j}$ \;
$\mathbf{v_j} \gets \mathbf{v_j} - r_{ij}\mathbf{q_i}$ \;
}
}
\caption{Gram-Schmidt modifié (MGS)}
\end{algorithm}
## Comparaison de la stabilité numérique des deux versions de l'algorithme de Gram-Schmidt
Observons comment de petites erreurs de calculs se propagent dans le cas de l'algorithme de Gram-Schmidt (GS). Mettons qu'une petite erreur ait été commise sur le calcul de $\mathbf{q_2}$ qui s'en trouve de ce fait n'être pas parfaitement perpendiculaire à $\mathbf{q_1}$ :
\[
\mathbf{q_1}^T\mathbf{q_2} = \epsilon > 0
\]
Quelle est l'effet de cette erreur sur la valeur de $\mathbf{v_3}$ ?
\begin{align*}
\mathbf{v_3} &= \mathbf{a_3} - (\mathbf{q_1}^T\mathbf{a_3})\mathbf{q_1} -
(\mathbf{q_2}^T\mathbf{a_3})\mathbf{q_2} \\
\mathbf{q_2}^T\mathbf{v_3} &= \mathbf{q_2}^T\mathbf{a_3} - (\mathbf{q_1}^T\mathbf{a_3})\epsilon -
(\mathbf{q_2}^T\mathbf{a_3}) = - (\mathbf{q_1}^T\mathbf{a_3})\epsilon \\
\mathbf{q_1}^T\mathbf{v_3} &= \mathbf{q_1}^T\mathbf{a_3} - (\mathbf{q_1}^T\mathbf{a_3}) -
(\mathbf{q_2}^T\mathbf{a_3})\epsilon = - (\mathbf{q_2}^T\mathbf{a_3})\epsilon \\
\end{align*}
L'erreur commise sur $\mathbf{q_2}$ s'est transmise à $\mathbf{q_3}$ qui n'est plus parfaitement orthogonal à $\mathbf{q_1}$ et $\mathbf{q_2}$.
Pour l'algorithme de Gram-Schmidt modifié (MGS), nous avons :
\begin{align*}
\mathbf{v_3}^{(0)} &= \mathbf{a_3} \\
\mathbf{v_3}^{(1)} &= \mathbf{v_3}^{(0)} - \mathbf{q_1}^T\mathbf{v_3}^{(0)}\mathbf{q_1} \\
\mathbf{v_3} &= \mathbf{v_3}^{(1)} - \mathbf{q_2}^T\mathbf{v_3}^{(1)}\mathbf{q_2} \\
\mathbf{q_2}^T\mathbf{v_3} &= \mathbf{q_2}^T\mathbf{v_3}^{(1)} - \mathbf{q_2}^T\mathbf{v_3}^{(1)} = 0 \\
\end{align*}
Il n'y a pas d'erreur pour l'orthogonalité entre $\mathbf{q_3}$ et $\mathbf{q_2}$. Etudions maintenant l'erreur commise sur l'orthogonalité entre $\mathbf{q_3}$ et $\mathbf{q_1}$.
\begin{align*}
\mathbf{q_1}^T\mathbf{v_3} &= \mathbf{q_1}^T\mathbf{v_3}^{(1)} - \mathbf{q_2}^T\mathbf{v_3}^{(1)}\epsilon \\
\mathbf{q_2}^T\mathbf{v_3}^{(1)} &= \mathbf{q_2}^T\mathbf{v_3}^{(0)} - \mathbf{q_1}^T\mathbf{v_3}^{(0)}\epsilon \\
\mathbf{q_1}^T\mathbf{v_3}^{(1)} &= \mathbf{q_1}^T\mathbf{v_3}^{(0)} - \mathbf{q_1}^T\mathbf{v_3}^{(0)} = 0 \\
\mathbf{q_1}^T\mathbf{v_3} &= -(\mathbf{q_2}^T\mathbf{v_3}^{(0)} - \mathbf{q_1}^T\mathbf{v_3}^{(0)}\epsilon) =
-\mathbf{q_2}^T\mathbf{v_3}^{(0)}\epsilon + \mathbf{q_1}^T\mathbf{v_3}^{(0)}\epsilon^2
\end{align*}
Ainsi, comme pour la version classique de Gram-Schmidt, une erreur de l'ordre de grandeur de $\epsilon$ est commise sur l'orthogonalité entre $\mathbf{q_1}$ et $\mathbf{q_3}$. Par contre, il n'y a pas de propagation de l'erreur pour l'orthogonalité entre $\mathbf{q_2}$ et $\mathbf{q_3}$. C'est pourquoi l'algorithme de Gram-Schmidt modifié est numériquement plus stable que l'algorithme de Gram-Schmidt classique.
# Autres algorithmes
Notons qu'une autre approche très souvent employée pour le calcul de la décomposition QR est la méthode dite de Householder. Elle assure le maintien d'une quasi parfaite orthogonalité des colonnes de $\mathbf{Q}$. Il existe également l'approche dite des rotations de Givens, plus facilement parallélisable et permettant la mise à jour de la décomposition suite à l'ajout d'une ligne à la matrice $\mathbf{X}$.
Par contre, Gram-Schmidt permet de calculer la forme réduite de la décomposition QR, alors que les algorithmes de Givens et Householder calculent la forme complète. Ainsi, Gram-Schmidt n'est pas tout à fait aussi stable mais peut parfois être plus efficace.

BIN
ML1_12_factorisation_qr.pdf Normal file

Binary file not shown.

View File

@ -0,0 +1,72 @@
---
title: "ML 13 Puissance itérée par bloc et SVD"
output:
bookdown::pdf_document2:
number_section: yes
extra_dependencies:
algorithm2e: [ruled,vlined,linesnumbered]
toc: false
classoption: fleqn
---
# Principe et application à la décomposition en valeurs propres
Nous avons vu précédemment que la méthode de la puissance itérée permet de calculer la plus grande valeur propre et un vecteur propre associé pour une matrice carrée $\mathbf{A}$. La décomposition QR est au cœur d'une approche élégante pour étendre la méthode de la puissance itérée au calcul des $S$ plus grandes valeurs propres et lerus vecteurs propres associés.
Une itération consiste à multiplier $\mathbf{A}$ par un bloc $\mathbf{V} \in \mathbb{R}^{N \times S}$ de $S$ vecteurs colonnes. Si ce processus est répété, nous nous attendons à trouver le même résultat que pour la méthode de la puissance itérée : chaque colonne de $\mathbf{V}$ convergera vers le (même) plus grand vecteur propre.
Mais si, par une décomposition QR, nous forçons les colonnes de $\mathbf{V}$ à rester orthogonales, pour une matrice $\mathbf{A}$ symétrique, le processus itératif fera tendre ces colonnes vers différents vecteurs propres et la diagonale de $\mathbf{R}$ contiendra les valeurs propres correspondantes.
\begin{algorithm}[H]
\DontPrintSemicolon
\NoCaptionOfAlgo
\SetAlgoLined
\SetKwInput{Res}{Résultat}
\SetKwInOut{Input}{Entrée}\SetKwInOut{Output}{Sortie}
\SetKwFor{Tq}{tant que}{faire}{fintq}
\SetKw{KwTo}{à}
\Res{Vecteurs propres d'une matrice symétrique par la méthode de la puissance itérée par bloc}
\Input{$\mathbf{A} \in \mathbb{R}^{N \times N}$ symétrique \\
$\mathbf{V} \in \mathbb{R}^{N \times S}$}
\Output{Les colonnes de $\mathbf{V}$ sont les $S$ premiers vecteurs propres. \\
Les valeurs propres correspondantes sont sur la diagonale de $\mathbf{\Lambda}$.}
\BlankLine
\Tq{$err > \epsilon$}{
$\mathbf{B} \gets \mathbf{A}\mathbf{V}$ \;
$\mathbf{B} = \mathbf{Q}\mathbf{R}$ \;
$\mathbf{V} \gets S \text{ premières colonnes de } \mathbf{Q}$ \;
$\mathbf{\Lambda} \gets S \text{ premières valeurs diagonales de } R$ \;
$err \gets \|\mathbf{A}\mathbf{V} - \mathbf{V}\mathbf{\Lambda}\|$ \;
}
\caption{Puissance itérée par bloc pour les vecteurs propres}
\end{algorithm}
# Application à la décomposition en valeurs singulières
Nous pouvons de même adapter l'algorithme de la puissance itérée au cas du SVD pour calculer les $S$ plus grandes valeurs singulières et les vecteurs singuliers associés pour une matrice $\mathbf{A} \in \mathbb{R}^{M \times N}$.
\begin{algorithm}[H]
\DontPrintSemicolon
\NoCaptionOfAlgo
\SetAlgoLined
\SetKwInput{Res}{Résultat}
\SetKwInOut{Input}{Entrée}\SetKwInOut{Output}{Sortie}
\SetKwFor{Tq}{tant que}{faire}{fintq}
\SetKw{KwTo}{à}
\Res{Valeurs singulières d'une matrice symétrique par la méthode de la puissance itérée par bloc}
\Input{$\mathbf{A} \in \mathbb{R}^{M \times N}$ \\
$\mathbf{V} \in \mathbb{R}^{N \times S}$ peut être initialisée avec des $1$ sur la diagonale principale et des $0$ ailleurs.}
\Output{$\mathbf{U} \in \mathbb{R}^{M \times S}, \mathbf{V} \in \mathbb{R}^{N \times S}$ \\
$\mathbf{\Sigma} = diag(\sigma_1, \sigma_2, \dots, \sigma_S)$ \\
telles que $\mathbf{A}\mathbf{V} = \mathbf{U}\mathbf{\Sigma}$}
\BlankLine
\Tq{$err > \epsilon$}{
$\mathbf{A}\mathbf{V} = \mathbf{Q}\mathbf{R}$ \;
$\mathbf{U} \gets S \text{ premières colonnes de } \mathbf{Q}$ \;
$\mathbf{A}^T\mathbf{U} = \mathbf{Q}\mathbf{R}$ \;
$\mathbf{V} \gets S \text{ premières colonnes de } \mathbf{Q}$ \;
$\mathbf{\Sigma} \gets S \text{ premières lignes et colonnes de } R$ \;
$err \gets \|\mathbf{A}\mathbf{V} - \mathbf{U}\mathbf{\Sigma}\|$ \;
}
\caption{Puissance itérée par bloc pour le SVD}
\end{algorithm}

Binary file not shown.

View File

@ -0,0 +1,54 @@
---
title: "ML 14 Géométrie de la régression ridge et SVD"
output:
bookdown::pdf_document2:
number_section: yes
extra_dependencies:
algorithm2e: [ruled,vlined,linesnumbered]
toc: false
classoption: fleqn
---
# Coefficients de la régression ridge en fonction du SVD
Exprimons le calcul des coefficients d'une régression ridge en fonction de la décomposition en valeurs singulières de la matrice des données observées $\mathbf{X} \in \mathbb{R}^{M \times N}$.
\begin{align*}
& \mathbf{\hat{\beta}_\lambda} \\
= \{& \text{Voir la dérivation de la régression ridge dans un précédent module.} \} \\
& (\mathbf{X}^T\mathbf{X} + \lambda\mathbf{I})^{-1}\mathbf{X}^T\mathbf{y} \\
= \{& \text{SVD de $\mathbf{X}$ : } \mathbf{U}\mathbf{D}\mathbf{V}^T \quad
\mathbf{U} \in \mathbb{R}^{M \times M} \; , \;
\mathbf{D} \in \mathbb{R}^{M \times N} \; , \;
\mathbf{V} \in \mathbb{R}^{N \times N} \} \\
& (\mathbf{V}\mathbf{D}^T\mathbf{U}^T\mathbf{U}\mathbf{D}\mathbf{V}^T + \lambda\mathbf{I})^{-1}
\mathbf{V}\mathbf{D}^T\mathbf{U}^T \mathbf{y} \\
= \{& \text{$\mathbf{U}$ et $\mathbf{V}$ sont orthogonales : } \mathbf{I} = \mathbf{V}\mathbf{V}^T \} \\
& (\mathbf{V}\mathbf{D}^T\mathbf{D}\mathbf{V}^T + \lambda\mathbf{V}\mathbf{V}^T)^{-1} \mathbf{V}\mathbf{D}^T\mathbf{U}^T \mathbf{y} \\
= \phantom{\{}& \\
& (\mathbf{V}(\mathbf{D}^T\mathbf{D} + \lambda\mathbf{I})\mathbf{V}^T)^{-1} \mathbf{V}\mathbf{D}^T\mathbf{U}^T \mathbf{y} \\
= \{& (\mathbf{X}\mathbf{Y})^{-1} = \mathbf{Y}^{-1} \mathbf{X}^{-1} \quad
\text{$\mathbf{V}$ est orthogonale : } \mathbf{V}^{-1} = \mathbf{V}^T\} \\
& \mathbf{V}(\mathbf{D}^T\mathbf{D} + \lambda\mathbf{I})^{-1}\mathbf{V}^T\mathbf{V}\mathbf{D}^T\mathbf{U}^T \mathbf{y} \\
= \phantom{\{}& \\
& \mathbf{V}(\mathbf{D}^T\mathbf{D} + \lambda\mathbf{I})^{-1}\mathbf{D}^T\mathbf{U}^T \mathbf{y} \\
= \{& \text{Soit $d_j$ le jème élément sur la diagonale de $\mathbf{D}$,
$\mathbf{u_j}$ et $\mathbf{v_j}$ les jèmes colonnes de respectivement $\mathbf{U}$ et $\mathbf{V}$} \} \\
& \sum_{d_j>0} \mathbf{v_j} \frac{d_j}{d_j^2 + \lambda} \mathbf{u_j}^T\mathbf{y} \\
\end{align*}
Remarquons ainsi que la décomposition en valeurs singulières de $\mathbf{X}$ donne les coefficients de la régression ridge pour toutes les valeurs possibles du coefficient de régularisation $\lambda$.
# Régression ridge et géométrie
Observons la relation entre les étiquettes prédites $\mathbf{\hat{y}_\lambda}$ et les étiquettes observées $\mathbf{y}$.
\begin{align*}
\mathbf{\hat{y}_\lambda} &= \mathbf{X} \mathbf{\hat{\beta}_\lambda} \\
&= \mathbf{U}\mathbf{D}\mathbf{V}^T \mathbf{V}(\mathbf{D}^T\mathbf{D} + \lambda\mathbf{I})^{-1}\mathbf{D}^T\mathbf{U}^T \mathbf{y} \\
&= \sum_{d_j>0} \mathbf{u_j} \frac{d_j^2}{d_j^2 + \lambda} \mathbf{u_j}^T\mathbf{y} \\
\end{align*}
Nous remarquons qu'en labsence de régularisation, $\lambda = 0$, les valeurs estimées $\mathbf{\hat{y}}$ sont les projections sur les axes principaux $\mathbf{u_j}$ -- qui couvrent l'espace des colonnes de $\mathbf{X}$, i.e. $Im(\mathbf{X})$ -- des valeurs observées $\mathbf{y}$.
En présence de régularisation, $\lambda > 0$, les coordonnées, sur les axes principaux, de l'estimation $\mathbf{\hat{y}_\lambda}$ sont de plus en plus contractées lorsqu'on progresse vers les axes qui expliquent de moins en moins la variabilités des données.

Binary file not shown.