first tests for Neighbors2 after debug; TODO: some missing forecasts
[talweg.git] / reports / report.gj
1 -----
2 <h2>Introduction</h2>
3
4 J'ai fait quelques essais dans différentes configurations pour la méthode "Neighbors"
5 (la seule dont on a parlé) et sa variante récente appelée pour l'instant "Neighbors2".<br>
6
7 * simtype="exo", "endo" ou "mix" : type de similarités (fenêtre optimisée par VC)
8 * same_season=FALSE : les indices pour la validation croisée ne tiennent pas compte des saisons
9 * mix_strategy="mult" : on multiplie les poids (au lieu d'en éteindre)
10
11 J'ai systématiquement comparé à une approche naïve : la moyennes des lendemains des jours
12 "similaires" dans tout le passé ; à chaque fois sans prédiction du saut (sauf pour Neighbors :
13 prédiction basée sur les poids calculés).
14
15 Ensuite j'affiche les erreurs, quelques courbes prévues/mesurées, quelques filaments puis les
16 histogrammes de quelques poids. Concernant les graphes de filaments, la moitié gauche du graphe
17 correspond aux jours similaires au jour courant, tandis que la moitié droite affiche les
18 lendemains : ce sont donc les voisinages tels qu'utilisés dans l'algorithme.
19
20 <%
21 list_titles = ['Pollution par chauffage', 'Pollution par épandage', 'Semaine non polluée']
22 list_indices = ['indices_ch', 'indices_ep', 'indices_np']
23 %>
24 -----r
25 library(talweg)
26
27 P = ${P} #instant de prévision
28 H = ${H} #horizon (en heures)
29
30 ts_data = read.csv(system.file("extdata","pm10_mesures_H_loc_report.csv",package="talweg"))
31 exo_data = read.csv(system.file("extdata","meteo_extra_noNAs.csv",package="talweg"))
32 data = getData(ts_data, exo_data, input_tz = "Europe/Paris", working_tz="Europe/Paris",
33 predict_at=P) #predict from P+1 to P+H included
34
35 indices_ch = seq(as.Date("2015-01-18"),as.Date("2015-01-24"),"days")
36 indices_ep = seq(as.Date("2015-03-15"),as.Date("2015-03-21"),"days")
37 indices_np = seq(as.Date("2015-04-26"),as.Date("2015-05-02"),"days")
38
39 % for i in range(3):
40 -----
41 <h2 style="color:blue;font-size:2em">${list_titles[i]}</h2>
42 -----r
43 p_nn_exo = computeForecast(data, ${list_indices[i]}, "Neighbors", "Neighbors",
44 horizon=H, simtype="exo")
45 p_nn_mix = computeForecast(data, ${list_indices[i]}, "Neighbors", "Neighbors",
46 horizon=H, simtype="mix")
47 p_az = computeForecast(data, ${list_indices[i]}, "Average", "Zero",
48 horizon=H)
49 p_pz = computeForecast(data, ${list_indices[i]}, "Persistence", "Zero",
50 horizon=${H}, same_day=${'TRUE' if loop.index < 2 else 'FALSE'})
51 -----r
52 e_nn_exo = computeError(data, p_nn_exo, H)
53 e_nn_mix = computeError(data, p_nn_mix, H)
54 e_az = computeError(data, p_az, H)
55 e_pz = computeError(data, p_pz, H)
56 options(repr.plot.width=9, repr.plot.height=7)
57 plotError(list(e_nn_mix, e_pz, e_az, e_nn_exo), cols=c(1,2,colors()[258], 4))
58
59 # Noir: neighbors_mix, bleu: neighbors_exo, vert: moyenne, rouge: persistence
60
61 i_np = which.min(e_nn_exo$abs$indices)
62 i_p = which.max(e_nn_exo$abs$indices)
63 -----r
64 options(repr.plot.width=9, repr.plot.height=4)
65 par(mfrow=c(1,2))
66
67 plotPredReal(data, p_nn_exo, i_np); title(paste("PredReal nn exo day",i_np))
68 plotPredReal(data, p_nn_exo, i_p); title(paste("PredReal nn exo day",i_p))
69
70 plotPredReal(data, p_nn_mix, i_np); title(paste("PredReal nn mix day",i_np))
71 plotPredReal(data, p_nn_mix, i_p); title(paste("PredReal nn mix day",i_p))
72
73 plotPredReal(data, p_az, i_np); title(paste("PredReal az day",i_np))
74 plotPredReal(data, p_az, i_p); title(paste("PredReal az day",i_p))
75
76 # Bleu: prévue, noir: réalisée
77 -----r
78 par(mfrow=c(1,2))
79 f_np_exo = computeFilaments(data, p_nn_exo, i_np, plot=TRUE); title(paste("Filaments nn exo day",i_np))
80 f_p_exo = computeFilaments(data, p_nn_exo, i_p, plot=TRUE); title(paste("Filaments nn exo day",i_p))
81
82 f_np_mix = computeFilaments(data, p_nn_mix, i_np, plot=TRUE); title(paste("Filaments nn mix day",i_np))
83 f_p_mix = computeFilaments(data, p_nn_mix, i_p, plot=TRUE); title(paste("Filaments nn mix day",i_p))
84 -----r
85 par(mfrow=c(1,2))
86 plotFilamentsBox(data, f_np_exo); title(paste("FilBox nn exo day",i_np))
87 plotFilamentsBox(data, f_p_exo); title(paste("FilBox nn exo day",i_p))
88
89 plotFilamentsBox(data, f_np_mix); title(paste("FilBox nn mix day",i_np))
90 plotFilamentsBox(data, f_p_mix); title(paste("FilBox nn mix day",i_p))
91 -----r
92 par(mfrow=c(1,2))
93 plotRelVar(data, f_np_exo); title(paste("StdDev nn exo day",i_np))
94 plotRelVar(data, f_p_exo); title(paste("StdDev nn exo day",i_p))
95
96 plotRelVar(data, f_np_mix); title(paste("StdDev nn mix day",i_np))
97 plotRelVar(data, f_p_mix); title(paste("StdDev nn mix day",i_p))
98
99 # Variabilité globale en rouge ; sur les 60 voisins (+ lendemains) en noir
100 -----r
101 par(mfrow=c(1,2))
102 plotSimils(p_nn_exo, i_np); title(paste("Weights nn exo day",i_np))
103 plotSimils(p_nn_exo, i_p); title(paste("Weights nn exo day",i_p))
104
105 plotSimils(p_nn_mix, i_np); title(paste("Weights nn mix day",i_np))
106 plotSimils(p_nn_mix, i_p); title(paste("Weights nn mix day",i_p))
107
108 # - pollué à gauche, + pollué à droite
109 -----r
110 # Fenêtres sélectionnées dans ]0,10] / endo à gauche, exo à droite
111 p_nn_exo$getParams(i_np)$window
112 p_nn_exo$getParams(i_p)$window
113
114 p_nn_mix$getParams(i_np)$window
115 p_nn_mix$getParams(i_p)$window
116 % endfor
117 -----
118 <h2>Bilan</h2>
119
120 Problème difficile : on ne fait guère mieux qu'une naïve moyenne des lendemains des jours
121 similaires dans le passé, ce qui n'est pas loin de prédire une série constante égale à la
122 dernière valeur observée (méthode "zéro"). La persistence donne parfois de bons résultats
123 mais est trop instable (sensibilité à l'argument <code>same_day</code>).
124
125 Comment améliorer la méthode ?