Implémentation de la factorisation QR par Gram-Schmidt modifié.
This commit is contained in:
parent
639e14824c
commit
9d434badad
28
ML1_12_factorisation_qr.R
Normal file
28
ML1_12_factorisation_qr.R
Normal 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))
|
||||
}
|
@ -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/Gram–Schmidt_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.
@ -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.
Binary file not shown.
Loading…
Reference in New Issue
Block a user