Per valutare la precisione di classificazione in un sistema di riconoscimento basato su reti neurali, si utilizza la funzione mean() per ottenere la misura finale in percentuale, mentre la funzione disp() serve a visualizzare questo valore. Un importante strumento di analisi è il grafico di confusione, realizzato tramite la funzione confusionchart(), che mostra i risultati della classificazione distinguendo tra distribuzioni corrette e errate. Questi strumenti forniscono una panoramica immediata della performance del modello, rendendo chiaro quali classi vengono riconosciute correttamente e quali sono invece fonte di confusione.

Nell'ambito della classificazione di suoni animali, due funzioni di supporto, spectro() e move_file(), facilitano rispettivamente la creazione e il ritaglio di spettrogrammi dai dati audio, e l’organizzazione delle immagini risultanti all’interno di cartelle dedicate. Questo processo automatizza la preparazione dei dati, elemento cruciale vista la grande mole di informazioni e i tempi di elaborazione elevati che caratterizzano i dataset audio. Nonostante la semplicità apparente di queste funzioni, la loro implementazione permette di ottimizzare il flusso di lavoro, concentrandosi sulla fase di training e validazione del modello.

L’analisi dei risultati evidenzia come il modello, con un’accuratezza di classificazione del 70% e una precisione di validazione dell’85%, raggiunga performance significative, soprattutto considerando la complessità intrinseca dei dati audio e la difficoltà di estrarre caratteristiche discriminanti automaticamente. Ciò sottolinea come l’approccio basato su reti neurali profonde consenta di superare i limiti della tradizionale estrazione manuale delle feature, permettendo una maggiore automazione e adattabilità.

Il confronto tra algoritmi di machine learning e modelli di deep learning emerge chiaramente dal fatto che, nei primi, l’estrazione delle caratteristiche da immagini o segnali audio richiede un intervento umano preliminare. Al contrario, i modelli di deep learning, come quelli discussi in questo contesto, integrano tale fase all’interno della rete stessa, che apprende automaticamente rappresentazioni complesse dai dati grezzi. Questa distinzione segna una svolta nell’implementazione di sistemi intelligenti, rendendo il deep learning uno strumento particolarmente potente per applicazioni di classificazione automatica.

Gli esempi concreti di progetti di deep learning presentati illustrano applicazioni reali, come la previsione dei livelli energetici di terremoti e la classificazione di immagini di frutta o suoni animali. Questi casi mostrano sia l’uso del deep learning in contesti di regressione sia in compiti di classificazione, confermando la versatilità e l’efficacia di tali metodi. L’abilità di progettare, addestrare e testare reti neurali profonde utilizzando dataset reali costituisce un elemento fondamentale per sviluppare modelli predittivi accurati e affidabili.

È importante riconoscere che le reti neurali sono strutture composte da nodi distribuiti in vari strati — input, hidden e output — il cui funzionamento si basa sulla propagazione dei segnali attraverso questi livelli. La loro capacità di apprendere dipende da algoritmi di ottimizzazione che regolano i pesi delle connessioni, permettendo di adattare il modello ai dati e migliorare progressivamente le performance. Il deep learning, inteso come evoluzione del machine learning, si caratterizza proprio per l’uso di reti con molteplici strati nascosti, capaci di catturare relazioni complesse e astrazioni elevate nei dati.

Nel panorama delle architetture più utilizzate, spiccano reti feedforward, reti con backpropagation e reti convoluzionali, ognuna con peculiarità e campi di applicazione specifici. La capacità di combinare queste strutture con algoritmi di trasferimento di apprendimento permette di accelerare il training e migliorare i risultati anche con dataset limitati.

Infine, la comprensione di questi concetti non può prescindere dalla consapevolezza che l’efficacia di un modello di deep learning dipende non solo dalla struttura della rete, ma anche dalla qualità e dalla quantità dei dati disponibili, dalla loro corretta preparazione e dalla scelta degli algoritmi di training. Solo un approccio olistico che integri questi elementi può portare a risultati robusti e applicabili in scenari reali complessi.

Come si costruiscono ambienti multiagente personalizzati e il controllo di un motore DC con funzioni custom

Gli ambienti multiagente si distinguono principalmente in due categorie: quelli con tempo di campionamento universale, in cui tutti gli agenti agiscono simultaneamente in uno stesso step, e quelli turn-based, in cui solo un gruppo di agenti esegue nel proprio turno assegnato dall’ambiente. Per entrambi i tipi, le specifiche di osservazione e azione sono organizzate come array di celle, ogni elemento corrispondente a un singolo agente. MATLAB mette a disposizione funzioni dedicate per creare ambienti multiagente personalizzati, come rlMultiAgentFunctionEnv() per ambienti a tempo universale e rlTurnBasedFunctionEnv() per ambienti turn-based.

