2021-10-16 16:45:21 -04:00
|
|
|
# ML 1 01 Intro
|
|
|
|
|
|
|
|
# Exemple de fonction non-linéaire pour générer un jeu de données artificiel.
|
|
|
|
f <- function(x) {exp(x) * cos(2*pi*sin(pi*x))}
|
|
|
|
|
|
|
|
# Génération d'un jeu de données synthétique qui est l'image par f d'un
|
|
|
|
# échantillon uniforme de l'intervalle [0,1] auquel nous ajoutons un bruit
|
|
|
|
# gaussien de moyenne nulle et d'écart type sd.
|
2021-11-28 17:02:50 -05:00
|
|
|
gendat <- function(n, sd) {
|
|
|
|
# n: nombre d'observations à générer
|
2021-10-16 16:45:21 -04:00
|
|
|
# sd: écart type d'un bruit gaussien de moyenne nulle
|
2021-11-28 17:02:50 -05:00
|
|
|
X = runif(n)
|
|
|
|
Y = f(X) + rnorm(n, mean=0, sd=sd)
|
|
|
|
dim(X) <- c(n,1) # en général chaque observation est décrite par plusieurs
|
2021-10-16 16:45:21 -04:00
|
|
|
# variables et X est une matrice avec autant de lignes que
|
|
|
|
# d'observations et autant de colonnes que de variables. Sur
|
|
|
|
# notre exemple, chaque observation n'est décrite que par une
|
|
|
|
# seule variable.
|
|
|
|
list(X = X, Y = Y)
|
|
|
|
}
|
|
|
|
|
|
|
|
# Affichage simultanée du jeu de données bruité et de la courbe de la fonction
|
|
|
|
# utilisée pour le générer.
|
|
|
|
plt <- function(data, f, ...) {
|
|
|
|
xs = seq(0,1,length.out=100)
|
|
|
|
plot(xs, f(xs), type="l", ...)
|
|
|
|
points(data$X, data$Y)
|
|
|
|
}
|
|
|
|
|
|
|
|
# Résolution du système linéaire correspondant à la matrice de Vandermonde.
|
|
|
|
# Autrement dit, découverte d'un polynôme qui passe par chaque point.
|
|
|
|
polyreg1 <- function(data) {
|
|
|
|
xs <- c(data$X) # on transforme la matrice X, de dimension Nx1 sur notre
|
|
|
|
# exemple, en un vecteur
|
|
|
|
vandermonde = outer(xs, 0:(length(xs)-1), "^")
|
|
|
|
solve(vandermonde, data$Y)
|
|
|
|
}
|
|
|
|
|
|
|
|
# Evaluation d'un polynôme en un point.
|
|
|
|
polyeval <- function(coef,x) {
|
|
|
|
powers = 0:(length(coef)-1)
|
|
|
|
f = function(y) { sum(coef * y^powers) }
|
|
|
|
sapply(x,f)
|
|
|
|
}
|
|
|
|
|
|
|
|
# Affichage de la courbe d'un polynôme défini par ses coefficients.
|
|
|
|
pltpoly <- function(coef) {
|
|
|
|
xs = seq(0,1,length.out=100)
|
|
|
|
lines(xs, polyeval(coef,xs), lty="dotted")
|
|
|
|
}
|