Nel contesto della creazione di ambienti personalizzati per il Reinforcement Learning in MATLAB, si possono distinguere tre metodi fondamentali. Tra questi, il metodo basato sulla classe template rappresenta una soluzione particolarmente flessibile, permettendo la realizzazione di ambienti complessi e personalizzati con un controllo dettagliato sulle dinamiche e sulle interfacce. Questo metodo utilizza una classe template fornita da MATLAB come struttura di base, che l’utente può completare e modificare per adattarla alle proprie necessità. L’approccio consente di implementare dinamiche ambientali articolate, integrare visualizzazioni personalizzate e collegarsi a librerie esterne sviluppate in linguaggi quali C++, Java o Python.
Prendendo ad esempio un sistema motore DC, si crea un ambiente partendo da una classe template predefinita contenente un modello semplice, come quello del carrello con asta oscillante (cart-pole), con suddivisione in tre parti fondamentali: le proprietà dell’ambiente, i metodi richiesti e quelli opzionali. Le proprietà includono costanti fisiche, variabili di stato e vincoli, mentre i metodi richiesti sono essenziali per il funzionamento dell’ambiente, come reset(), step() e il costruttore della classe. I metodi opzionali, sebbene non obbligatori, facilitano la costruzione e la gestione dell’ambiente.
Per iniziare, si crea un file di classe chiamato ad esempio motor_template_env, tramite la funzione rlCreateEnvTemplate("motor_template_env"), che genera un modello pronto per essere personalizzato. Nella definizione della classe, si dichiarano proprietà quali la velocità massima del motore (ad esempio 50 RPM), il tempo di campionamento (20 ms), la soglia di errore angolare tollerata (2 gradi), e i valori di ricompensa e penalità in base allo stato di funzionamento del motore. Lo stato del sistema viene rappresentato da un vettore contenente angolo e velocità angolare, e una variabile booleana segnala il termine dell’episodio.
Il costruttore della classe definisce le specifiche delle osservazioni e delle azioni: le osservazioni, rappresentate come vettore numerico a due dimensioni (angolo e sua derivata), e le azioni, qui descritte tramite un insieme finito che consente solo valori discreti compresi tra -50 e 50, indicanti la potenza applicata al motore. La definizione accurata di queste specifiche è cruciale per il corretto funzionamento dell’agente di Reinforcement Learning che interagirà con l’ambiente.
La metodologia consente quindi di modellare ambienti su misura, adeguando sia la struttura dati sia i comportamenti dinamici, attraverso la modifica delle parti del template. Questo approccio è molto potente per chi deve simulare sistemi complessi e personalizzati, oltre ad agevolare l’estensione verso visualizzazioni e integrazioni avanzate.
È importante comprendere che la definizione accurata delle proprietà e dei metodi dell’ambiente costituisce la base imprescindibile per la costruzione di un sistema di apprendimento efficace. La flessibilità introdotta dal metodo della classe template si riflette non solo nella capacità di rappresentare dinamiche articolate, ma anche nell’opportunità di adattare il feedback (ricompense e penalità), elementi chiave per guidare l’apprendimento dell’agente. Inoltre, una chiara distinzione tra metodi obbligatori e opzionali permette una scalabilità graduale: si può partire da un modello semplice e poi aggiungere funzionalità avanzate man mano che il progetto si sviluppa.
Nel processo di progettazione è essenziale mantenere una visione sistematica: definire con precisione variabili di stato, azioni possibili e criteri di terminazione, così come calibrare opportunamente le ricompense, permette di evitare ambiguità e garantire una simulazione fedele e robusta. Inoltre, la possibilità di integrare librerie esterne apre la porta all’utilizzo di componenti software altamente performanti, ampliando enormemente le potenzialità dell’ambiente creato.
Come si costruisce e si verifica un sistema di controllo fuzzy con MATLAB: principi e pratiche essenziali
La costruzione di un sistema di controllo fuzzy si basa sull'applicazione precisa di regole definite, come illustrato nell’equazione (3.24). Ogni regola può essere configurata attraverso un Rule Editor, che consente la selezione di valori linguistici come LOW, MID e HIGH per le variabili di input e output. Per esempio, la prima regola: “Se la temperatura (T) è LOW e la variazione di temperatura (ΔT) è LOW, allora la velocità del motore è FAST”, viene impostata selezionando i corrispondenti valori nel Property Editor: Rule. Questo strumento visualizza e modifica simultaneamente la regola selezionata, permettendo un controllo diretto e intuitivo. Il processo si ripete per tutte le regole, corrispondenti ai numeri dell’equazione, garantendo coerenza e completezza nella definizione del sistema.
Oltre alla creazione, il Rule Editor permette modifiche rapide: una regola può essere copiata, cancellata o aggiunta tramite pulsanti dedicati (+, Copy, Delete). Questa flessibilità è cruciale per affinare il sistema in modo iterativo, adattandolo a nuove esigenze o a risultati di test. Una volta completata la costruzione, è fondamentale salvare il sistema fuzzy (FIS) prima di procedere al collaudo.
Il test avviene nel Rule Inference Viewer, che consente di valutare in tempo reale la risposta del sistema a differenti input, verificandone l’efficacia e la correttezza delle regole. Per una visione più completa, il Control Surface Viewer offre una rappresentazione tridimensionale delle relazioni input-output, fornendo una mappa visiva delle prestazioni del sistema. Questo passaggio aiuta a identificare eventuali zone di comportamento non ottimale o incoerenze nella logica di controllo.
Il sistema sviluppato con il Fuzzy Logic Designer App ha il vantaggio di essere semplice e veloce da implementare, poiché la maggior parte del codice viene generata automaticamente da MATLAB, riducendo la curva di apprendimento per studenti e professionisti non esperti di programmazione. Tuttavia, questa astrazione può nascondere la comprensione profonda di come funziona realmente il sistema fuzzy, rendendo difficile per l’utente cogliere i dettagli del funzionamento interno.
Per colmare questa lacuna, è possibile costruire un sistema fuzzy utilizzando le Fuzzy Logic Functions di MATLAB, modalità priva di interfaccia grafica (GUI), dove l’utente scrive direttamente il codice MATLAB, simile a C. Questo approccio richiede una maggiore conoscenza tecnica ma offre un controllo completo e una migliore comprensione del processo di costruzione del sistema fuzzy.
Il lavoro con MATLAB si realizza tramite due tipi di file: Script (.m) e Live Script (.mlx). Il primo è un file di codice puro, mentre il secondo consente di integrare codice con testo formattato, equazioni e immagini, utile per documentare e visualizzare risultati all’interno di un unico ambiente. La creazione di un progetto fuzzy inizia organizzando i file in una cartella dedicata, quindi aprendo MATLAB per scrivere e salvare il codice nel file script.
Il codice di base per costruire un sistema fuzzy comprende la creazione dell’oggetto FIS tramite funzioni come mamfis() o sugfis(), l’aggiunta di variabili di input e output con addInput() e addOutput(), la configurazione delle proprietà delle variabili con la notazione a punti (ad esempio, nome e intervallo), l’inserimento delle funzioni di appartenenza (MF) con addMF(), e infine la definizione delle regole con addRule(). Funzioni come plotmf() permettono di visualizzare graficamente le MF per controllarne la correttezza.
Il passaggio dal design visuale alla programmazione diretta consente di comprendere a fondo ogni componente del sistema fuzzy, dai parametri fino alle regole di inferenza, rendendo possibile la personalizzazione avanzata e l’ottimizzazione del controllo. Tale conoscenza è essenziale per chi desidera padroneggiare la logica fuzzy in modo professionale.
Oltre alla conoscenza tecnica, è importante considerare che la validazione del sistema fuzzy non si esaurisce con la sua realizzazione. La fase di test deve includere un’analisi approfondita delle prestazioni in scenari realistici, compresa la verifica della robustezza a variazioni impreviste degli input e la capacità di adattamento a condizioni variabili. Questo garantisce che il sistema risponda efficacemente non solo in condizioni ideali ma anche in situazioni dinamiche e complesse.
La costruzione e verifica di sistemi di controllo fuzzy sono processi iterativi e richiedono un bilanciamento tra facilità d’uso e profondità di comprensione. Strumenti grafici accelerano la prototipazione, mentre la programmazione diretta offre trasparenza e flessibilità. Una combinazione di entrambi i metodi, affiancata da un’attenta fase di test e analisi, è la chiave per sviluppare sistemi affidabili e performanti.
Come costruire e ottimizzare modelli di foresta casuale per la previsione dei rischi di incendio
L'algoritmo della foresta casuale è una tecnica di apprendimento automatico molto potente, utilizzata per risolvere problemi complessi come la previsione dei rischi di incendio forestale. Questa metodologia è un'estensione del bagging, che si basa sulla costruzione di numerosi alberi decisionali e sulla combinazione dei loro risultati per ridurre la varianza e migliorare la precisione complessiva del modello.
Il processo di creazione di un modello di foresta casuale inizia con la raccolta e la preparazione dei dati. Un esempio pratico di questo processo potrebbe essere l'uso di un dataset, come il "MFire_Database.xls", che contiene variabili predittive come la FFMC (Fine Fuel Moisture Code), la DMC (Duff Moisture Code), la DC (Drought Code), la temperatura, la velocità del vento, il BUI (Buildup Index) e il FWI (Fire Weather Index), che è la variabile di risposta. Per iniziare, è necessario caricare il dataset e estrarre le variabili pertinenti in una tabella di dati, come nel codice seguente:
Una volta preparato il dataset, il passo successivo è la definizione del modello. Per costruire un modello di foresta casuale, possiamo utilizzare la funzione fitrensemble() in MATLAB, che stima il modello di foresta casuale utilizzando un insieme di alberi decisionali. Ad esempio, per definire il nostro modello di regressione, possiamo utilizzare una sintassi semplice, come nel seguente codice:
In alternativa, è possibile utilizzare una formula che esplicita la relazione tra la variabile di risposta e le variabili predittive. In questo caso, la formula sarebbe:
Un ulteriore miglioramento del modello può essere ottenuto utilizzando alcune coppie di nome-valore, come ad esempio il metodo "Bag", che implementa il bagging, e impostando parametri come il numero di cicli di apprendimento e il numero di bin. In questo caso, il modello può essere definito come segue:
Una volta che il modello è stato creato, è importante validarlo utilizzando tecniche come la validazione incrociata. La funzione kfoldLoss() calcola la perdita del modello basato su errore quadratico medio, utilizzando il metodo di validazione incrociata a 10 pieghe. L'output di questa funzione può essere tracciato per visualizzare la perdita cumulativa durante i cicli di apprendimento:
Questa visualizzazione è fondamentale per comprendere come la precisione del modello migliori o peggiori durante l'allenamento e per ottimizzare ulteriormente il processo.
Un altro strumento utile per migliorare la qualità del modello è la funzione TreeBagger(). Questo metodo è essenzialmente una versione più avanzata del bagging, che costruisce una foresta di decisioni combinando i risultati di diversi alberi. Il principio di base dietro al funzionamento di TreeBagger() è che ogni albero viene addestrato su un campione bootstrap del set di dati, e per ogni divisione di un nodo, viene selezionato un sottoinsieme casuale di variabili predittive.
Il codice per utilizzare TreeBagger() potrebbe apparire come segue:
Dove "100" è il numero di alberi decisionali e "T" è il set di dati di addestramento. In alternativa, è possibile usare una formula di regressione per definire la relazione tra le variabili predittive e la variabile di risposta:
Una caratteristica distintiva della foresta casuale rispetto al semplice bagging è la selezione casuale di un sottoinsieme di variabili per ogni nodo decisionale, il che riduce la correlazione tra gli alberi e migliora la robustezza del modello. Il numero di predittori da campionare può essere impostato tramite il parametro NumPredictorsToSample, che consente di emulare il comportamento della foresta casuale all'interno di TreeBagger().
Conclusioni importanti
È essenziale che i lettori comprendano l'importanza della validazione incrociata nella costruzione di modelli di apprendimento automatico come la foresta casuale. La validazione incrociata aiuta a prevenire l'overfitting e garantisce che il modello generalizzi bene su dati non visti. Inoltre, la selezione accurata delle variabili predittive e la scelta dei parametri, come il numero di cicli di apprendimento o il numero di alberi, sono fondamentali per ottenere un modello performante.
Inoltre, i lettori dovrebbero essere consapevoli che la precisione di un modello dipende non solo dai dati utilizzati ma anche dall'accuratezza con cui vengono eseguiti i pre-processing e i passaggi di ottimizzazione. La comprensione approfondita della teoria alla base degli algoritmi di ensemble e delle loro implementazioni pratiche è cruciale per sviluppare modelli efficaci e robusti.
Qual è la differenza tra l'uso di fitglm() e TreeBagger() nella classificazione binaria dei dati sul diabete?
La classificazione binaria è un pilastro nell’analisi predittiva, soprattutto nel contesto medico, come nel caso del diabete. Due approcci distinti ma entrambi efficaci per affrontare tale compito in MATLAB sono l’uso della funzione fitglm(), che si basa su modelli lineari generalizzati, e TreeBagger(), che implementa foreste casuali. Entrambi questi metodi permettono di modellare relazioni tra variabili predittive e un output binario, ma lo fanno in modo sostanzialmente diverso.
Nel primo caso, fitglm() consente di creare un modello statistico lineare che stima la probabilità di appartenenza a una classe (diabetico o non diabetico) sulla base di un insieme di predittori continui. I dati vengono separati in un set di addestramento e uno di test. I predittori selezionati includono variabili cliniche come il numero di gravidanze, il livello di glucosio nel sangue, la pressione sanguigna, lo spessore della pelle, l'insulina, l'indice di massa corporea, la funzione pedigree del diabete e l’età.
Dopo aver addestrato il modello con fitglm(), si passa alla previsione delle etichette per il set di test. Poiché l’output del modello è una probabilità continua tra 0 e 1, è necessario applicare una soglia (solitamente 0.5) per convertire i risultati in classi binarie. Questa operazione, apparentemente semplice, è cruciale: valori prossimi alla soglia possono facilmente condurre a errori di classificazione, ed è qui che la natura lineare del modello può mostrare i suoi limiti.
Dopo la classificazione, i risultati vengono confrontati con le etichette reali per valutare l’accuratezza del modello. Si utilizza la funzione == per effettuare un confronto elemento per elemento e la funzione nnz() per contare i risultati corretti. La visualizzazione è un passaggio essenziale: due grafici rappresentano le previsioni rispetto ai valori attesi e la matrice di confusione normalizzata che mostra le prestazioni del classificatore.
In alternativa, si può adottare l’approccio TreeBagger(), che costruisce una foresta di alberi decisionali utilizzando il metodo del bagging. Questa tecnica si fonda sull’idea di addestrare più modelli deboli su sottocampioni del dataset e aggregarne i risultati per ottenere una previsione più robusta. Nel caso descritto, vengono generati 100 alberi decisionali su dati identici a quelli utilizzati per fitglm(). Anche qui i risultati vengono ottenuti sul set di test, ma la funzione predict() restituisce inizialmente un array di stringhe, che va convertito in valori numerici con str2double().
La classificazione binaria con TreeBagger() ha il vantaggio di catturare relazioni non lineari e interazioni complesse tra variabili predittive che i modelli lineari potrebbero non rilevare. La robustezza alle anomalie nei dati e la capacità di trattare relazioni non lineari rendono questo metodo spesso preferibile in contesti reali dove i dati sono rumorosi o disomogenei.
Anche con TreeBagger(), l’accuratezza viene valutata confrontando le etichette previste con quelle reali, e i risultati sono visualizzati graficamente come nel caso di fitglm(), con un confronto diretto tra le uscite del modello e le etichette effettive, accompagnato da una matrice di confusione.
Entrambi i metodi restituiscono risultati comparabili in termini di accuratezza, ma la scelta dell’uno rispetto all’altro dipende dalla natura dei dati e dalla complessità del problema. Il modello fitglm() è trasparente, facilmente interpretabile, e adatto a dati ben comportati. TreeBagger() è potente, non richiede assunzioni di linearità, ma più opaco dal punto di vista interpretativo.
È importante sottolineare che la soglia di 0.5 utilizzata nella binarizzazione dell’output del modello può non essere ottimale. Una validazione incrociata o l’analisi della curva ROC può guidare nella scelta di una soglia migliore, soprattutto quando le classi sono sbilanciate. Inoltre, la qualità delle previsioni dipende fortemente dalla qualità e dalla rappresentatività dei dati. Caratteristiche mancanti o mal distribuite possono influenzare negativamente le performance di entrambi i modelli.
Infine, la matrice di confusione offre solo un primo sguardo sulle prestazioni. Metriche come precision, recall, F1-score e l’area sotto la curva ROC devono essere considerate per una valutazione più profonda del classificatore, in particolare in ambito sanitario, dove falsi negativi possono avere conseguenze gravi.

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