La configurazione delle opzioni di training in ambienti multiagente avviene tramite l’oggetto rlMultiAgentTrainingOptions, che permette di definire se il training sarà decentralizzato, con ogni agente che apprende indipendentemente dalle proprie esperienze, oppure centralizzato, dove le esperienze sono condivise e l’apprendimento avviene collettivamente. Questo distingue due strategie di apprendimento che possono influenzare significativamente i risultati del training e la complessità computazionale. L’uso delle funzioni train() e sim() permette rispettivamente di addestrare e simulare gli agenti all’interno dell’ambiente, mentre il Reinforcement Learning Training Manager facilita la visualizzazione in tempo reale del progresso di tutti gli agenti coinvolti.

La creazione di ambienti personalizzati può avvenire attraverso template modificabili con la funzione rlCreateEnvTemplate(). Questa modalità, più articolata rispetto alla semplice definizione delle funzioni step() e reset(), consente una flessibilità superiore, offrendo la possibilità di aggiungere proprietà e metodi specifici alle proprie necessità, come metodi di visualizzazione personalizzati.

Parallelamente, ambienti personalizzati possono essere sviluppati tramite Simulink, che consente di modellare anche ambienti multiagente con esecuzione multirate, cioè in cui ogni agente può avere un proprio rate di campionamento.

Per chiarire questi concetti, consideriamo il progetto di controllo di un motore DC realizzato con un ambiente a funzione personalizzata. La costruzione dell’ambiente prevede la definizione di due funzioni fondamentali: reset() e step(). La funzione reset() imposta lo stato iniziale dell’ambiente, mentre step() aggiorna lo stato in base all’azione dell’agente, restituendo la nuova osservazione, la ricompensa, lo stato terminale e il nuovo stato.

Nel caso specifico del motore DC, l’obiettivo di controllo è impostare una tensione desiderata (azione) e monitorare la velocità angolare del motore per mantenerla vicina a un valore target, definito dall’angolo di rotazione θ e dalla sua velocità angolare dθ. Lo stato iniziale viene randomizzato entro un intervallo ristretto per θ, mentre dθ è inizialmente zero. La funzione reset() definisce questi valori e li restituisce come stato iniziale e osservazione iniziale.

La funzione step() prende in ingresso l’azione (la tensione applicata) e lo stato corrente, e calcola il nuovo stato usando un modello di controllo PD (proporzionale-derivativo). Viene verificata la validità dell’azione, assicurandosi che rientri nel range massimo consentito di ±50 RPM. Il passo temporale è fissato a 20 ms, mentre l’angolo di tolleranza è pari a 2 gradi (0,035 rad). Se il motore opera entro questa soglia, viene assegnata una ricompensa positiva; altrimenti, viene penalizzato con un valore negativo, indicando un fallimento. La funzione implementa inoltre un’integrazione di tipo Euler per aggiornare lo stato secondo la dinamica del sistema.

Questo esempio dimostra come, attraverso l’uso di funzioni custom, si possa modellare un ambiente di controllo complesso, integrando dinamiche fisiche reali e regole di apprendimento rinforzato in modo flessibile e modulare.

È importante comprendere che la scelta tra training centralizzato e decentralizzato influenza non solo la condivisione delle informazioni tra agenti ma anche la scalabilità e la robustezza del sistema. Un sistema centralizzato può sfruttare una quantità maggiore di dati condivisi per un apprendimento più efficiente, mentre un sistema decentralizzato favorisce autonomia e resilienza a guasti localizzati. Inoltre, la progettazione di funzioni reset() e step() deve riflettere con precisione la dinamica del sistema fisico o virtuale per evitare discrepanze che compromettano l’apprendimento. Infine, il tuning accurato dei parametri del controllore, come i guadagni proporzionale e derivativo, e la definizione di condizioni di terminazione sensate sono essenziali per un comportamento stabile e desiderabile dell’agente.

Come si misura l’incertezza e si sceglie la migliore caratteristica in un albero decisionale?

Per costruire un albero decisionale efficace, non basta semplicemente dividere i dati in base a caratteristiche, ma è necessario valutare quanto ogni divisione riduca l’incertezza o il disordine nei dati. Questo si realizza tramite il concetto di impurità, che in ambito di alberi decisionali si misura comunemente con l’entropia. L’entropia quantifica il grado di disordine o di mescolanza delle classi all’interno di un nodo: un’entropia pari a zero indica un nodo puro, composto da elementi appartenenti tutti alla stessa classe, mentre valori più alti indicano una maggiore impurità.

