Applicazione di una rete neurale
Click here to load reader
Transcript of Applicazione di una rete neurale
Esercizi del corso di Reti Neurali per il Controllo: Esercizio2 Emanuele Duca 10
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 122 123 139 157 188 239 256 265 213 22 9 218 205 195 198 1 97 214 253 237 273 245 199 158 152 149 143 147 156 166 199 258 272 271 256 24 1 220 209 208 211 218 213 262 297 272 254 220 180 148 144 141 142 148 170 208 257 265 258 255 22 3 214 206 201 205 209 209 255 279 274 254 207 167 144 139 135 133 140 162 195 262 270 270 255 23 8 217 208 209 218 220 218 256 281 276 254 220 186 158 146 140 141 144 165 211 270 279 282 270 25 7 226 223 228 225 217 224 253 288 286 270 217 185 154 150 145 151 157 171 215 257 278 273 254 24 2 220 223 227 229 230 228 261 283 279 266 223 192 163 154 152 152 155 175 222 251 279 269 269 24 9 234 222 222 218 223 217 259 299 283 273 235 192 164 156 153 143 161 180 207 250 278 276 260 23 9 221 215 211 208 212 207 239 287 266 247 199 174 178 169 166 112 172 183 221 256 270 266 262 25 2 234 237 240 237 233 226 251 302 294 283 248 203 199 195 180 188 180 196 223 256 269 269 279 26 2 245 247 246 249 243 230 262 305 297 294 263 225 205 194 185 176 187 199 229 251 267 282 263 25 3 239 248 241 239 226 237 251 289 302 280 265 226 211 196 186 187 191 201 234 247 285 272 333 27 9 256 259 273 272 272 256 260 307 315 299 256 234 223 213 207 196 199 212 225 249 259 281 274 27 1 256 257 263 282 253 248 248 320 306 288 286 237 227 219 216 211 213 209 216 222 230 223 219 21 0 212 197 209 199 196 194 215 267 283 275 253 219 223 217 206 197 199 203 211 238 268 272 283 27 1 259 261 264 266 254 241 252 302 298 297 283 254 228 209 212 205 200 213 213 233 266 274 287 27 6 266 265 273 276 272 247 267 305 311 320 281 257 239 230 225 203 202 205 208 230 256 276 277 28 1 265 266 278 264 265 241 248 303 310 300 284 259 235 228 218 209 210 215 217 246 258 287 282 28 6 292 243 275 274 266 242 242 302 310 311 280 251 229 213 211 209 208 211 220 230 261 276 252 27 8 273 260 268 266 259 247 212 296 313 307 276 251 225 217 214 196 205 210 209 219 245 273 279 27 5 255 265 266 267 258 244 243 292 304 307 277 239 220 213 207 203 203 207 210 226 252 276 292 27 2 263 268 270 256 253 232 229 288 297 297 267 241 210 206 197 211 214 213 216 228 253 277 277 27 4 264 263 267 264 253 236 236 257 302 296 276 242 220 217 215 214 212 215 210 219 252 275 275 27 2 269 253 268 271 265 240 231 273 299 294 275 237 214 209 205 204 202 209 218 234 257 289 289 27 9 275 268 278 273 257 260 262 298 306 306 275 232 210 200 199 197 199 209 224 253 279 290 285 27 9 257 256 264 264 261 240 258 300 318 281 265 234 ];
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 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 12
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 13
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 14
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 15
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 16
Esercizi del corso di Reti Neurali per il Controllo: Esercizio2 Emanuele Duca 16
0 5 10 15 20 25-15
-10
-5
0
5
10
15Errore medio
Ore
Con
sum
o M
W/h
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.