Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 10

ESERCIZIO 2
1. Introduzione
Lo scopo di questo secondo esercizio è quello di prevedere, tramite
l’utilizzo di una rete neurale, il consumo (MW/h) di energia di una
città del quale viene fornita una mappa di campioni stimata per 25
lunedì successivi nell’arco delle 24 ore.
Avremo quindi una tabella costituita da 25 righe e 24 colonne con
cui addestreremo e valideremo la rete neurale.
Riportiamo i dati forniti dall’esercizio:
ma=[
139 131
152 149
148 144
144 139
158 146
154 150
163 154
164 156
178 169
199 195
205 194
211 196
223 213
227 219
223 217
228 209
239 230
235 228
229 213
225 217
220 213
210 206
220 217
214 209
210 200
];

122
143
141
135
140
145
152
153
166
180
185
186
207
216
206
212
225
218
211
214
207
197
215
205
199

123
147
142
133
141
151
152
143
112
188
176
187
196
211
197
205
203
209
209
196
203
211
214
204
197

139
156
148
140
144
157
155
161
172
180
187
191
199
213
199
200
202
210
208
205
203
214
212
202
199

157
166
170
162
165
171
175
180
183
196
199
201
212
209
203
213
205
215
211
210
207
213
215
209
209

188
199
208
195
211
215
222
207
221
223
229
234
225
216
211
213
208
217
220
209
210
216
210
218
224

239
258
257
262
270
257
251
250
256
256
251
247
249
222
238
233
230
246
230
219
226
228
219
234
253

256
272
265
270
279
278
279
278
270
269
267
285
259
230
268
266
256
258
261
245
252
253
252
257
279

265
271
258
270
282
273
269
276
266
269
282
272
281
223
272
274
276
287
276
273
276
277
275
289
290

213
256
255
255
270
254
269
260
262
279
263
333
274
219
283
287
277
282
252
279
292
277
275
289
285

229
241
223
238
257
242
249
239
252
262
253
279
271
210
271
276
281
286
278
275
272
274
272
279
279

218
220
214
217
226
220
234
221
234
245
239
256
256
212
259
266
265
292
273
255
263
264
269
275
257

205
209
206
208
223
223
222
215
237
247
248
259
257
197
261
265
266
243
260
265
268
263
253
268
256

195
208
201
209
228
227
222
211
240
246
241
273
263
209
264
273
278
275
268
266
270
267
268
278
264

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

198
211
205
218
225
229
218
208
237
249
239
272
282
199
266
276
264
274
266
267
256
264
271
273
264

197
218
209
220
217
230
223
212
233
243
226
272
253
196
254
272
265
266
259
258
253
253
265
257
261

214
213
209
218
224
228
217
207
226
230
237
256
248
194
241
247
241
242
247
244
232
236
240
260
240

253
262
255
256
253
261
259
239
251
262
251
260
248
215
252
267
248
242
212
243
229
236
231
262
258

237
297
279
281
288
283
299
287
302
305
289
307
320
267
302
305
303
302
296
292
288
257
273
298
300

273
272
274
276
286
279
283
266
294
297
302
315
306
283
298
311
310
310
313
304
297
302
299
306
318

245
254
254
254
270
266
273
247
283
294
280
299
288
275
297
320
300
311
307
307
297
296
294
306
281

199
220
207
220
217
223
235
199
248
263
265
256
286
253
283
281
284
280
276
277
267
276
275
275
265

158
180
167
186
185
192
192
174
203
225
226
234
237
219
254
257
259
251
251
239
241
242
237
232
234

Emanuele Duca 10

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 11

2. Realizzazione
Come si può notare i consumi contengono valori elevati, quindi al
fine di evitare la saturazione dei neuroni è necessario convertire i dati
mediante la funzione mapstd la quale opera una scalatura dei
parametri operando sulla media (posta pari a 0) e sulla deviazione
standard ( posta pari ad 1).
La variabile creata sarà quindi utilizzata dalla rete; rammentando
tuttavia lo scopo dell’esercizio ovvero un plot di stima dei consumi
in MH/h appare chiaro l’utilizzo nella fase finale del progetto di una
funzione inversa per riportare i dati alle loro dimensioni di partenza.
Per fare ciò è sufficiente specificare in mapst il parametro ‘reverse’
in modo tale da ottenere la denormalizzazione voluta:
% normalizzazione dati
[ma,data]=mapstd(ma);
%denormalizzazione dati
ma4=mapstd('reverse',ma4,data);

