Il clustering non supervisionato rappresenta una categoria fondamentale di tecniche di apprendimento automatico che si prefiggono di individuare strutture latenti o raggruppamenti nei dati senza l'ausilio di etichette o informazioni preliminari. Nel contesto dell'analisi esplorativa, questa metodologia consente di scoprire pattern nascosti, facilitare la compressione dei dati e preparare le informazioni per fasi successive di apprendimento supervisionato. Tra le varie tecniche di clustering, quattro sono particolarmente rilevanti: clustering esclusivo, gerarchico, sovrapposto e probabilistico, ognuna con proprie peculiarità e applicazioni.

Il clustering esclusivo, noto anche come K-Means clustering, si basa sul concetto di partizionare un insieme di dati in K cluster distinti, ognuno identificato da un centroide. La ragione di essere di questo algoritmo consiste nell’assegnare ogni punto dati al cluster il cui centroide è il più vicino, minimizzando così la somma delle distanze all’interno dei gruppi. La semplicità e l’efficacia di K-Means hanno reso questa tecnica una delle più utilizzate nelle applicazioni pratiche, inclusa l’implementazione in MATLAB tramite funzioni specifiche.

Nel processo di addestramento di un modello K-Means in MATLAB, si può visualizzare l’analisi dei risultati attraverso diverse rappresentazioni grafiche: le distanze tra i nodi, i piani dei pesi, i colpi campione e le posizioni dei pesi. La mappa auto-organizzante (Self-Organizing Map, SOM) rappresenta una delle tecniche di clustering che, mediante una griglia di neuroni, evidenzia la topologia dei dati e permette di osservare la distribuzione delle osservazioni tra i cluster. Ad esempio, la visualizzazione delle distanze tra neuroni mostra come le regioni più scure indicano distanze maggiori e quelle più chiare distanze minori, mentre il piano dei pesi offre una rappresentazione delle connessioni tra input e neuroni, evidenziando le correlazioni tra caratteristiche dei dati.

L’implementazione di queste tecniche in MATLAB si avvale di funzioni ben definite. Per il clustering K-Means, ad esempio, esistono diverse modalità di chiamata della funzione kmeans(), che permettono di ottenere non solo gli indici dei cluster di ogni osservazione, ma anche i centroidi, la somma delle distanze intra-cluster e le distanze da ogni punto ai centroidi. Questi parametri sono fondamentali per valutare la qualità della partizione e per comprendere la struttura sottostante ai dati. Un’alternativa simile è il clustering K-Medoids, che utilizza punti centrali reali tra le osservazioni anziché centriide calcolati, risultando talvolta più robusto a outlier e rumore.

La distanza di Mahalanobis, misurata attraverso la funzione mahal(), è uno strumento essenziale in questo ambito, poiché permette di quantificare la distanza tra un punto dati e una distribuzione multivariata, considerando la covarianza tra le variabili. Tale misura è particolarmente utile per identificare punti anomali e per affinare la segmentazione dei dati nei cluster.

Il clustering non supervisionato non solo facilita la scoperta di strutture e relazioni nei dati ma rappresenta anche un passo preliminare fondamentale per molte applicazioni di machine learning. Comprendere i criteri di similarità, i metodi di partizionamento e le metriche di distanza consente di utilizzare al meglio questi strumenti per analisi approfondite e significative. In particolare, è cruciale riconoscere che la scelta del numero di cluster k influisce profondamente sui risultati e che la correlazione tra le caratteristiche può essere valutata osservando i pesi delle connessioni nei modelli SOM o attraverso analisi statistiche più classiche.

Oltre a ciò, è importante considerare che le tecniche di clustering possono essere applicate anche a dati ad alta dimensionalità, dove la selezione e la trasformazione delle caratteristiche (feature engineering) diventano indispensabili. In questi casi, l’uso combinato di metodi di riduzione della dimensionalità e clustering può migliorare notevolmente l’interpretabilità e la qualità della segmentazione.