Quando si esamina una divisione basata su una certa caratteristica, calcoliamo l’entropia di ciascun sottoinsieme generato. La divisione è efficace se l’entropia complessiva dei sottoinsiemi è inferiore a quella del nodo originario. Per esempio, consideriamo una divisione dei dati secondo due caratteristiche diverse, chiamate feature 2 e feature 3. Se la divisione basata su feature 3 produce un nodo con entropia minore rispetto a quella prodotta da feature 2, significa che feature 3 genera una partizione più “pulita” e quindi più utile per la costruzione dell’albero.

L’entropia si calcola con la formula:

E(S)=ipilog2piE(S) = - \sum_{i} p_i \log_2 p_i

dove pip_i è la proporzione di esempi appartenenti alla classe ii nel sottoinsieme SS. L’entropia massima si ha quando le classi sono equamente distribuite, e decresce man mano che una classe domina sugli altri.

Tuttavia, il solo calcolo dell’entropia non è sufficiente a decidere quale caratteristica utilizzare per il nodo di partenza (root node). È necessario quantificare la riduzione di entropia ottenuta dividendo i dati in base a una caratteristica: questa misura prende il nome di Information Gain (guadagno di informazione).

Il guadagno di informazione si calcola sottraendo l’entropia condizionata, cioè l’entropia media dei sottoinsiemi generati dalla divisione, dall’entropia iniziale del nodo. Formalmente:

IG(Y,X)=E(Y)E(YX)IG(Y, X) = E(Y) - E(Y|X)

dove E(Y)E(Y) è l’entropia iniziale della variabile target YY, e E(YX)E(Y|X) è l’entropia media di YY condizionata al valore della caratteristica XX.

Questo indice rappresenta quanto l’incertezza sulla variabile target si riduce dopo aver osservato il valore della caratteristica scelta. Maggiore è il guadagno di informazione, più efficace è la caratteristica nel separare i dati e quindi più opportuno è usarla come nodo di partenza.

Per esempio, se un gruppo di persone deve decidere se partire per un viaggio all’estero o meno, e sono disponibili due caratteristiche per prevedere questa decisione — la quantità di denaro disponibile (alta o bassa) e il tempo libero (poco, qualche, abbastanza) — possiamo calcolare il guadagno di informazione per entrambe. Se il guadagno di informazione associato al denaro è più alto di quello associato al tempo, allora la caratteristica denaro diventerà il nodo radice dell’albero.

Dopo aver scelto la caratteristica con il massimo guadagno di informazione, l’albero viene costruito ricorsivamente, suddividendo i dati nei nodi figli e ripetendo il calcolo di entropia e guadagno di informazione per le caratteristiche rimanenti, fino a raggiungere nodi puri o soddisfare criteri di arresto.

Questo metodo è fondamentale non solo per alberi decisionali di esempio ma anche per applicazioni reali, come la valutazione del rischio in assicurazioni auto. Supponiamo che una compagnia di assicurazioni desideri prevedere il rischio di un cliente basandosi sul numero di incidenti stradali passati (basso, normale, alto). Il rischio (basso o alto) rappresenta la variabile target. Calcolando l’entropia e il guadagno di informazione rispetto alla caratteristica incidenti, l’azienda può stabilire una soglia efficace per la classificazione dei clienti in base al loro rischio, ottimizzando così le tariffe assicurative.

È importante comprendere che il guadagno di informazione non è sempre l’unica misura utilizzata; esistono anche altri criteri, come l’indice di Gini, ma il principio di base rimane il medesimo: misurare la capacità di una caratteristica di ridurre l’incertezza riguardo la variabile target. Inoltre, bisogna essere consapevoli che una divisione che massimizza il guadagno di informazione può essere influenzata dalla presenza di molteplici valori nella caratteristica, per cui tecniche di normalizzazione o correzione possono essere necessarie per evitare bias.

Un’ulteriore considerazione riguarda la generalizzazione del modello: la selezione delle caratteristiche esclusivamente basata sul guadagno di informazione può portare a modelli complessi e sovradattati. Perciò, spesso si introduce una soglia minima di guadagno o si limitano le dimensioni dell’albero per mantenere un equilibrio tra accuratezza e capacità di generalizzare.

La comprensione dell’entropia e del guadagno di informazione è dunque essenziale per la costruzione di alberi decisionali robusti e interpretabili, fondamentali in molte applicazioni di machine learning e data mining. Questi concetti permettono di valutare sistematicamente quale caratteristica offre la migliore capacità discriminante e come procedere nel processo decisionale in modo quantitativo e oggettivo.