Successivamente viene realizzata la rete da utilizzare, tenendo in
considerazione in questo caso la volontà di avere in ingresso due
lunedì consecutivi casuali piuttosto che i primi due, questo è stato
possibile mediante il comando randint :
%inizializzazione casuale
c1=randint(1,1,[1,18]);
x=ma(c1,:);
y=ma((c1+1),:);
p=[x;y];

A questo punto si realizza la rete nello stesso modo analizzato
nell’esercizio1, con la sostanziale differenza riguardante la scelta
dell’algoritmo utilizzato (traingd), in quanto ha fornito risposte
soddisfacenti nelle simulazioni effettuate e il numero di neuroni
presenti nel primo strato (18).
net=
newff(minmax(p),[18,1],{'tansig','purelin'},'traingd’
);

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 11

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 12

I pesi e i parametri di training sono stati inizializzati nel modo
seguente:
net.layers{1}.initFcn='initnw';
net.layers{2}.initFcn='initnw';
net=initlay(net);
net.trainParam.show = 100;
net.trainParam.lr = 0.005;
net.trainParam.epochs= 400;
net.trainParam.goal = 1e-4;

Per realizzare il training set della rete si utilizzano 2 lunedì successivi
mentre il terzo è considerato il target (come da specifiche).
Questa procedura è iterata fino ad ottenere 18 coppie d’ingresso
utilizzando le prime venti righe della matrice ma (25x24), le restanti
costituiranno il validation set.
for i=1:18
x=ma(i,:);
y=ma(i+1,:);
z=ma(i+2,:);
p1=[x;y];
[net,tr]=train(net,p1,z);
end

La visualizzazione dei bias e dei pesi sinaptici come visti
nell’esercizio precedente è affidata alle seguenti righe di codice:
w1=net.IW{1,1};
b1=net.b{1};
w2=net.lw{2,1};
b2=net.b{2};

Infine si procede con la validazione della rete alla fine della quale
avviene la denormalizzazione dei dati come già accennato in
precedenza.

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 12

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 13

%% validation
for h=1:3
pv=[ma(20+h,:);ma(21+h,:)];
val=[ma3(22+h,:)];
st=sim(net,pv);
ma4(22+h,:)=st;
%denormalizzazione dati
ma4=mapstd('reverse',ma4,data);
end

Il ciclo for fornisce i valori della matrice pv relativi alla righe
21,22,23,24, mentre val avrà al suo interno le uscite relative alle
righe 23,24 e 25.
Di seguito sono riportati i risultati ottenuti:
figure();
for j=1:18;
plot(ma3(j,:),'b');
title('Dati','color','r');
xlabel('Ore','color','r');
ylabel('Consumo(Mw/h)in 25 lunedi successivi','color','r');
hold on
end

Figura 1 Dati in ingresso.

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 13

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 14

%realizzazione delle ore
x=(1:24);
figure(10); subplot(3,1,h);
plot(x,ma4(22+h,:),'+','color','b');
xlabel('Ore','color','b');
ylabel('Consumo MW/h','color','b');
legend('Consumo','Location','NorthOutside');
hold on

Figura 2 Consumi stimati per i dati del validation set.

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 14

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 15

plot(x,val,'r');
err(h,:)=val-ma4(22+h,:);
figure(11);subplot(3,1,h);plot(x,err(h,:));
title(['Errore per l ingresso x(',num2str(h),')'],'color','r');
xlabel('Ore','color','b');
ylabel('Consumo MW/h','color','b');

Figura 3 Errore per i tre dati in ingresso.

Una volta analizzato l’errore per i tre ingressi è stato stimato l’errore
medio della rete.
errm=((err(1,:)+err(2,:)+err(3,:))/3);
figure(12);plot(x,errm);
title('Errore medio','color','r');
xlabel('Ore','color','b');
ylabel('Consumo MW/h','color','b');

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 15

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 16

Errore medio
15

10

Consumo MW/h

5

0

-5

-10

-15

0

5

10

15

20

25

Ore

Figura 4 Errore medio prodotto dalla rete

Come si può vedere l’errore per gli ingressi si attesta intorno al 10%
mentre l’errore medio è del 5%, quindi si può dire che la rete è
discretamente performante per il problema sottoposto.

Esercizi del corso di Reti Neurali per il Controllo: Esercizio2

Emanuele Duca 16