intro_to_ml/15_loocv.R

24 lines
764 B
R

#loocv
# Résolution d'un système linéaire correspondant à la matrice de Gram pour
# un polynôme de degré fixé et avec l'ajout d'un facteur de régularisation en
# norme L2 dont l'importance est contrôlée par l'hyperparamètre alpha.
ridge.gram <- function(alpha, data, degre) {
A <- outer(c(data$X), 0:degre, "^")
gram <- t(A) %*% A
diag(gram) <- diag(gram) + alpha
solve(gram, as.vector(t(A) %*% data$Y))
}
ridge.svd <- function(alpha, data, degre) {
A <- scale(outer(c(data$X), 1:degre, "^"))
Y <- data$Y
Ym <- mean(Y)
Y <- Y - Ym
As <- svd(A)
d <- As$d
coef <- c(As$v %*% ((d / (d^2 + alpha)) * (t(As$u) %*% Y)))
coef <- coef / attr(A,"scaled:scale")
inter <- Ym - coef %*% attr(A,"scaled:center")
coef <- c(inter, coef)
}