Ridge par svd avec standardisation.

Il faudra introduire la standardisation dès l'introduction de Tikhonov avec la version inefficace de l'algorithme, celle passant par le calcul explicite de la matrice de covariance.
This commit is contained in:
Pierre-Edouard Portier 2021-11-28 23:04:52 +01:00
parent 37661174c1
commit 9ea91c17b2
1 changed files with 24 additions and 1 deletions

View File

@ -1 +1,24 @@
#loocv
#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)
}