Infine, la capacità di esportare i modelli addestrati in ambienti di lavoro, come nel caso di MATLAB, consente di utilizzare i cluster identificati per classificare nuovi dati, estendendo così l’utilità del clustering non supervisionato in contesti dinamici e applicativi reali.

Come eseguire l'analisi di clustering gerarchico con MATLAB

L'analisi di clustering gerarchico è una tecnica fondamentale per raggruppare oggetti simili in un insieme di dati, creando una struttura ad albero che rappresenta le relazioni tra gli oggetti. Utilizzando le funzioni del toolbox di statistica e machine learning in MATLAB, possiamo facilmente implementare questo tipo di analisi. In particolare, le funzioni pdist(), linkage(), cluster() e dendrogram() possono essere utilizzate insieme per creare un modello di clustering gerarchico in tre semplici passaggi: calcolare le distanze, raggruppare gli oggetti in cluster binari, e determinare il punto di taglio per generare i cluster definitivi.

Il cuore dell'analisi sta nell'utilizzo della funzione clusterdata(), che integra automaticamente tutte le altre funzioni necessarie. In altre parole, non è necessario eseguire separatamente pdist(), linkage() e cluster(), ma è sufficiente utilizzare clusterdata() per ottenere il risultato finale.

Calcolare la Similarità o Dissimilarità tra gli Oggetti

Il primo passo nell'eseguire un'analisi di clustering gerarchico consiste nel calcolare la distanza tra ogni coppia di oggetti nel dataset. La funzione pdist() è utilizzata per calcolare la distanza euclidea tra gli oggetti in un matrice di input X. Un aspetto importante di pdist() è che essa supporta vari modelli di distanza. Il modello predefinito è la distanza euclidea, ma è possibile scegliere anche altre opzioni, come la distanza quadratica euclidea, la distanza Minkowski o la distanza di Manhattan, a seconda delle caratteristiche dei dati e degli obiettivi dell'analisi.

Per esempio, se si dispone di una matrice X contenente cinque coppie di osservazioni come (2,1), (4.5,2.5), (2,2), (1.5,4), e (2.5,4), la funzione pdist(X) calcolerà tutte le distanze euclidee tra queste coppie. In un piano cartesiano, la distanza euclidea tra due punti (x_i, y_i) e (x_j, y_j) è data dalla formula:

d=(xixj)2+(yiyj)2d = \sqrt{(x_i - x_j)^2 + (y_i - y_j)^2}

Nel caso di una matrice X di dimensione m × 2, ci saranno m×(m1)/2m \times (m-1) / 2 distanze da calcolare. Per esempio, se abbiamo cinque osservazioni, come nel caso della matrice precedente, il numero totale di distanze da calcolare sarà 10.

Raggruppare gli Oggetti in un Albero Clustering Gerarchico

Una volta calcolate le distanze tra gli oggetti, si passa al secondo passo, che consiste nel raggruppare gli oggetti in un albero di clustering gerarchico. Questo viene fatto con la funzione linkage(), che crea un albero gerarchico a partire dalle distanze calcolate con pdist(). La funzione linkage() collega le coppie di oggetti più vicine (cioè quelle con la distanza minore) e forma cluster binari. Questi cluster vengono successivamente uniti per formare cluster più grandi, creando un albero gerarchico completo.

La funzione linkage() può essere configurata per utilizzare diversi metodi per determinare la distanza tra i cluster. Il metodo predefinito è il "single linkage", che misura la distanza minima tra i punti di due cluster. Altri metodi includono il "complete linkage" (distanza massima) e il "average linkage" (distanza media). Quando la funzione linkage() è applicata, produce una matrice in cui ogni riga rappresenta una coppia di oggetti o cluster uniti, con la distanza tra di essi nel terzo elemento della riga.

Determinare il Punto di Taglio e Formare i Cluster

Il passo finale è determinare dove "tagliare" l'albero gerarchico per formare i cluster finali. La funzione cluster() è utilizzata per questo scopo. Essa permette di "potare" il ramo inferiore dell'albero, assegnando tutti gli oggetti al di sotto di ciascun taglio a un singolo cluster. I cluster possono essere determinati in modo automatico, sulla base delle relazioni naturali tra gli oggetti, oppure il taglio può essere effettuato in un punto arbitrario, a seconda delle necessità.