Come Determinare il Valore di Azione in un Sistema di Controllo Fuzzy: Il Metodo COG e la Creazione della Tabella di Ricerca

Nel contesto del controllo fuzzy, le funzioni di appartenenza che rappresentano l'aggiustamento del controllo sono ponderate in base alla variazione dell'input e ai diversi contributi di controllo. Questo processo è illustrato dal diagramma di Figura 3.11. Per una coppia di temperatura e velocità di variazione della temperatura, esistono quattro set di output fuzzy. Per determinare il valore preciso dell'azione da intraprendere in base a questi contributi, è possibile scegliere il valore massimo tramite il metodo MOM (Maximum of Maximum), oppure utilizzare il metodo del Centro di Gravità (COG). In questo caso, viene adottato il metodo COG, dove l'azione è determinata dal centro dell'area sommata, che è contribuita dai diversi output fuzzy. Inoltre, il metodo COG offre una tabella di ricerca più affidabile rispetto all'operazione MOM.

Per esempio, considerando una temperatura di 35°F e una velocità di variazione della temperatura di 1°F all'ora, l'elemento di output fuzzy yy per questa coppia di input può essere calcolato come segue:

y=0.6×800+0.4×300+0.4×800+0.8×500=600R/My = 0.6 \times 800 + 0.4 \times 300 + 0.4 \times 800 + 0.8 \times 500 = 600R/M (3.20). Questo output defuzzificato rappresenta un valore preciso, che dovrà essere inserito in una cella di una tabella di ricerca, chiamata lookup table.

Nel caso di una temperatura di 35°F, appartenente alla funzione di appartenenza "LOW" della temperatura, e di una velocità di variazione della temperatura di 1°F/ora, appartenente anche alla funzione di appartenenza "LOW" della velocità di variazione della temperatura, questo valore di output dovrebbe essere posizionato nel punto di intersezione tra la temperatura "LOW" (riga) e la velocità di variazione "LOW" (colonna), come mostrato nella Tabella 3.2.

Per riempire questa tabella, è necessario calcolare tutti gli altri valori di output fuzzy utilizzando la tecnica di defuzzificazione e collocarli nelle celle appropriate della tabella di ricerca, come abbiamo fatto sopra. In generale, le dimensioni delle regole fuzzy dovrebbero essere identiche alle dimensioni della tabella di ricerca, come illustrato in questo esempio.

Per ottenere un controllo più preciso dei valori degli output fuzzy, è possibile suddividere ulteriormente gli input, come la temperatura e la velocità di variazione della temperatura, in sottogruppi più piccoli, per ottenere funzioni di appartenenza più dettagliate. Ad esempio, possiamo definire un sottogruppo "VERY LOW" che copre la fascia 20–30°F per l'input temperatura, un sottogruppo "LOW" che comprende il range da 30 a 40°F, e così via. Applicando lo stesso processo alla velocità di variazione della temperatura e all'output della velocità del motore, possiamo ottenere una tabella di ricerca molto più dettagliata.

Per applicazioni che richiedono una maggiore precisione nel controllo, può essere aggiunto un processo di interpolazione dopo la tabella di ricerca per ottenere un output ancora più preciso. Nella pratica, il metodo fuzzy logic di tipo I può essere implementato in un sistema reale, con la tabella di ricerca memorizzata nella memoria di un computer. L'output fuzzy viene quindi ottenuto in base agli input correnti, esattamente in corrispondenza della riga e della colonna attuali degli input.

Esistono due metodi principali per calcolare il valore dell'output fuzzy nei sistemi di controllo reali: metodi offline e online. Nel primo caso, la tabella di ricerca viene pre-calcolata e memorizzata, mentre nel secondo caso, l'output viene calcolato in tempo reale in base agli input correnti.

Oltre alla defuzzificazione, un altro aspetto fondamentale che deve essere considerato è la costruzione del sistema di controllo fuzzy completo, che include la gestione dei guadagni di controllo e l'integrazione di filtri o altri strumenti di regolazione. Un sistema di controllo fuzzy ben progettato richiede una continua interazione tra il valore di input desiderato (ad esempio, la velocità target) e il feedback ricevuto dal sensore del motore, come un tachimetro. La differenza tra il valore desiderato e il valore effettivo viene quindi utilizzata per regolare l'output, che viene reindirizzato al motore per regolare la velocità.

