Implémentation de la factorisation QR par Gram-Schmidt modifié.

This commit is contained in:
Pierre-Edouard Portier 2021-09-26 22:15:44 +02:00
parent 639e14824c
commit 9d434badad
6 changed files with 43 additions and 1 deletions

28
ML1_12_factorisation_qr.R Normal file
View File

@ -0,0 +1,28 @@
# Norm 2
Norm <- function(x) {
stopifnot(is.numeric(x))
sqrt(sum(x^2))
}
# Modified Gram-Schmidt
mgs <- function(A, tol = .Machine$double.eps^0.5) {
stopifnot(is.numeric(A), is.matrix(A))
M <- nrow(A); N <- ncol(A)
if(M<N) stop("Le nombre de lignes de 'A' doit être supérieur ou égal au nombre
de colonnes")
Q <- matrix(0, M, N)
R <- matrix(0, N, N)
for (i in 1:N) Q[,i] <- A[,i]
for (i in 1:N) {
R[i,i] <- Norm(Q[,i])
if (abs(R[i,i]) <= tol) stop("La matrice 'A' n'est pas de plein rang.")
Q[,i] <- Q[,i] / R[i,i]
j <- i+1
while(j<=N) {
R[i,j] <- t(Q[,i]) %*% Q[,j]
Q[,j] <- Q[,j] - R[i,j] * Q[,i]
j <- j+1
}
}
return(list(Q = Q, R = R))
}

View File

@ -9,6 +9,10 @@ toc: false
classoption: fleqn
---
```{r, include=FALSE}
source("ML1_12_factorisation_qr.R", local = knitr::knit_global())
```
# 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.
@ -149,6 +153,16 @@ telles que $\mathbf{A} = \mathbf{Q} \mathbf{R}$}
\caption{Gram-Schmidt modifié (MGS)}
\end{algorithm}
## Test de l'algorithme
Nous comparons notre implémentation (voir la fonction `mgs` dans le code source associé à ce module) avec le résultat d'un petit exemple issu de [Wikipedia](https://en.wikipedia.org/wiki/GramSchmidt_process#Example).
```{r}
mat <- matrix(c(3,2,1,2),nrow=2,ncol=2,byrow = TRUE)
qr <- mgs(mat)
all.equal(qr$Q, (1/(sqrt(10))) * matrix(c(3,1,-1,3),nrow=2,ncol=2))
```
## 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}$ :

Binary file not shown.

View File

@ -11,7 +11,7 @@ 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.
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 leurs 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.

Binary file not shown.