Esempio di prova di laboratorio Messa a punto di un modello mediante: Utilizzo dell interprete Matlab Utilizzo del toolbox Fuzzy Logic Utilizzo del toolbox Neuro Network Creazione di funzioni Analisi critica sulle scelte del modello Esercitazione di laboratorio, con uso di Matlab Si vuol controllare la capacita di un sistema ANFIS (Adaptive Neuro/Fuzzy Inference System) e di una rete neurale nel riprodurre il semplice calcolo dell area di un rettangolo. Allo scopo, viene proposto un modello a due input ed un output come segue: input 1: dimensione della base input 2: dimensione dell altezza output: valore dell area Vengono richieste le seguenti elaborazioni: Predisporre un set di dati come segue Generare 100 valori casuali in (0,1) per i due input Calcolare i rispettivi valori dell output Creare un opportuno sistema FIS, addestrarlo con i dati predisposti ed esportare tale sistema nel workspace Creare una opportuna rete neurale, addestrarla con i dati predisposti ed esportare tale rete nel workspace A consuntivo viene infine richiesto di scrivere una funzione che abbia come argomenti: i valori di base ed altezza di un generico rettangolo il nome del sistema inferenziale FIS esportato il nome della rete neurale esportata e restituisca come risultati : l area del rettangolo il valore calcolato con il modello FIS il valore calcolato con la rete neurale 1
Predisposizione dei dati richiesti Generiamo 100 valori casuali per base ed altezza, sfruttando la funzione rand, creando cosi i dati richiesti per i due input: >> x=rand(2,100); Calcoliamo i rispettivi valori dell area, creando cosi i dati richiesti per l output: >> y=x(1,:).*x(2,:); Le variabili x ed y sono nella forma richiesta per le reti neurali, mentre per i modelli FIS i dati devono essere raggruppati nella variabile: >> z=[x',y']; Questo, poiché le reti neurali richiedono i dati di input separati da quelli di output, con le 100 osservazioni per colonna, mentre per i modelli fuzzy i dati sono raggruppati in un unica matrice con le 100 osservazioni per riga e l ultima colonna contenente gli output. A consuntivo: >> whos Name Size Bytes Class ans 1x1 8 double array x 2x100 1600 double array y 1x100 800 double array z 100x3 2400 double arra Caricamento dati per il modello ANFIS Con il comando anfisedit viene attivato l editor grafico dei modelli ANFIS La prima operazione e il caricamento dei dati, nel nostro caso limitati ai soli dati di training. Nella sezione load data click su training e worksp. e quindi load data: nella finestra che si apre specificare il nome della variabile predisposta z. 2
Generazione del modello ANFIS Si seleziona il metodo grid (dato il numero limitato di input) e quindi generate FIS; appare la finestra in cui scegliere numero e tipo delle funzioni membro; nel caso non vi siano evidenti sistematicità nella realtà da modellare, vengono preferite funzioni membro a campana in numero tale da avere un rapporto, fra osservazioni e parametri da stimare, non inferiore a 5 Addestramento del modello FIS Viene stabilito il numero di epoche (cicli di utilizzo di tutte le osservazioni), il metodo di stima (hybrid, per stime più accurate) e la tolleranza nel considerare effettivo un miglioramento; quindi train now 3
Esportazione del modello FIS Click su file => save to workspace as e nella finestra che appare indicare un nome per il modello (in figura rfuzzy ) e quindi OK In figura appare anche un confronto grafico fra valori effettivi (o) e quelli calcolati dal modello (*) Conclusione modello FIS Oggetti esistenti nel workspace: >> whos Name Size Bytes Class ans 1x1 8 double array rfuzzy 1x1 13912 struct array x 2x100 1600 double array y 1x100 800 double array z 100x3 2400 double array Struttura della variabile contenente il modello FIS: >> rfuzzy rfuzzy = name: ' rfuzzy' type: 'sugeno' andmethod: 'prod' ormethod: 'probor' defuzzmethod: 'wtaver' impmethod: 'min' aggmethod: 'max' input: [1x2 struct] output: [1x1 struct] rule: [1x9 struct] trndata: [100x3 double] 4
Caricamento dati per la rete neurale Con il comando nntool viene attivato l editor grafico per le reti neurali La prima operazione e il caricamento dei dati, nel nostro caso limitati ai soli dati di training; click su import: nella finestra che si apre scegliere la variabile ed il tipo di dati che contiene. Nel nostro caso x per inputs e quindi create. Analogamente viene poi importata y come targets Generazione della rete neurale Click su new network: appare la finestra in cui scegliere il nome della rete (rneuro), il numero di layer e per ogni layer il numero di neuroni: nel nostro caso 1 layer a tre neuroni per gli input ed un layer ad un neurone per l output (regola pratica: rapporto fra osservazioni e parametri da stimare non inferiore a 5). Per gli input ranges si sceglie che vengano ricavati dai dati di input x. In assenza di particolari comportamenti della realtà da modellare, si possono lasciare le scelte di default per le ulteriori caratteristiche della rete. Selezionare quindi create 5
Predisposizione addestramento della rete Nella finestra principale, selezionare il nome della rete creata e quindi view per controllarne la struttura Se tutto risponde ai requisiti, nella finestra principale selezionare il nome della rete e quindi train Appare la finestra in cui specificare le modalità di addestramento: nella sottocartella training info della cartella train, indicare gli inputs x ed il target y in assenza di comportamenti particolari della realtà da modellare, si possono lasciare le scelte di default per le altre modalità di addestramento Selezionare quindi Train Network Addestramento della rete Viene visualizzato in grafico il progressivo addestramento (stima dei parametri) della rete: in ascisse il numero di epoche (ciclo completo di utilizzo delle osservazioni) in ordinate lo scarto quadratico medio fra output reale ed output calcolato con il modello 6
Esportazione del modello di rete Nella finestra principale selezionare export. Appare la finestra in cui scegliere gli oggetti da esportare Nel nostro caso viene esportata la variabile rneuro, che contiene la rete neurale addestrata Può interessare anche esportare quanto calcolato dal modello e lo scarto tra tali valori e valori reali Situazione dopo la creazione dei due modelli Variabili nel workspace >> whos Name Size Bytes Class ans 1x1 8 double array rfuzzy 1x1 13912 struct array rneuro 1x1 28134 network object x 2x100 1600 double array y 1x100 800 double array z 100x3 2400 double array Struttura della variabile contenente in modello neurale >> rneuro rneuro = Neural Network object: architecture: numinputs: 1 numlayers: 2 biasconnect: [1; 1] inputconnect: [1; 0] layerconnect: [0 0; 1 0] outputconnect: [0 1] targetconnect: [0 1] ecc 7
Funzione richiesta a consuntivo function [area,areaf,arean] = arearettangolo(b,h,rfuzzy,rneuro) %calcola l'area di un rettangolo con metodo diretto %e tramite modelli fuzzy e neurali %argomenti: base,altezza,modello fuzzy,modello neurale area = b*h areaf = evalfis([b,h],rfuzzy); arean = sim(rneuro,[b;h]); Esempio di chiamata della funzione e dei risultati restituiti: >> [a,f,n]=arearettangolo(.5,.5,rfuzzy,rneuro) area = 0.2500 a = 0.2500 f = 0.2500 n = 0.2528 N.B. E possibile che vengano richiesti nella funzione anche andamenti grafici di confronto fra i tre metodi di calcolo 8