From ea59f1a35fc3ced1b1a60149418ac8851ab3fe22 Mon Sep 17 00:00:00 2001 From: Pierre-Edouard Portier Date: Sat, 16 Apr 2022 12:01:48 +0200 Subject: [PATCH] =?UTF-8?q?ajout=20d'un=20TP=20sur=20la=20r=C3=A9gression?= =?UTF-8?q?=20ridge=20=C3=A0=20noyau?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 22_tp_kernel_ridge_regression.Rmd | 124 ++++++++++++++++++++++++ 22_tp_kernel_ridge_regression_sujet.Rmd | 55 +++++++++++ 2 files changed, 179 insertions(+) create mode 100644 22_tp_kernel_ridge_regression.Rmd create mode 100644 22_tp_kernel_ridge_regression_sujet.Rmd diff --git a/22_tp_kernel_ridge_regression.Rmd b/22_tp_kernel_ridge_regression.Rmd new file mode 100644 index 0000000..8c5e055 --- /dev/null +++ b/22_tp_kernel_ridge_regression.Rmd @@ -0,0 +1,124 @@ +# TP - Régression ridge à noyau - Correction + +```{r, include=FALSE} +source("18_kernel_ridge_regression.R", local = knitr::knit_global()) +``` + +```{r} +set.seed(1123) +``` + +L'idée de cette expérimentation provient de la la référence [@rupp2015machine] qui introduit les concepts essentiels du machine learning pour un public de spécialistes en mécanique quantique. + +## Analyse de l'effet du paramètre $\sigma^2$ pour un noyau gaussien + +Soit un noyau gaussien $k$. +$$ +k(\mathbf{x_j},\mathbf{x_i}) = exp\left(-\frac{1}{\sigma^2}\|\mathbf{x_j}-\mathbf{x_i}\|^2\right) +$$ + +Générer des points $x_i$, par exemple entre $-5$ et $5$. +```{r} +X <- seq(from=-5,to=5,by=0.1) +``` + +Générer la matrice des similarités (ou noyau) $\mathbf{K}$, résultat de l'application de la fonction $k$ à chaque paire de points $(x_i,x_j)$. Le faire pour $\sigma$ égal à $0.5$, $1$ ou $2$. +```{r} +K05 <- gausskernel(X,0.5^2) +K1 <- gausskernel(X,1) +K2 <- gausskernel(X,2^2) +``` + +Afficher la courbe du noyau en $0$, c'est-à-dire $k(0,x)$. +```{r} +zi <- which(X==0) +KS <- cbind(K05[zi,],K1[zi,],K2[zi,]) +matplot(X,KS,type='l',lty=1:3,col=1:3) +legend("topleft", legend = c('0.5','1','2'), col=1:3, lty=1:3) +``` + +Afficher la courbe obtenue par une combinaison linéaire aléatoire des similarités entre une observation $x$ et l'ensemble des observations $x_i$ : +$$ +f(\mathbf{x}) = \sum_{i=1}^{n} \alpha_i k(\mathbf{x},\mathbf{x_i}) +$$ + +Comparer le type de courbes obtenues pour les différentes valeurs de $\sigma$. +```{r} +alphas=runif(length(X),min=-1,max=1) +yh05 <- K05 %*% alphas +yh1 <- K1 %*% alphas +yh2 <- K2 %*% alphas +yhs <- cbind(yh05,yh1,yh2) +matplot(X,yhs,type='l',lty=1:3,col=1:3) +legend("topleft", legend = c('0.5','1','2'), col=1:3, lty=1:3) +``` + +## Régression ridge à noyau sur un petite exemple synthétique + +Soit un jeu de données synthétique construit à partir de la fonction $cos(x)$ appliquée aux points $\left\{0,\pi/8,2\pi/8,3\pi/8,4\pi/8\right\}$ +```{r} +X <- pi/8 * seq(0,4) +y <- cos(X) +``` + +Apprendre un modèle par régression ridge à noyau sur ce jeu de données. Dans un premier temps : + +- considérer le jeu de données non bruité +- fixer l'hyper-paramètre de régularisation $\lambda$ presque à zéro (e.g., $10^{-14}$) +- comparer différentes valeurs de l'hyper-paramètre $\sigma$ qui contrôle le rayon du noyau gaussien (e.g., $0.01, 0.5, 10^4$) +- Afficher à chaque fois : le jeu de données, la courbe théorique, la courbe prédite, les courbes gaussiennes centrées sur chaque observation du jeu d'entraînement et dont la combinaison linéaire est la courbe prédite. + +```{r} +plotEachGaussian <- +function(X,y,km) +{ + xplt <- seq(0,pi/2,by=0.01) + + # plot the individual gaussian associated with each observation in X + # we use the code from predict.krr + newdata <- as.matrix(xplt) + newdata <- scale(newdata,center=attr(km$X,"scaled:center"), + scale=attr(km$X,"scaled:scale")) + n <- nrow(km$X) + nn <- nrow(newdata) + K <- gausskernel(rbind(newdata,km$X),sigma2=km$sigma2)[1:nn,(nn+1):(nn+n)] + matplot(xplt,sweep(K,2,km$coef,'*'),type='l',lty=2:n+1,col=2:n+1, + ylim=c(-1,1), + xlab='x',ylab='y', main=paste('sigma2=',km$sigma2,'lambda=',km$lambda)) + + # plot the true function and the dataset + points(xplt,cos(xplt),type='l',lty=1,col=1,lwd=2) + points(X,y) + + # plot the prediction for the training set + points(x=X,y=km$yh,pch=2) + + # plot the prediction for new points + yh <- predict(km,xplt) + points(xplt,yh,type='l',lty=1, col=1, lwd=1) +} +``` + +```{r} +km <- krr(X,y,sigma2=0.01^2,lambdas=c(10^(-14))) +plotEachGaussian(X,y,km) +``` + +```{r} +km <- krr(X,y,sigma2=0.5^2,lambdas=c(10^(-14))) +plotEachGaussian(X,y,km) +``` + +```{r} +km <- krr(X,y,sigma2=(10^4)^2,lambdas=c(10^(-14))) +plotEachGaussian(X,y,km) +``` + +Ensuite, vérifier le bon fonctionnement de l'approche proposée en cours qui fixe $\sigma^2$ au nombre de dimensions du jeu de données et qui détermine la valeur de $\lambda$ par validation croisée un contre tous. Discuter les rôles complémentaires des hyperparamètres $\sigma^2$ et $\lambda$. + +```{r} +km <- krr(X,y) +plotEachGaussian(X,y,km) +``` + +De nombreuses expériences complémentaires sont intéressantes à mener (comme étudier l'effet de l'ajout de bruit, etc.). \ No newline at end of file diff --git a/22_tp_kernel_ridge_regression_sujet.Rmd b/22_tp_kernel_ridge_regression_sujet.Rmd new file mode 100644 index 0000000..f0033b8 --- /dev/null +++ b/22_tp_kernel_ridge_regression_sujet.Rmd @@ -0,0 +1,55 @@ +# TP - Régression ridge à noyau - Sujet + +```{r, include=FALSE} +source("18_kernel_ridge_regression.R", local = knitr::knit_global()) +``` + +```{r} +set.seed(1123) +``` + +L'idée de cette expérimentation provient de la la référence [@rupp2015machine] qui introduit les concepts essentiels du machine learning pour un public de spécialistes en mécanique quantique. + +## Analyse de l'effet du paramètre $\sigma^2$ pour un noyau gaussien + +Soit un noyau gaussien $k$. +$$ +k(\mathbf{x_j},\mathbf{x_i}) = exp\left(-\frac{1}{\sigma^2}\|\mathbf{x_j}-\mathbf{x_i}\|^2\right) +$$ + +Générer des points $x_i$, par exemple entre $-5$ et $5$. + +```{r} +X <- seq(from=-5,to=5,by=0.1) +``` + +Générer la matrice des similarités (ou noyau) $\mathbf{K}$, résultat de l'application de la fonction $k$ à chaque paire de points $(x_i,x_j)$. Le faire pour $\sigma$ égal à $0.5$, $1$ ou $2$. + +Afficher la courbe du noyau en $0$, c'est-à-dire $k(0,x)$. + +Afficher la courbe obtenue par une combinaison linéaire aléatoire des similarités entre une observation $x$ et l'ensemble des observations $x_i$ : +$$ +f(\mathbf{x}) = \sum_{i=1}^{n} \alpha_i k(\mathbf{x},\mathbf{x_i}) +$$ + +Comparer le type de courbes obtenues pour les différentes valeurs de $\sigma$. + +## Régression ridge à noyau sur un petite exemple synthétique + +Soit un jeu de données synthétique construit à partir de la fonction $cos(x)$ appliquée aux points $\left\{0,\pi/8,2\pi/8,3\pi/8,4\pi/8\right\}$ + +```{r} +X <- pi/8 * seq(0,4) +y <- cos(X) +``` + +Apprendre un modèle par régression ridge à noyau sur ce jeu de données. Dans un premier temps : + +- considérer le jeu de données non bruité +- fixer l'hyper-paramètre de régularisation $\lambda$ presque à zéro (e.g., $10^{-14}$) +- comparer différentes valeurs de l'hyper-paramètre $\sigma$ qui contrôle le rayon du noyau gaussien (e.g., $0.01, 0.5, 10^4$) +- Afficher à chaque fois : le jeu de données, la courbe théorique, la courbe prédite, les courbes gaussiennes centrées sur chaque observation du jeu d'entraînement et dont la combinaison linéaire est la courbe prédite. + +Ensuite, vérifier le bon fonctionnement de l'approche proposée en cours qui fixe $\sigma^2$ au nombre de dimensions du jeu de données et qui détermine la valeur de $\lambda$ par validation croisée un contre tous. Discuter les rôles complémentaires des hyperparamètres $\sigma^2$ et $\lambda$. + +De nombreuses expériences complémentaires sont intéressantes à mener (comme étudier l'effet de l'ajout de bruit, etc.). \ No newline at end of file