X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=pkg%2FR%2FF_Neighbors2.R;h=ee40f61192dd744451e9e447ee1b5d8b62f404d1;hb=9003747badc4416d68cab45ff17de3ecea327942;hp=69e69dcca8e1c8a6938b97d410013401f922ae63;hpb=6774e53de7b8bdac191d6203a380ad46c3b4d9ba;p=talweg.git diff --git a/pkg/R/F_Neighbors2.R b/pkg/R/F_Neighbors2.R index 69e69dc..ee40f61 100644 --- a/pkg/R/F_Neighbors2.R +++ b/pkg/R/F_Neighbors2.R @@ -46,8 +46,7 @@ Neighbors2Forecaster = R6::R6Class("Neighbors2Forecaster", if (!is.na(prediction[1])) { nb_jours = nb_jours + 1 - error = error + - mean((data$getCenteredSerie(cv_days[i]+1)[1:horizon] - prediction)^2) + error = error + mean((data$getSerie(cv_days[i]+1)[1:horizon] - prediction)^2) } } return (error / nb_jours) @@ -56,12 +55,12 @@ Neighbors2Forecaster = R6::R6Class("Neighbors2Forecaster", if (simtype != "endo") { h_best_exo = optimize( - errorOnLastNdays, c(0,10), kernel=kernel, simtype="exo")$minimum + errorOnLastNdays, c(0,7), kernel=kernel, simtype="exo")$minimum } if (simtype != "exo") { h_best_endo = optimize( - errorOnLastNdays, c(0,10), kernel=kernel, simtype="endo")$minimum + errorOnLastNdays, c(0,7), kernel=kernel, simtype="endo")$minimum } if (simtype == "endo") @@ -97,16 +96,25 @@ Neighbors2Forecaster = R6::R6Class("Neighbors2Forecaster", return (NA) levelToday = data$getLevel(today) distances = sapply(fdays, function(i) abs(data$getLevel(i)-levelToday)) - dist_thresh = 1 + #TODO: 2, 3, 5, 10 magic numbers here... + dist_thresh = 2 + min_neighbs = min(3,length(fdays)) repeat { same_pollution = (distances <= dist_thresh) - if (sum(same_pollution) >= 2) #will eventually happen + nb_neighbs = sum(same_pollution) + if (nb_neighbs >= min_neighbs) #will eventually happen break - dist_thresh = dist_thresh + 1 + dist_thresh = dist_thresh + 3 } fdays = fdays[same_pollution] - if (length(fdays) == 1) + max_neighbs = 10 + if (nb_neighbs > max_neighbs) + { + # Keep only max_neighbs closest neighbors + fdays = fdays[ sort(distances[same_pollution],index.return=TRUE)$ix[1:max_neighbs] ] + } + if (length(fdays) == 1) #the other extreme... { if (final_call) { @@ -194,14 +202,15 @@ Neighbors2Forecaster = R6::R6Class("Neighbors2Forecaster", simils_endo else #mix simils_endo * simils_exo + similarities = similarities / sum(similarities) prediction = rep(0, horizon) for (i in seq_along(fdays)) - prediction = prediction + similarities[i] * data$getCenteredSerie(fdays[i]+1)[1:horizon] - prediction = prediction / sum(similarities, na.rm=TRUE) + prediction = prediction + similarities[i] * data$getSerie(fdays[i]+1)[1:horizon] if (final_call) { + prediction = prediction - mean(prediction) #predict centered serie (artificial...) private$.params$weights <- similarities private$.params$indices <- fdays private$.params$window <-