# TP - Régression ridge à noyau - Sujet

```{r, include=FALSE}
source("18_kernel_ridge_regression_code.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.).