# Séparer le jeu de données en un jeu d'entraînement et un jeu de validation.
# INPUT : jeu de données initial et proportion des données conservées pour
#         l'entraînement.
xvalpart <- function(data,p) {
  n <- nrow(data$X)
  nentr <- round(p*n)
  entridx <- sample(1:n, nentr, replace=FALSE)
  list(entr  = list(X = data$X[entridx,,drop=FALSE],  Y = data$Y[entridx]),
       valid = list(X = data$X[-entridx,,drop=FALSE], Y = data$Y[-entridx]))
}

# Découper le jeu de données initial en entraînement et validation.
# Pour chaque valeur proposée de l'hyperparamètre alpha d'une régression ridge,
# apprendre un modèle sur le jeu d'entraînement.
# Retourner les coefficients du meilleur modèle avec la moyenne de la valeur
# absolue des erreurs commises par ce modèle sur le jeu de validation.
# La fonction ridge est défini dans le code source de la partie 3.
xvalridge <- function(alphas, data, degre, p) {
  tmp <- xvalpart(data,p)
  lcoef <- sapply(alphas, ridge, tmp$entr, degre)
  pred <- sapply(split(lcoef,col(lcoef)), polyeval, tmp$valid$X)
  meanabserrs <- colMeans(abs(pred - tmp$valid$Y))
  minmeanabserr <- min(meanabserrs)
  minidx <- which(meanabserrs == minmeanabserr)
  list(meanabserr = minmeanabserr, coef = lcoef[,minidx], alpha = alphas[minidx])
}