ajout suffixe _code aux fichier R ; restructuration des chapitres

This commit is contained in:
Pierre-Edouard Portier 2023-01-02 21:45:54 +01:00
parent 6138583917
commit dd3dbed347
34 changed files with 78 additions and 82 deletions

View File

@ -1,7 +1,7 @@
# Introduction
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
```
## Contexte
@ -112,5 +112,5 @@ Il est improbable que ce polynôme, passant exactement par chaque observation, p
## Annexe code source
```{r, code=readLines("01_intro.R"), eval=FALSE}
```{r, code=readLines("01_intro_code.R"), eval=FALSE}
```

View File

@ -1,8 +1,8 @@
# Méthode des moindres carrés
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("02_moindres_carres.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("02_moindres_carres_code.R", local = knitr::knit_global())
```
## Espace de fonctions
@ -80,5 +80,5 @@ Ce polynôme de degré trois modélise mieux la fonction génératrice inconnue
## Annexe code source
```{r, code=readLines("02_moindres_carres.R"), eval=FALSE}
```{r, code=readLines("02_moindres_carres_code.R"), eval=FALSE}
```

View File

@ -1,8 +1,8 @@
# Régularisation de Tikhonov
# Régularisation de Tikhonov {#tikhonov}
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("03_tikhonov.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("03_tikhonov_code.R", local = knitr::knit_global())
```
## Problèmes linéaires mal posés
@ -119,5 +119,5 @@ Donc, en pénalisant les grandes valeurs de $\|\mathbf{W}\|_2$, on réduit la se
## Annexe code source
```{r, code=readLines("03_tikhonov.R"), eval=FALSE}
```{r, code=readLines("03_tikhonov_code.R"), eval=FALSE}
```

View File

@ -1,8 +1,8 @@
# Validation croisée
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("04_validation_croisee.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("04_validation_croisee_code.R", local = knitr::knit_global())
```
## Principe de la validation croisée
@ -55,5 +55,5 @@ pltpoly(reskfold$coef)
## Annexe code source
```{r, code=readLines("04_validation_croisee.R"), eval=FALSE}
```{r, code=readLines("04_validation_croisee_code.R"), eval=FALSE}
```

View File

@ -1,7 +1,7 @@
# SVD et Analyse en Composantes Principales
```{r, include=FALSE}
source("05_svd_pca.R", local = knitr::knit_global())
source("05_b_svd_pca_code.R", local = knitr::knit_global())
```
```{r}
@ -59,7 +59,7 @@ Nous écrivons une fonction `print.fa` qui affiche sur les axes principaux `d1`
Nous écrivons une fonction `away.fa` qui retourne le cluster (son identifiant, sa taille et les noms des observations qui le composent) qui a le plus d'inertie (i.e., qui est le plus éloigné du centre d'inertie, c'est-à-dire l'origine du repère pour des données centrées) le long de l'axe principal `d` (par défaut $1$).
```{r, code=readLines("05_svd_pca.R"), eval=FALSE}
```{r, code=readLines("05_b_svd_pca_code.R"), eval=FALSE}
```
## Exemple

View File

@ -1,7 +1,7 @@
# Présentation de la décomposition en valeurs singulières (SVD)
```{r, include=FALSE}
source("05_presentation_svd.R", local = knitr::knit_global())
source("05_presentation_svd_code.R", local = knitr::knit_global())
```
## Contexte
@ -135,5 +135,5 @@ print_grey_img(compress_SVD(X,256), main="d=256", asp=1);
## Annexe code source
```{r, code=readLines("05_presentation_svd.R"), eval=FALSE}
```{r, code=readLines("05_presentation_svd_code.R"), eval=FALSE}
```

View File

@ -1,7 +1,7 @@
# Factorisation QR
```{r, include=FALSE}
source("12_factorisation_qr.R", local = knitr::knit_global())
source("12_factorisation_qr_code.R", local = knitr::knit_global())
```
## Factorisation QR
@ -217,5 +217,5 @@ Or, si la matrice $\mathbf{R}\mathbf{x}$ n'est pas singulière (i.e., s'il n'y a
## Annexe code source
```{r, code=readLines("12_factorisation_qr.R"), eval=FALSE}
```{r, code=readLines("12_factorisation_qr_code.R"), eval=FALSE}
```

View File

@ -1,8 +1,8 @@
# Géométrie de la régression ridge et SVD
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("14_geometrie_ridge_svd.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("14_geometrie_ridge_svd_code.R", local = knitr::knit_global())
```
## Coefficients de la régression ridge en fonction du SVD
@ -109,5 +109,5 @@ En présence de régularisation, $\lambda > 0$, les coordonnées, sur les axes p
## Annexe code source
```{r, code=readLines("14_geometrie_ridge_svd.R"), eval=FALSE}
```{r, code=readLines("14_geometrie_ridge_svd_code.R"), eval=FALSE}
```

View File

@ -1,9 +1,9 @@
# Validation croisée un contre tous
# Validation croisée un contre tous {#loocv}
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("04_validation_croisee.R", local = knitr::knit_global())
source("15_loocv.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("04_validation_croisee_code.R", local = knitr::knit_global())
source("15_loocv_code.R", local = knitr::knit_global())
```
La validation croisée un contre tous (LOOCV, Leave One Out Cross Validation) est un cas extrême de la validation croisée à k plis. Pour un jeu de données constitué de n observations, il s'agit de faire une validation croisée à n plis. Nous estimons par LOOCV l'erreur commise par un modèle de régression ridge pour une valeur fixée de l'hyper-paramètre $\lambda$.
@ -158,5 +158,5 @@ pltpoly(rm$coef)
## Annexe code source
```{r, code=readLines("15_loocv.R"), eval=FALSE}
```{r, code=readLines("15_loocv_code.R"), eval=FALSE}
```

View File

@ -8,9 +8,9 @@ output:
---
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("04_validation_croisee.R", local = knitr::knit_global())
source("15_loocv.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("04_validation_croisee_code.R", local = knitr::knit_global())
source("15_loocv_code.R", local = knitr::knit_global())
```
# Validation croisée un contre tous (Leave-One-Out Cross-Validation)

View File

@ -1,4 +1,4 @@
# Biais et variance d'un estimateur
# Biais et variance d'un estimateur {#biais-variance}
## Biais et variance pour l'estimateur d'un paramètre d'un modèle paramétrique

View File

@ -1,4 +1,4 @@
# Biais et variance des paramètres d'une régression ridge
# Biais et variance des paramètres d'une régression ridge {#biais-variance-ridge}
## Biais des coefficients d'un modèle de régression ridge

View File

@ -1,9 +1,9 @@
# Régression ridge à noyau
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("04_validation_croisee.R", local = knitr::knit_global())
source("18_kernel_ridge_regression.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("04_validation_croisee_code.R", local = knitr::knit_global())
source("18_kernel_ridge_regression_code.R", local = knitr::knit_global())
```
## Noyau gaussien
@ -250,5 +250,5 @@ Ce modèle atteint une erreur absolue moyenne de `r testmae` sur le jeu de test.
## Annexe code source
```{r, code=readLines("18_kernel_ridge_regression.R"), eval=FALSE}
```{r, code=readLines("18_kernel_ridge_regression_code.R"), eval=FALSE}
```

View File

@ -8,9 +8,9 @@ output:
---
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("04_validation_croisee.R", local = knitr::knit_global())
source("18_kernel_ridge_regression.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("04_validation_croisee_code.R", local = knitr::knit_global())
source("18_kernel_ridge_regression_code.R", local = knitr::knit_global())
```
# Noyau gaussien

View File

@ -1,9 +1,9 @@
# Approximation de Nyström
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("04_validation_croisee.R", local = knitr::knit_global())
source("18_kernel_ridge_regression.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("04_validation_croisee_code.R", local = knitr::knit_global())
source("18_kernel_ridge_regression_code.R", local = knitr::knit_global())
```
## Approximation de Nyström d'un noyau

View File

@ -8,9 +8,9 @@ output:
---
```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("04_validation_croisee.R", local = knitr::knit_global())
source("18_kernel_ridge_regression.R", local = knitr::knit_global())
source("01_intro_code.R", local = knitr::knit_global())
source("04_validation_croisee_code.R", local = knitr::knit_global())
source("18_kernel_ridge_regression_code.R", local = knitr::knit_global())
```
# Approximation de Nyström d'un noyau

View File

@ -1,10 +1,10 @@
# TP - Régression ridge et dilemme biais-variance - Correction
# Régression ridge et dilemme biais-variance - Expérimentation
```{r}
set.seed(1123)
```
L'idée de cette expérimentation provient de la référence @hastie2020ridge.
L'idée de cette expérimentation provient de la référence [@hastie2020ridge].
## Générer un jeu de données synthétique
@ -19,18 +19,18 @@ p <- 55
Utiliser $n=`r n`$ et $p=`r p`$. Les $\mathbf{x_i}$ sont indépendants et suivent, par exemple, une distribution uniforme entre $0$ et $1$ (voir la fonction `runif`). Faire en sorte que les colonnes de $\mathbf{X}$ soient de moyenne nulle et de variance unité (voir la fonction `scale`). Cela simplifie les calculs ultérieurs sans perte de généralité.
```{r}
sig2 <- 6 # standard deviation for zero-mean gaussian noise
X <- matrix(runif(n*p),nrow=n,ncol=p)
sd <- 6 # standard deviation for zero-mean gaussian noise
X <- matrix(runif(n*p), nrow = n, ncol = p)
X <- scale(X)
beta <- runif(p, min=-10, max=10)
y <- X%*%beta + rnorm(n, mean=0, sd=sig2)
beta <- runif(p, min = -10, max = 10)
y <- X%*%beta + rnorm(n, mean=0, sd=sd)
```
## Calculer les coefficients d'une régression ridge
Tracer l'évolution des valeurs des coefficients d'un modèle ridge pour différentes valeurs de l'hyper-paramètre de régularisation $\lambda$. Réutiliser le code introduit au chapitre 15 sur la validation croisée un-contre-tous (voir le fichier `15_loocv.R`).
Tracer l'évolution des valeurs des coefficients d'un modèle ridge pour différentes valeurs de l'hyper-paramètre de régularisation $\lambda$. Réutiliser le code introduit au chapitre \@ref(loocv) sur la validation croisée un-contre-tous.
Dans cette implémentation, les étiquettes $\mathbf{y}$ sont centrées avant d'opérer la régression ridge. Dans le contexte de cette expérimentation, il peut être intéressant de proposer une version pour laquelle les étiquettes ne sont pas centrées. Quelle est la différence ? La réponse est liée à la présentation de la standardisation au chapitre 3 sur la régularisation de Tikhonov.
Dans cette implémentation, les étiquettes $\mathbf{y}$ sont centrées avant d'opérer la régression ridge. Dans le contexte de cette expérimentation, il peut être intéressant de proposer une version pour laquelle les étiquettes ne sont pas centrées. Quelle est la différence ? La réponse est liée à la présentation de la standardisation au chapitre \@ref(tikhonov) sur la régularisation de Tikhonov.
```{r}
ridgeSVD <-
@ -44,8 +44,8 @@ function(X, y)
d <- Xs$d
function(lambda) {
coef <- c(Xs$v %*% ((d / (d^2 + lambda)) * (t(Xs$u) %*% y)))
coef <- coef / attr(X,"scaled:scale")
inter <- - coef %*% attr(X,"scaled:center")
coef <- coef / attr(X, "scaled:scale")
inter <- - coef %*% attr(X, "scaled:center")
coef <- c(inter, coef)
trace.H <- sum(d^2 / (d^2 + lambda))
yh <- coef[1] + X.init%*%coef[-1]
@ -84,7 +84,7 @@ function(X, y, lambdas)
```
```{r}
lambdas <- 10^seq(-1,3,by=0.1)
lambdas <- 10^seq(-1, 3, by = 0.1)
rm <- ridge(X, y, lambdas)
matplot(rm$lambdas, rm$coefs, type=c('l'), pch=1, col='black', lty=1, log="x")
abline(v=rm$lambda, col='green')
@ -93,9 +93,9 @@ points(x=rep(rm$lambda,length(beta)), y=beta, col='green', pch=19)
## Espérance de l'erreur de prédiction
Pour les différentes valeurs de $\lambda$, calculer l'espérance de l'erreur de prédiction (c'est ici possible car les données sont simulées et nous connaissons le modèle qui les a générées). Cette notion a été introduite à la fin du chapitre 16. Quelle est la valeur de $\lambda$ qui minimise une estimation de l'espérance de l'erreur de prédiction ? Comment se compare-t-elle à la valeur trouvée par validation croisée un-contre-tous ? Étudier les effets du nombre d'observations, du nombre de variables et de la quantité de bruit.
Pour les différentes valeurs de $\lambda$, calculer l'espérance de l'erreur de prédiction (c'est ici possible car les données sont simulées et nous connaissons le modèle qui les a générées). Cette notion a été introduite à la fin du chapitre \@ref(biais-variance). Quelle est la valeur de $\lambda$ qui minimise une estimation de l'espérance de l'erreur de prédiction ? Comment se compare-t-elle à la valeur trouvée par validation croisée un-contre-tous ? Étudier les effets du nombre d'observations, du nombre de variables et de la quantité de bruit.
Soit $h$ le modèle ridge et $\mathbf{x}^*$ une observation dont on cherche à prédire la cible. Nous savons que l'espérance de l'erreur de prédiction est (voir chapitre 16) :
Soit $h$ le modèle ridge et $\mathbf{x}^*$ une observation dont on cherche à prédire la cible. Nous savons que l'espérance de l'erreur de prédiction est (voir chapitre \@ref(biais-variance)) :
$$
\begin{aligned}
& E\left[ \left( h(\mathbf{x}^*) - y^* \right)^2 \right] \\
@ -106,7 +106,7 @@ $$
\end{aligned}
$$
Sous hypothèse d'un modèle génératif linéaire, nous avons calculé les valeurs de la variance et du biais des estimateurs d'un modèle ridge exprimés en fonction de la décomposition en valeurs singulières de $\mathbf{X}$ (notée, $\mathbf{X} = \mathbf{U}\mathbf{D}\mathbf{V}^T$) (voir chapitre 17).
Sous hypothèse d'un modèle génératif linéaire, nous avons calculé les valeurs de la variance et du biais des estimateurs d'un modèle ridge exprimés en fonction de la décomposition en valeurs singulières de $\mathbf{X}$ (notée, $\mathbf{X} = \mathbf{U}\mathbf{D}\mathbf{V}^T$) (voir chapitre \@ref(biais-variance-ridge)).
$$
\begin{aligned}
Var\left(\hat{\boldsymbol\beta}_\lambda\right) &= \sigma^2 \sum_{d_j>0} \frac{d_j^2}{(d_j^2 + \lambda)^2} \mathbf{v_j}\mathbf{v_j}^T \\
@ -135,7 +135,7 @@ Nous introduisons les fonctions qui calculent $Var\left(\hat{\boldsymbol\beta}_\
n2 <- 10000
X2 <- matrix(runif(n2*p),nrow=n2,ncol=p)
X2 <- scale(X2)
y2 <- X2%*%beta + rnorm(n2, mean=0, sd=sig2)
y2 <- X2%*%beta + rnorm(n2, mean=0, sd=sd)
Xs <- svd(X2)
@ -145,7 +145,7 @@ function(lambda)
{
d <- (Xs$d^2)/(Xs$d^2 + lambda)^2
var <- multdiag(Xs$v,d)
var <- sig2^2 * tcrossprod(var,Xs$v)
var <- sd^2 * tcrossprod(var,Xs$v)
}
bias <-
@ -163,7 +163,7 @@ function(lambda)
bias <- bias(lambda)
epe <- mean(rowSums(X2*(X2%*%var)))
epe <- epe + mean((X2%*%bias)^2)
epe <- epe + sig2^2
epe <- epe + sd^2
}
epes <- sapply(lambdas, epe)

View File

@ -4,7 +4,7 @@
set.seed(1123)
```
L'idée de cette expérimentation provient de la référence @hastie2020ridge.
L'idée de cette expérimentation provient de la référence [@hastie2020ridge].
## Générer un jeu de données synthétique

View File

@ -1,7 +1,7 @@
# TP - Projection aléatoire - `housing` PCA - Correction
```{r, include=FALSE}
source("05_svd_pca.R", local = knitr::knit_global())
source("05_b_svd_pca_code.R", local = knitr::knit_global())
```
```{r}

View File

@ -1,7 +1,7 @@
# TP - Projection aléatoire - `housing` ELM - Correction
```{r, include=FALSE}
source("15_loocv.R", local = knitr::knit_global())
source("15_loocv_code.R", local = knitr::knit_global())
```
```{r}

View File

@ -1,7 +1,7 @@
# Projection aléatoire - `sinc` - Correction
# Projection aléatoire - Expérimentation
```{r, include=FALSE}
source("15_loocv.R", local = knitr::knit_global())
source("15_loocv_code.R", local = knitr::knit_global())
```
```{r}
@ -13,13 +13,13 @@ L'idée de cette expérimentation provient de la la référence [@huang2006extre
## Générer un jeu de données synthétique avec la fonction `sinc`
Utiliser la fonction `sinc` pour générer un jeu de données $\{y_i,x_i\}$.
$$
\[
y(x)=
\begin{cases}
sin(x)/x & x\neq0, \\
1 & x=0
\end{cases}
$$
\]
Les $x_i$ sont distribués de façon uniforme sur l'intervalle $(-10,10)$. Un bruit (par exemple uniforme ou gaussien) est ajouté aux étiquettes $y_i$.
@ -52,18 +52,18 @@ points(X,y, pch=20)
## Régression ridge après projections non-linéaires aléatoires
Créer un modèle qui a la forme d'un réseau de neurones à une couche.
$$
\[
\hat{y}_i = \sum_{j=1}^{m} \beta_j g\left( \mathbf{w_j}\mathbf{x_i}^T + b_j \right) \quad i=1,\dots,n
$$
\]
Cependant, contrairement à un réseau de neurones, les $m$ vecteurs $\mathbf{w_j}$ et scalaires $b_j$ sont initialisés aléatoirement et ne sont jamais modifiés. La fonction $g$ est une transformation non-linéaire (par ex., la fonction ReLU $g(x)=max(0,x)$, ou la fonction sigmoïde $g(x)=1/(1+exp(-x))$, etc.). Seuls les paramètres $\beta_j$ sont inférés par régression ridge en utilisant la matrice $\mathbf{H}$ ci-dessous au lieu de la martice $\mathbf{X}$ initiale.
$$
\[
\mathbf{H} =
\left[ \begin{array}{ccc}
g\left( \mathbf{w_1}\mathbf{x_1}^T + b_1 \right) & \dots & g\left( \mathbf{w_m}\mathbf{x_1}^T + b_m \right) \\
\vdots & \dots & \vdots \\
g\left( \mathbf{w_1}\mathbf{x_n}^T + b_1 \right) & \dots & g\left( \mathbf{w_m}\mathbf{x_n}^T + b_m \right) \\
\end{array} \right]
$$
\]
Étudier les effets de la taille du jeu d'apprentissage, de la quantité de bruit, de l'hyperparamètre de régularisation, du nombre de transformations aléatoires, de la fonction non linéaire choisie, etc.

View File

@ -1,7 +1,7 @@
# TP - Régression ridge à noyau - Correction
# Régression ridge à noyau - Expérimentation
```{r, include=FALSE}
source("18_kernel_ridge_regression.R", local = knitr::knit_global())
source("18_kernel_ridge_regression_code.R", local = knitr::knit_global())
```
```{r}

View File

@ -1,7 +1,7 @@
# TP - Régression ridge à noyau - Sujet
```{r, include=FALSE}
source("18_kernel_ridge_regression.R", local = knitr::knit_global())
source("18_kernel_ridge_regression_code.R", local = knitr::knit_global())
```
```{r}

View File

@ -9,6 +9,7 @@ rmd_files: ["index.Rmd",
"05_presentation_svd.Rmd",
"05_b_svd_pca.Rmd",
"05_c_svd_ca.Rmd",
"05_d_svd_mca.Rmd",
"06_matrice_definie_non_negative.Rmd",
"07_multiplicateurs_de_lagrange.Rmd",
"08_derivation_svd.Rmd",
@ -21,14 +22,9 @@ rmd_files: ["index.Rmd",
"15_loocv.Rmd",
"16_biais_variance_estimateur.Rmd",
"17_biais_variance_ridge.Rmd",
"18_kernel_ridge_regression.Rmd",
"19_nystroem_approximation.Rmd",
"20_tp_dilemme_biais_variance_sujet.Rmd",
"20_tp_dilemme_biais_variance.Rmd",
"21_tp_projection_aleatoire_sujet.Rmd",
"21_tp_projection_aleatoire.Rmd",
"21_b_tp_projection_aleatoire_housing_pca.Rmd",
"21_c_tp_projection_aleatoire_housing_elm.Rmd",
"22_tp_kernel_ridge_regression_sujet.Rmd",
"18_kernel_ridge_regression.Rmd",
"22_tp_kernel_ridge_regression.Rmd",
"19_nystroem_approximation.Rmd",
"99_references.Rmd"]