Quando si utilizza cluster(), si può scegliere di tagliare l'albero ad un determinato livello per formare un numero specifico di cluster, o lasciare che la funzione individui automaticamente il numero di cluster più significativo, basandosi sulle caratteristiche dei dati. La scelta del punto di taglio ha un impatto significativo sul risultato finale dell'analisi.

Considerazioni Finali

È importante comprendere che l'analisi di clustering gerarchico è altamente sensibile alla distanza utilizzata. La scelta della funzione di distanza (come Euclidea, Minkowski, Manhattan, ecc.) può influenzare significativamente i risultati. Inoltre, il metodo di linkage (ad esempio, single, complete o average) può alterare il modo in cui i cluster vengono formati.

Un altro aspetto fondamentale è che l'analisi di clustering gerarchico non è sempre in grado di rivelare strutture chiare nei dati. A volte, i dati possono contenere rumore o comportamenti complessi che non si prestano facilmente a una divisione netta in cluster distinti. Per questo motivo, è importante non solo eseguire l'analisi, ma anche valutare la validità e la coerenza dei risultati ottenuti.

Come Funziona l'Algoritmo Fuzzy C-Means (FCM) in MATLAB e il Suo Utilizzo per la Creazione di Sistemi di Inferenza Fuzzy

Il fuzzy c-means (FCM) è un algoritmo di clustering che appartiene alla famiglia dei metodi di clustering non supervisionato. A differenza dei metodi tradizionali di clustering che assegnano ogni punto dati a un unico cluster, l'FCM consente a ciascun punto di appartenere a più cluster con gradi di appartenenza differenti. In questo contesto, il grado di appartenenza di un punto dati a un determinato cluster è rappresentato da un valore di affinità compreso tra 0 e 1, con la somma dei gradi di appartenenza per ogni punto che deve sempre essere uguale a 1.

Nel caso in cui si desideri utilizzare l'algoritmo FCM in MATLAB, è possibile fare affidamento sulla funzione fcm(). Questa funzione, che è parte della toolbox di MATLAB per l'analisi dei dati e l'apprendimento automatico, esegue il clustering fuzzy sui dati. Per specificare le opzioni dell'algoritmo di clustering, si utilizza un oggetto fcmOptions, che consente di personalizzare vari parametri come il numero di cluster e la metrica di distanza.

Funzione fcm() e i Suoi Costruttori

La funzione fcm() offre diversi costruttori che possono essere utilizzati a seconda delle esigenze specifiche dell'utente. I tre principali costruttori sono:

  1. [centers, U] = fcm(data): Questo costruttore calcola i centri dei cluster (centers) e la matrice di appartenenza fuzzy (U) utilizzando le opzioni di clustering predefinite. Le opzioni di default fanno sì che l'algoritmo esegua il clustering dei dati 10 volte, variando il numero di cluster da 2 a 11.

  2. [centers, U] = fcm(data, options): In questo caso, è possibile specificare esplicitamente le opzioni di clustering, come il numero di cluster e la metrica di distanza, passando un oggetto fcmOptions.

  3. [centers, U, objFcn] = fcm(…): Questo costruttore restituisce anche i valori della funzione obiettivo (objFcn) per ogni iterazione di ottimizzazione, oltre ai centri e alla matrice di appartenenza.

Opzioni di fcmOptions

Un oggetto fcmOptions è cruciale per personalizzare l'algoritmo. Questo oggetto permette di configurare vari parametri, tra cui il numero di cluster, l'esponente utilizzato per calcolare la "fuzziness" e la metrica di distanza. Due costruttori principali per l'oggetto fcmOptions sono:

  1. opt = fcmOptions: Restituisce un oggetto di opzioni predefinito per il clustering FCM.

  2. opt = fcmOptions(Name=Value): Permette di specificare opzioni personalizzate utilizzando coppie nome-valore. Ad esempio, per impostare tre cluster, si può usare NumClusters=3.