Inoltre, un aspetto importante da sottolineare è che, nei sistemi di controllo fuzzy, l'output non è sempre un valore numerico perfetto come nei metodi di controllo tradizionali. Invece, l'obiettivo è trovare una soluzione accettabile in tempi più brevi, con una riduzione del carico computazionale. Questo approccio linguistico, in cui le regole di controllo sono espresse in modo comprensibile dall'uomo, permette di ridurre significativamente la complessità del sistema pur mantenendo una buona precisione di controllo. In molti casi, il controllo fuzzy non mira a ottenere una precisione computazionale come nelle tecniche tradizionali, ma piuttosto ad ottenere soluzioni pratiche che siano abbastanza buone per la maggior parte delle applicazioni.

Come funziona la classificazione binaria e come applicarla nella previsione di malattie cardiache?

La classificazione binaria è un processo fondamentale nel campo dell'apprendimento automatico, dove l'obiettivo è determinare a quale delle due categorie (classi) appartiene un dato campione. Ad esempio, in un contesto medico, possiamo cercare di predire se un paziente ha o meno una malattia cardiaca in base ai dati relativi alla sua salute. Questi sistemi di classificazione si basano su algoritmi che apprendono dalle caratteristiche dei dati di addestramento per fare previsioni accurate su nuovi dati.

Nel caso della previsione delle malattie cardiache, i dati comunemente utilizzati includono variabili come l'età, il sesso, il colesterolo, la pressione sanguigna, la storia familiare e altre caratteristiche cliniche. Gli algoritmi di classificazione binaria, come la regressione logistica, le macchine a vettori di supporto (SVM) e gli alberi decisionali, vengono addestrati su questi dati per classificare ogni nuovo individuo in due categorie: "malato" o "non malato".

Per applicare con successo la classificazione binaria in scenari reali, è essenziale avere dati di qualità. La qualità dei dati non si limita alla loro accuratezza, ma include anche la loro completezza e la loro corretta elaborazione. La normalizzazione dei dati, la gestione dei valori mancanti e l'analisi della distribuzione delle classi sono operazioni cruciali per preparare i dati prima che vengano passati agli algoritmi di classificazione. La selezione delle caratteristiche, ovvero il processo di identificare quali variabili sono più importanti per il modello, è un'altra fase fondamentale, che può influire significativamente sulle prestazioni del modello.

Una volta addestrato, il modello di classificazione deve essere validato per garantire che funzioni bene anche su dati non visti, ossia i dati di test. La valutazione delle prestazioni può essere effettuata tramite vari indicatori, come l'accuratezza, la precisione, il richiamo (recall) e la curva ROC (Receiver Operating Characteristic). In scenari di malattia cardiaca, in particolare, è cruciale che il modello non solo minimizzi gli errori complessivi, ma riduca al minimo anche i falsi negativi, poiché è fondamentale identificare correttamente i pazienti malati per poterli trattare tempestivamente.

Le previsioni basate su classificatori binari sono molto utili, ma è importante capire anche i limiti di questi modelli. Se il dataset è sbilanciato, cioè se una delle classi è molto più numerosa dell'altra, l'algoritmo potrebbe predire erroneamente la classe maggioritaria per un numero elevato di campioni. Tecniche come il bilanciamento delle classi, l'uso di pesi differenti per le classi o l'implementazione di algoritmi specializzati possono essere utilizzate per affrontare questi problemi.

Inoltre, quando si utilizza la classificazione binaria in scenari medici, è essenziale considerare le implicazioni etiche. Le decisioni basate su previsioni automatiche devono sempre essere supportate da esperti umani, poiché un errore nel modello potrebbe portare a diagnosi errate e a conseguenze gravi per la salute dei pazienti. L'introduzione di modelli complessi nel campo della medicina deve essere accompagnata da regolamenti, monitoraggio continuo e approvazione da parte di esperti sanitari.

Infine, pur essendo utili in molti contesti, i modelli di classificazione binaria potrebbero non essere sufficienti in situazioni più complesse, dove è necessario distinguere tra più classi. In questi casi, si ricorre alla classificazione multiclass, che si estende dalla semplice distinzione tra due categorie a un sistema che può classificare un campione in più categorie. La classificazione multiclass è utile in situazioni come la diagnosi di malattie con diversi stadi o tipi, dove ogni stadio della malattia potrebbe necessitare di un trattamento diverso.

In conclusione, la classificazione binaria offre potenti strumenti per la predizione di eventi, come la malattia cardiaca, ma il suo successo dipende fortemente dalla qualità dei dati, dalla selezione del modello giusto e dalla validazione accurata. Tuttavia, è fondamentale essere consapevoli delle limitazioni dei modelli predittivi e delle implicazioni etiche, specialmente quando si applicano in ambito sanitario.