Le reti neurali sono strutture computazionali ispirate al funzionamento del cervello umano, costituite da nodi interconnessi organizzati in più livelli: uno di input, uno o più livelli nascosti e uno di output. Ogni nodo all’interno di questi livelli agisce come un processore semplice che trasmette segnali ponderati ad altri nodi. Il processo di apprendimento di una rete neurale si basa sull’adattamento iterativo dei pesi e delle soglie di attivazione per minimizzare l’errore tra l’output previsto e quello reale, attraverso una procedura nota come backpropagation. Questo processo richiede numerose ripetizioni per ottimizzare i parametri della rete, fino a raggiungere una precisione soddisfacente nella classificazione o nella previsione.
Nel contesto del riconoscimento di immagini, le reti neurali ricevono in input matrici bidimensionali di pixel per immagini in scala di grigi o matrici tridimensionali per immagini a colori, dove la terza dimensione rappresenta i canali cromatici. Ogni immagine è associata a una etichetta di output che definisce la categoria a cui appartiene, per esempio “cane”, “gatto” o “cervo”. Durante l’addestramento, il modello confronta l’output prodotto con l’etichetta reale e corregge gli errori regolando i pesi nei nodi attraverso la retropropagazione. Tale ciclo si ripete fino a quando l’errore risulta sufficientemente basso, garantendo così che il modello apprenda a distinguere con efficacia le diverse classi di immagini.
Un modello allenato con successo può quindi essere testato con dati nuovi, mai visti prima, per verificare la sua capacità di generalizzazione. Questo passaggio di validazione è cruciale per confermare che la rete neurale non abbia semplicemente “memorizzato” i dati di addestramento, ma abbia imparato a riconoscere schemi generali applicabili anche a immagini sconosciute. Le reti profonde, o deep neural networks (DNN), sono caratterizzate da più di tre livelli nascosti, arrivando a contenerne centinaia o migliaia. L’aggiunta di questi livelli permette di modellare e rappresentare relazioni sempre più complesse e astratte tra dati di input e output, migliorando significativamente le capacità predittive e di classificazione.
L’avvento delle GPU ad alte prestazioni e delle infrastrutture di calcolo parallelo ha reso possibile l’addestramento di queste reti profonde in tempi ragionevoli, trasformando il campo dell’intelligenza artificiale. Questi strumenti consentono di ridurre i tempi di training da settimane a ore, rendendo pratiche applicazioni reali di deep learning in svariati ambiti, quali il riconoscimento visivo, la classificazione di segnali audio e la comprensione del linguaggio naturale.
Due approcci principali vengono adottati per sviluppare modelli di deep learning. Il primo è l’addestramento da zero (training from scratch), che richiede grandi dataset etichettati e tempi di elaborazione elevati, ma offre massima personalizzazione per applicazioni specifiche o innovative. Il secondo è il transfer learning, in cui si utilizza un modello pre-addestrato su un compito generale e lo si adatta a un nuovo compito mediante una fase di raffinamento con dati limitati. Questo metodo riduce drasticamente la quantità di dati necessari e il tempo di addestramento, consentendo di sfruttare modelli già consolidati come SqueezeNet o GoogLeNet per nuove applicazioni, ad esempio classificazioni specializzate su un numero ridotto di classi.
Inoltre, i modelli pre-addestrati possono servire come estrattori di caratteristiche, trasformando i dati in rappresentazioni utili per ulteriori algoritmi di apprendimento automatico, come macchine a vettori di supporto (SVM) o algoritmi di correzione d’errore come ECOC. Questo stratagemma consente di combinare la potenza rappresentativa delle reti neurali con altre metodologie per ottenere sistemi ibridi altamente performanti.
L’applicazione di algoritmi di deep learning si è dimostrata rivoluzionaria in molte discipline, soprattutto in visione artificiale e processamento delle immagini, con impatti significativi anche in ambito biomedico per l’identificazione e la classificazione di immagini mediche, nonché nel riconoscimento di segnali audio. La capacità di apprendere automaticamente le caratteristiche salienti da grandi moli di dati senza la necessità di intervento umano diretto per l’estrazione di feature rappresenta una delle innovazioni più rilevanti del campo.
È fondamentale comprendere che il successo di una rete neurale non dipende solo dalla complessità della sua architettura o dalla quantità di dati disponibili, ma anche dalla qualità e rappresentatività del dataset, dalla capacità di generalizzare ai nuovi dati e dall’adeguatezza dell’algoritmo di apprendimento utilizzato. L’ottimizzazione del modello richiede spesso un bilanciamento delicato tra la complessità della rete, la dimensione del dataset e le risorse computazionali, così come una attenta validazione per evitare fenomeni di overfitting o underfitting.
Come si costruisce un sistema di inferenza fuzzy di tipo Mamdani in MATLAB?
La costruzione di un sistema di inferenza fuzzy (FIS) di tipo Mamdani in MATLAB inizia con la generazione della struttura base dell'FIS utilizzando la funzione mamfis(). Questo oggetto rappresenta il contenitore logico del sistema fuzzy che si andrà a costruire. All'interno di uno script, ad esempio AC_Func.m, si assegna un nome all’FIS — in questo caso "acfis" — e si crea l’oggetto principale che fungerà da riferimento per tutte le operazioni successive.
Una volta creato l’oggetto FIS, si procede con l’aggiunta delle variabili di ingresso e uscita. Le variabili di ingresso, come "Temp" e "Temp_Rate", vengono definite all'interno di intervalli numerici specifici tramite la funzione addInput(), specificando il nome della variabile e l’intervallo su cui essa agisce. Allo stesso modo, la variabile di uscita "Motor_Speed" viene definita con addOutput() indicando il suo intervallo. La definizione di questi intervalli richiede un’analisi preliminare del dominio applicativo per identificare le soglie minime e massime significative per ciascuna variabile.
Segue l’inserimento delle funzioni di appartenenza (MF, Membership Functions) per ogni variabile. Le MF rappresentano le etichette linguistiche come "LOW", "MID", "HIGH", e permettono al sistema di operare su concetti sfumati piuttosto che su valori numerici esatti. Per la variabile "Temp", ad esempio, si definiscono tre MF: una di tipo Generalized Bell per "LOW", una Gaussiana per "MID", e un’altra Generalized Bell per "HIGH", utilizzando la funzione addMF() e specificando il tipo della funzione, i parametri numerici, e il nome della MF.
Lo stesso approccio si applica alle altre variabili. Per "Temp_Rate", si impiegano anch’esse tre MF, due Generalized Bell e una Gaussiana, ciascuna con parametri accuratamente calibrati per rappresentare realisticamente l'andamento dell’ingresso nel sistema di controllo. Ogni funzione di appartenenza può essere visualizzata graficamente con plotmf(), una funzione che consente di validare visivamente la corretta distribuzione e sovrapposizione delle funzioni.
Oltre a queste operazioni fondamentali, MATLAB fornisce un insieme articolato di strumenti per gestire, modificare, salvare e interrogare il sistema fuzzy. La funzione showrule() consente di visualizzare tutte le regole definite nel sistema in formato testuale. La generazione automatica di un FIS a partire da dati di input e output reali può essere effettuata con genfis(), mentre il salvataggio su disco è possibile con writeFIS(). Per verificare la superficie di output prodotta dal sistema fuzzy, si può utilizzare gensurf(), e plotfis() consente di visualizzare la struttura del sistema FIS completo.
Una volta costruito, il FIS può essere recuperato con readfis() e utilizzato per il calcolo degli output in base a nuovi dati di input con evalfis(). Esistono poi funzioni di gestione avanzata come removeInput(), removeOutput(), e removeMF() per eliminare componenti dal sistema. La conversione di strutture tra diverse versioni o tipi di FIS è supportata da convertfis(), convertToSugeno(), convertToType1(), convertToType2(), mentre defuzz() si occupa del processo di defuzzificazione, ovvero della conversione di risultati fuzzy in valori numerici concreti.
Le funzioni sono suddivise per categoria in base alla loro funzione e tipo di FIS a cui si applicano. La maggior parte di esse (circa l’87%) sono compatibili sia con FIS di tipo 1 che di tipo 2, ma alcune sono specifiche solo per il tipo 1. Qu
Come si costruisce un sistema di controllo fuzzy con MATLAB: variabili, funzioni di appartenenza e regole
Nel costruire un sistema di controllo fuzzy per un condizionatore d’aria utilizzando MATLAB, uno degli aspetti fondamentali è la definizione delle variabili fuzzy e delle relative funzioni di appartenenza (MF, membership functions). Le variabili di ingresso, come la temperatura (Temp) e la sua variazione (Temp_Rate), e la variabile di uscita, la velocità del motore (Motor_Speed), vengono definite con un range specifico, al quale si associano più funzioni di appartenenza, che descrivono la gradualità con cui un valore rientra in un insieme fuzzy.
È importante notare che, nell’implementazione con MATLAB, la funzione addMF() richiede attenzione ai dettagli come il nome degli argomenti e il rispetto della distinzione tra maiuscole e minuscole, poiché MATLAB è case-sensitive. Ad esempio, per aggiungere una funzione di appartenenza, si usa “Name” e non “name”. Questo piccolo dettaglio può evitare errori nel codice.
Le funzioni di appartenenza più comunemente usate sono la campana gaussiana (gaussmf) e la campana generalizzata (gbellmf), ciascuna con parametri che ne definiscono la forma e la posizione. Nel nostro esempio, la temperatura è suddivisa in tre MFs chiamate LOW, MID e HIGH, con parametri scelti per rappresentare rispettivamente temperature basse, medie e alte all’interno dell’intervallo di 30-90 gradi. Analogamente, la variazione della temperatura e la velocità del motore hanno tre MFs ciascuna, opportunamente configurate.
Una volta definite le variabili e le loro MFs, si procede alla costruzione delle regole di controllo fuzzy. Queste regole collegano le condizioni di ingresso agli effetti sull’uscita in modo linguistico, ad esempio: “Se la temperatura è LOW e la variazione della temperatura è LOW, allora la velocità del motore è FAST.” Queste regole possono essere rappresentate in tre modi: verbose (testo completo), simbolico (con operatori logici) e indicizzato (array numerico che sostituisce i nomi delle MFs con indici). Il formato indicizzato è particolarmente utile nella programmazione, in quanto consente di rappresentare ciascuna regola come una riga di una matrice contenente gli indici delle funzioni di appartenenza per ogni variabile, un peso da 0 a 1 e un operatore fuzzy (AND o OR).
Ad esempio, per il nostro sistema, le regole sono definite utilizzando indici che corrispondono a LOW = 1, MID = 2 e HIGH = 3 per ciascuna variabile. Il peso delle regole è impostato a 1 (massima importanza) e l’operatore fuzzy utilizzato è AND, indicato con 1. Questa formalizzazione consente una gestione efficiente e ordinata delle regole nel codice MATLAB.
L’esempio del sistema di suggerimento della mancia in un ristorante illustra bene questo metodo: le variabili di ingresso sono il servizio e la qualità del cibo, con funzioni di appartenenza categorizzate, e la variabile di uscita è la mancia, anch’essa fuzzy. Le regole, formulate con operatori logici, sono tradotte in una matrice indicizzata che facilita la valutazione automatica da parte del sistema.
La corretta costruzione e associazione delle funzioni di appartenenza, così come la definizione accurata delle regole di inferenza, sono essenziali per il funzionamento del sistema fuzzy. Senza una chiara definizione e una codifica precisa, il sistema può produrre risultati non coerenti o inefficaci.
Inoltre, è fondamentale comprendere che la scelta delle MFs e dei parametri che le definiscono non è arbitraria: deve basarsi su una comprensione profonda del dominio applicativo e, spesso, su un processo iterativo di tuning per adattarsi al comportamento desiderato. Le funzioni di appartenenza non solo rappresentano insiemi linguistici ma determinano anche la sensibilità e la robustezza del sistema di controllo.
L’importanza di utilizzare correttamente la sintassi e i formati di rappresentazione delle regole risiede anche nella possibilità di scalare e mantenere il sistema nel tempo, facilitando eventuali modifiche o ampliamenti, senza compromettere la struttura logica e operativa.
Infine, il passaggio dalla rappresentazione verbosa a quella indicizzata rappresenta un salto verso l’efficienza computazionale e la chiarezza nel codice, aspetto indispensabile quando si affrontano sistemi complessi o si integrano più variabili e regole.
Come eseguire la regressione non lineare e confrontare i dati con il modello di adattamento originale in MATLAB
Per confrontare i dati testati con la curva di adattamento originale, è necessario ottenere i dati di ingresso-uscita del motore originali utilizzando la funzione readtable(). L'argomento di questa funzione è il nome del file di dati originali. È necessario utilizzare il nome completo, compreso il percorso, poiché il nostro file di dati è memorizzato in quella posizione. Se il file è stato salvato in una posizione diversa, sarà necessario specificare il percorso completo del file.
Le due colonne di dati nella tabella originale, le tensioni di ingresso e la velocità di uscita del motore, vengono assegnate a due variabili, cVol e cMSP, rispettivamente, utilizzando l'operatore punto. La curva di adattamento originale viene tracciata sulla base dei dati di ingresso-uscita originali, in termini del modello di adattamento.
Per sovrapporre il secondo grafico al primo senza che il primo venga aggiornato, bisogna utilizzare il comando hold on. Successivamente, il secondo grafico con i nuovi dati viene tracciato sopra il primo. Una volta completati i due grafici, il comando hold off può essere utilizzato per annullare l'azione di "tenere" il grafico originale.
Al termine, le illustrazioni possono essere visualizzate con la funzione legend(), che permette di aggiungere una legenda che spiega i vari elementi nel grafico. Il risultato di questa esecuzione è mostrato nella figura 5.68, dove i punti circolari rappresentano i dati originali, mentre i punti con il simbolo "+" rappresentano i nuovi dati di test. A questo punto, il focus si sposta sulle funzioni relative alla regressione non lineare.
Funzioni relative alla regressione non lineare
La Curve Fitting App è uno strumento presente all'interno di un toolbox MATLAB chiamato Curve Fitting Toolbox, che include tutte le applicazioni e le funzioni relative all'adattamento dei dati. In questo libro, ci concentreremo sull'adattamento delle curve, ma forniremo anche qualche cenno all'adattamento delle superfici. Per eseguire l'adattamento delle curve o delle superfici tramite codice (adattamento programmato), è necessario familiarizzare con gli oggetti di adattamento delle curve e delle superfici e le relative funzioni, che sono incluse nel Curve Fitting Toolbox di MATLAB. In questa sezione, approfondiremo i seguenti argomenti:
-
Come creare oggetti di adattamento delle curve e delle superfici in modo programmatico.
-
Come utilizzare le loro funzioni per manipolare gli adattamenti in modo programmatico.
Gli oggetti e le funzioni degli oggetti del Curve Fitting Toolbox
In MATLAB, tutte le variabili dell'ambiente di lavoro sono oggetti di una classe specifica. Alcune classi tipiche di MATLAB includono double, char, function_handle e Data types. È possibile anche creare classi personalizzate, come nel caso della programmazione orientata agli oggetti. Le funzioni degli oggetti sono funzioni che operano esclusivamente sugli oggetti di una determinata classe. La classe Data types raccoglie oggetti e funzioni in modo che le funzioni operino esclusivamente sugli oggetti del loro tipo, senza interferire con altri tipi di oggetti.
Il Curve Fitting Toolbox fornisce nuovi oggetti di tipo MATLAB per l'esecuzione dell'adattamento delle curve:
-
fittype - Gli oggetti di questa classe consentono di incapsulare informazioni che descrivono un modello parametrico per i dati. Le funzioni degli oggetti permettono di accedere e modificare tali informazioni.
-
cfit e sfit - Sono due sottoclassi di
fittype, utilizzate rispettivamente per curve e superfici. Questi oggetti catturano informazioni da un adattamento specifico, assegnando valori ai coefficienti, agli intervalli di confidenza, alle statistiche di adattamento, ecc. Le funzioni degli oggetti permettono di elaborare ulteriormente l'adattamento tramite operazioni come il tracciamento, l'estrapolazione, l'integrazione, ecc.
La relazione tra questi oggetti è mostrata nella figura 5.69. In particolare, l'oggetto cfit è una sottoclasse di fittype, il che significa che eredita tutte le funzioni della classe fittype. Ciò implica che le funzioni degli oggetti fittype possono essere applicate sia agli oggetti fittype che agli oggetti cfit, ma le funzioni specifiche di cfit sono riservate solo agli oggetti cfit. Lo stesso vale per gli oggetti sfit.
Le funzioni degli oggetti possono essere suddivise in due gruppi principali: quelle relative alla creazione degli adattamenti e quelle relative alla gestione degli adattamenti. Le tabelle 5.6 e 5.7 mostrano le funzioni più popolari e importanti per la creazione e la gestione degli adattamenti.
Tre funzioni popolari di adattamento non lineare nel Curve Fitting Toolbox
In generale, come accennato nella sezione precedente, MATLAB offre tre principali funzioni di adattamento che possono essere utilizzate per eseguire il processo di regressione non lineare:
-
fit() - Utilizzata per modelli lineari e non lineari.
-
fitnlim() - Specifica per modelli non lineari.
-
nlinfit() - Funzione avanzata per modelli non lineari.
Queste funzioni lavorano insieme agli oggetti e alle funzioni degli oggetti per eseguire il processo di adattamento desiderato. Analizziamo più da vicino ciascuna di queste funzioni.
La funzione fit()
Questa funzione viene utilizzata per creare un nuovo oggetto cfit utilizzando il tipo di modello specificato dall'oggetto fittype. Normalmente, non è necessario creare direttamente un oggetto cfit a meno che non si voglia assegnare valori ai coefficienti e ai parametri di un oggetto fittype senza eseguire l'adattamento. Ci sono sei diversi costruttori per chiamare questa funzione e creare un nuovo oggetto cfit:
-
fitobject = fit(x, y, fitType): Crea l'adattamento ai dati
xeyutilizzando il modellofitType. -
fitobject = fit([x, y], z, fitType): Crea un adattamento della superficie ai dati nei vettori
x,yez. -
fitobject = fit(x, y, fitType, fitOptions): Crea un adattamento utilizzando le opzioni dell'algoritmo specificate dall'oggetto
fitOptions. -
fitobject = fit(x, y, fitType, Name=Value): Crea un adattamento utilizzando il modello di libreria
fitTypecon opzioni aggiuntive definite da coppie Nome=Valore. -
[fitobject, gof] = fit(x, y, fitType): Restituisce le statistiche di bontà dell'adattamento nell'oggetto
gof. -
[fitobject, gof, output] = fit(x, y, fitType): Restituisce informazioni sull'algoritmo di adattamento nell'oggetto
output.
Due argomenti cruciali in questa funzione sono fitType e fitOptions, che vengono descritti in dettaglio in seguito. La funzione fittype() viene utilizzata per costruire il tipo di adattamento per una funzione di adattamento.
-
fittype(libraryModelName): Crea l'oggetto
fittypeper il modello specificato dalibraryModelName. -
fittype(expression): Crea un tipo di adattamento per il modello specificato da un'espressione MATLAB.
-
fittype(expression, Name, Value): Costruisce un tipo di adattamento con opzioni aggiuntive specificate tramite coppie Nome-Valore.
-
fittype(anonymousFunction): Crea un tipo di adattamento per il modello specificato da una funzione anonima.
-
fittype(anonymousFunction, Name, Value): Costruisce un tipo di adattamento con opzioni aggiuntive tramite coppie Nome-Valore.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский