---
title: "TP R - Algorithmes de gradient stochastiques"
author: ''
date: ''
output:
  html_document: default
  pdf_document: default
---

```{r setup, message=FALSE}
library(ggplot2)
library(tidyr)
library(dplyr)
set.seed(123)
n <- 10000
p <- 5
theta_true <- c(-2,-1,0,1,2)

```

# Objectifs du TP

L'objectif de ce TP est d'étudier le comportement **d'un estimateur en ligne basé sur le gradient** dans les cadres :

- de la **régression linéaire**,
- de la **régression logistique**.

On s'intéressera à la convergence de l'estimateur \(\theta_i\) vers le vrai paramètre \(\theta\) et à l'évolution de l'erreur quadratique.

---

# 1. Régression linéaire

On considère le modèle

\[
Y_i = X_i^T \theta + \varepsilon_i,
\]

avec :

- \(\theta = (-2,-1,0,1,2)^T \in \mathbb{R}^5\),
- \(X_i \sim \mathcal{N}(0, I_5)\),
- \(\varepsilon_i \sim \mathcal{N}(0,1)\), indépendants.

On note \(n = 10000\).


1. Générer un échantillon \((X_i, Y_i)_{i=1,\dots,n}\).


```{r}

```


2. Écrire une fonction R qui ressorte l'ensemble des estimateurs 
\(\theta_i\), pour \(i = 0, \ldots, n-1\), définis par la descente de gradient stochastique :
\[
\theta_{i+1} = \theta_{i} + \gamma_{i+1} \nabla_\theta \left( (Y_{i+1} - X_{i+1}^T\theta_{i}\right)X_{i+1}.
\]
```{r}


```

3. Tracer l'évolution de l'erreur quadratique \(\|\theta_i-\theta\|^2\) pour un échantillon.

```{r}


```

4. Répéter l'expérience sur 50 échantillons indépendants et tracer l'erreur quadratique moyenne.

```{r}



```

---

# 2. Régression logistique

On se place dans le cadre de la régression logistique, i.e.
\[
\mathbb{P}(Y_i=1|X_i)=\sigma(X_i^T\theta),
\quad \sigma(t)=\frac{1}{1+e^{-t}}.
\]

On rappelle que l'algorithme de gradient stochastique est alors défini pour tout $i=0, \ldots ,n-1$ par
\[
\theta_{i+1} = \theta_{i} + \gamma_{t+1} \left( Y_{i+1} - \sigma \left( X_{i+1}^{T}\theta_{i} \right)\right) X_{i+1}
\]

Le code suivante permet de générer un échantillon de taille $n$ pour un $\theta$ donné. 


```{r}
sigmoid <- function(t) 1/(1+exp(-t))

X <- matrix(rnorm(n*p), n, p)
prob <- sigmoid(X %*% theta_true)
Y <- rbinom(n,1,prob)
```

1. Écrire une fonction R qui ressorte l'ensemble des estimateurs 


```{r}




```

2. Tracer l'évolution de l'erreur quadratique \(\|\theta_i-\theta\|^2\) pour un échantillon.

```{r}


```

---

# 3. Données MNIST

## Introduction aux données MNIST

La base de données **MNIST** (*Modified National Institute of Standards and Technology*) est une base de référence très utilisée en apprentissage automatique et en reconnaissance de formes. Elle est composée d’images de chiffres manuscrits allant de **0 à 9** et sert fréquemment de jeu de données “standard” pour tester et comparer des méthodes de classification.

La base MNIST contient :
- **60 000 images d’apprentissage**
- **10 000 images de test**

Chaque observation correspond à une image en niveaux de gris de taille **28 × 28 pixels**. Les images sont généralement représentées sous forme vectorielle : chaque image est transformée en un vecteur de **784 variables**, correspondant aux intensités des pixels, avec des valeurs comprises entre **0 et 255**.

L’objectif principal est de construire un modèle capable de **prédire le chiffre manuscrit** représenté sur une image à partir des valeurs des pixels. Il s’agit donc d’un problème de **classification supervisée**, le plus souvent :
- **multiclasse**, avec 10 classes (chiffres de 0 à 9),
- ou parfois **binaire**, par exemple pour distinguer un chiffre donné des autres.

Ici, on se placera dans le cadre binaire, i.e. on ne considèrera ques les chiffres 0 et 1 et on appliquera la régression logistique pour faire de la prévision.

Le code suivant permet d'extraire les données d'entrainement :

```{r}
library(dslabs)
mnist <- read_mnist()


data_train=mnist$train
I=which(data_train$label == 0 | data_train$label == 1)

Y_train=data_train$labels[I]
X_train=data_train$images[I,]
```

On obtient ce type d'images pour les données MNIST :
```{r, fig.width=6, fig.height=3}
par(mfrow = c(1, 2), mar = c(1, 1, 2, 1))

img1 <- matrix(X_train[1, ], 28, 28, byrow = TRUE)
img2 <- matrix(X_train[2, ], 28, 28, byrow = TRUE)

image(
  img1[, 28:1],
  col = gray.colors(256),
  axes = FALSE,
  asp = 1,
  main = paste("Label =", Y_train[1])
)

image(
  img2[, 28:1],
  col = gray.colors(256),
  axes = FALSE,
  asp = 1,
  main = paste("Label =", Y_train[2])
)
```

Dans ce qui suit, on se place dans le cadre de la régression logistique, i.e. on suppose 
\[
Y_{i} | X_{i} \sim \mathcal{B}\left(\sigma \left( \theta^{T}X_{i} \right) \right) .
\]


1. Estimer le paramètre $\theta$ à l'aide de l'algorithme de gradient stochastique.

```{r}

```

2. Pour prédire $Y_{i}$, on considère l'estimateur $\hat{\theta}$, et la prévision $\hat{Y}_{i} = 1$ si $\sigma \left( X_{i}^{T}\hat{\theta}\right) \geq 1/2$ et $0$ sinon. Calculer vos prévision sur les données d'entraînement, puis visualiser l'erreur de prévision avec la fonction **table** avant de calculer le taux de bonnes prévisions.


```{r}

```

3. Le code suivant permet d'extraire les données test.

```{r}

data_test=mnist$test
J=which(data_test$label == 0 | data_test$label == 1)

Y_test=data_test$labels[J]
X_test=data_test$images[J,]
```

Calculer les prédictions pour les données tests. Attention, il ne faut pas rééstimer $\theta$ mais conserver l'estimateur précédent.


```{r}


```
---