Le proprietà più importanti di fcmOptions includono:

  • NumClusters: Definisce il numero di cluster da generare. Può essere impostato su "auto" per permettere al sistema di selezionare automaticamente il numero ottimale di cluster.

  • Exponent: Regola il grado di "fuzziness" del clustering. Un valore più alto avvicina i centri dei cluster e fa sì che i punti dati abbiano affinità simile con tutti i cluster.

  • ClusterCenters: Rappresenta la posizione dei centri dei cluster, generalmente come una matrice di dimensioni C × N, dove C è il numero di cluster e N è il numero di caratteristiche nei dati.

Esempio Pratico di Applicazione in MATLAB

Consideriamo il caso dell'analisi di un dataset medico, come quello del diabete, contenente dati sulle misurazioni di glucosio e pressione sanguigna. Per applicare l'algoritmo FCM a questo dataset, un tipico script MATLAB potrebbe seguire questi passaggi:

  1. Caricamento del dataset: Il dataset viene caricato e assegnato a una variabile locale. In questo caso, si lavora con il file "Diabetes.csv", che deve essere salvato nel percorso appropriato sul computer.

  2. Selezione dei dati rilevanti: Vengono estratti solo i dati pertinenti per il clustering, come le colonne relative al glucosio e alla pressione sanguigna.

  3. Definizione delle opzioni FCM: Viene creato un oggetto fcmOptions per configurare l'algoritmo. Ad esempio, si possono definire due cluster, un esponente di 3 per la "fuzziness", e abilitare la modalità verbosa per monitorare i passaggi dell'algoritmo.

  4. Esecuzione dell'algoritmo FCM: La funzione fcm() esegue il clustering, restituendo i centri dei cluster e la matrice di appartenenza fuzzy.

  5. Visualizzazione dei risultati: I risultati possono essere visualizzati graficamente, mostrando come i punti dati sono distribuiti tra i cluster e indicando visivamente i centri dei cluster.

Un esempio di codice MATLAB che esegue il clustering FCM su un dataset di diabete potrebbe essere il seguente:

matlab
path = 'C:\\Diabetes.csv';
T = readtable(path); N = 600; GLUCOSE = table2array(T(1:N, 2)); BLOODP = table2array(T(1:N, 3)); X = [GLUCOSE BLOODP]; options = fcmOptions(NumClusters=2, Exponent=3.0, Verbose=true); [centers, U] = fcm(X, options); maxU = max(U); index1 = find(U(1, :) == maxU); index2 = find(U(2, :) == maxU); plot(X(index1, 1), X(index1, 2),"ob") hold on plot(X(index2, 1), X(index2, 2), "or") plot(centers(1, 1), centers(1, 2), "xb", MarkerSize=25, LineWidth=5) plot(centers(2, 1), centers(2, 2), "xr", MarkerSize=25, LineWidth=5) xlabel("Glucose") ylabel("Blood Pressure") hold off

Cosa Contribuisce al Successo di FCM?

Oltre alla corretta configurazione dell'algoritmo, è importante notare che il successo del clustering fuzzy dipende fortemente dalla qualità e dalla natura dei dati stessi. Quando i dati sono altamente sovrapposti o mal separati, il clustering fuzzy potrebbe risultare meno efficace rispetto a metodi di clustering più rigidi. È quindi fondamentale pre-processare i dati e selezionare accuratamente le caratteristiche da utilizzare nel processo di clustering.

Anche la scelta dell'esponente e della metrica di distanza gioca un ruolo cruciale nel comportamento dell'algoritmo. Un esponente elevato può portare a cluster più stretti, mentre uno troppo basso può causare una diffusione troppo ampia dei cluster, riducendo la precisione dei risultati. La metrica di distanza, come l'Euclidea, è anch'essa fondamentale, poiché determina come le distanze tra i punti dati vengono calcolate e quindi influisce sull'aggregazione dei dati.