Gli algoritmi di riduzione delle dimensioni

Gli algoritmi di riduzione delle dimensioni

Condividi con i tuoi amici...

Nell’ambito dell’analisi dei dati, la loro visualizzazione grafica è una parte importante perché permette di individuare aspetti che sfuggono sicuramente ad una rappresentazione puramente numerica.

In particolare, gli algoritmi di clustering di cui abbiamo già parlato diffusamente qui, a partire da un certo numero di elementi (istanze o righe di una tabella) a cui sono associati delle caratteristiche (attributi o colonne di una tabella) sono in grado di creare dei clusters o classi di tali elementi sulla base della similitudine tra di essi dovuta a valori simili degli attributi.

Se per esempio i dati sono costituiti da 3 elementi A,B e C (istanze) che rappresentano tre persone: Aldo, Bruno e Carlo con i seguenti due attributi: altezza (H) e peso(W), la rappresentazione tabellare può essere la seguente

HW
A17080
B17580
C19095

I punti rappresentano gli elementi della tabella che in questo caso sono persone. Le dimensioni (asse X e Y) sono gli attributi. Se applicassimo un algoritmo di clustering (ad esempio KMeans) richiedendo di formare due cluester, esso raggrupperebbe A e B in un cluster e C in un altro com’è facilmente prevedibile guardando il grafico, in quanto A e B sono molto più vicini tra loro di quanto non lo siano rispetto a C. Una volta trovate le classi, anche queste sono facilmente visualizzabili sul grafico a due dimensioni.

Quello che in questo articolo ci preme sottolineare è il fatto che spesso è necessario tener conto di molti attributi e non soltanto di due. Per esempio la seguente tabella mostra 13 attributi e quindi lo spazio in cui rappresentare ogni singolo elemento (riga) dev’essere di 13 dimensioni:

Quando si ha a che fare con le immagini ogni pixel è un attributo che può assumere diversi valori di luminosità e colore, quindi si devono considerare migliaia di attributi rappresentabili in uno spazio multidimensionale. Per esempio, un’immagine di 28×28 pixel avrebbe effettivamente 784 dimensioni distinte – una per ogni pixel nell’immagine. Questo perché ogni pixel porta con sé informazioni (ad esempio, quanto è scuro) che aiutano a definire l’immagine nel suo complesso.

Eseguendo un algoritmo di clustering su elementi in uno spazio a molte dimensioni, per ognuno di essi si ottiene l’etichetta del cluster a cui appartiene ma non è più possibile visualizzare mediante un grafico questi punti e i rispettivi clusters.

Per risolvere questa difficoltà entrano in gioco gli algoritmi di riduzione delle dimensioni.

In particolare, spieghiamo come funziona l’algoritmo t-distributed Stochastic Neighbor Embedding (t-SNE)

L’algoritmo t-SNE

l’algoritmo t-SNE è una tecnica di riduzione dimensionale utilizzata per visualizzare e analizzare dati complessi mantenendo le relazioni relative tra i punti originali. L’obiettivo principale di t-SNE non è la compressione dei dati, ma piuttosto la creazione di una rappresentazione a dimensione ridotta dei dati che mantenga le strutture e le relazioni tra i punti.

La seguente immagine mostra la riduzione di dimensioni da tre a due di un sistema di 100 punti. In questo caso specifico tale riduzione non è molto utile in quanto sino a tre dimensioni i punti sono visualizzabili senza dover scendere di dimensionalità, ma lo scopo è quello di mostrare come la nuvola di punti in due dimensioni rimanga abbastanza concentrata come lo era in tre dimensioni. Il ridimensionamento deve mantenere vicini punti vicini e lontani punti lontani.

Nella transizione da un spazio multidimensionale a uno spazio di minor dimensione, alcune proprietà – come la distanza euclidea tra i punti – possono non essere conservate. Questo costituisce uno dei principali problemi della riduzione della dimensionalità e risulta essere un compromesso inevitabile nel tentativo di rappresentare un insieme di dati multidimensionale in uno spazio di dimensione inferiore.

Prendiamo l’esempio di tre punti equidistanti in uno spazio 2D. Se visualizzi questi punti come i vertici di un triangolo equilatero, vedrai che ogni punto è alla stessa distanza dagli altri due. Tuttavia, nello spazio unidimensionale (ad esempio su una linea), non esiste una configurazione che permetta a tre punti di essere tutti equidistanti tra loro.

In un caso come questo, gli algoritmi di riduzione della dimensionalità, come t-SNE, devono fare delle scelte su come posizionare i punti nello spazio ridotto. Una strategia potrebbe essere quella di preservare la distanza tra due dei tre punti, accettando che il terzo punto non sarà alla stessa distanza rispetto agli altri due.

Detto questo, il t-SNE è particolarmente efficace nel conservare le strutture locali dei dati, ovvero le distanze tra i punti che sono vicini nello spazio originale. Ciò significa che i punti che erano vicini nello spazio 2D tendono ad essere vicini anche nello spazio unidimensionale.

Il problema dell’affollamento

Il problema principale che t-SNE cerca di risolvere è il problema del “crowding” (o affollamento) che può sorgere quando si tenta di mappare punti dati ad alta dimensionalità in uno spazio a bassa dimensionalità. Questo perché in uno spazio ad alta dimensionalità, i punti di dati possono essere molto più distribuiti rispetto a quello che sarebbero in uno spazio a bassa dimensionalità, e quindi lo spazio a bassa dimensionalità può diventare “affollato”.

Immagina, per esempio, un gruppo di amici che vogliono fare una foto. In un campo aperto (spazio ad alta dimensionalità), possono distribuirsi liberamente e mantenere una buona distanza tra di loro. Però, se provano a fare la stessa foto stando tutti in una piccola stanza (spazio a bassa dimensionalità), saranno costretti a raggrupparsi (affollamento). La soluzione proposta dal t-SNE è come se il fotografo, anziché posizionare gli amici in base alla loro distanza esatta, decidesse la loro posizione basandosi su una sorta di probabilità che ogni coppia di essi ha di essere vicini tra di loro.

Usando la distribuzione t (Student) per il calcolo delle probabilità, il t-SNE può fare in modo che piccole distanze nello spazio ad alta dimensionalità corrispondano a grandi distanze nello spazio a bassa dimensionalità, il che aiuta a risolvere il problema dell’affollamento.

Approfondimento matematico

L’algoritmo t-SNE si basa su due fasi principali: la costruzione di una distribuzione di probabilità congiunta sulle coppie di punti originali (basata sulla distanza tra di loro) e la costruzione di una distribuzione di probabilità simile sulla proiezione a dimensione ridotta. Queste distribuzioni di probabilità rappresentano le similarità tra i punti.

Una domanda che potrebbe sorgere è:

perché non si usa direttamente la distanza euclidea e non si confronta la distanza tra due punti nello spazio multidimensionale con la distanza degli omologhi punti nello spazio a dimensioni inferiori?

Nell’algoritmo t-SNE non si utilizza direttamente la distanza euclidea tra i punti nello spazio ad alta dimensione e la distanza tra gli stessi punti nella mappa a bassa dimensione perché ciò potrebbe non riflettere accuratamente la struttura dei dati e potrebbe portare a una rappresentazione distorta.

La ragione principale è che la distanza euclidea ha una crescita asintotica con la dimensione dello spazio. Ciò significa che all’aumentare della dimensionalità, la distanza euclidea tende a diventare sempre più grande, indipendentemente dall’effettiva distanza tra i punti di dati. Questo può portare a una sovrastima della distanza tra i punti nella mappa a bassa dimensione rispetto alle loro distanze reali nello spazio ad alta dimensione.

Vediamo quali sono le distribuzioni di probabilità impiegate nell’algoritmo t-SNE

Il gradiente t-SNE (dC/dy) respinge fortemente i punti dati dissimili che sono modellati da una piccola distanza a coppie nella rappresentazione a bassa dimensione. Questo impedisce l’affollamento.

Entropia e perplexity

L’entropia riferita al punto Xi è definita come segue:

H(Pi) = – ∑j Pi|j log2 Pi|j

l’entropia, in questo caso, misura la quantità di “sorpresa” o “incertezza” nella scelta di un “vicino” del punto Xi.

Se i punti in un vicinato sono più o meno ugualmente probabili di essere scelti come “vicini”, l’entropia sarà alta (indicando una grande incertezza). Al contrario, se esiste un punto che è molto più probabile che sia scelto rispetto agli altri, l’entropia sarà bassa (indicando una bassa incertezza).

Ricordiamoci che quello appena indicato è il significato dell’entropia di Shannon. Più certezza indica più informazione e minor entropia. Minore certezza significa minore informazione e quindi maggiore entropia.

La perplexity è definita come segue:

Perp(Pi) = 2H(Pi) = 2– ∑j Pi|j log2 Pi|j

L’entropia calcolata viene quindi elevata alla potenza di 2 per ottenere la perplexity. Questo valore di perplexity è usato come parametro di controllo per bilanciare la scala di come i punti sono vicini gli uni agli altri nella mappa a bassa dimensione.

Poichè 2H(Pi) indica il numero di configurazioni nelle quali i punti sono considerati vicini, in linea di principio, un valore di perplexity alto tende a portare a una maggiore aggregazione e densità dei punti nella mappa a bassa dimensione.

Poiché la perplexity è una misura approssimativa della “vicinanza” dei punti nella mappa a bassa dimensione, un valore più alto di perplexity implica una maggiore tendenza a raggruppare i punti in cluster compatti nella mappa. I punti che sono simili o vicini nello spazio ad alta dimensione tendono ad essere posizionati molto vicini nella mappa a bassa dimensione.

Tuttavia, vale la pena sottolineare che il legame tra la perplexity e la distribuzione dei punti è complesso. Mentre un valore di perplexity più alto può incoraggiare una maggiore densità di punti in regioni simili, non garantisce necessariamente una rappresentazione ottimale o una corrispondenza perfetta con la distribuzione originale.

L’algoritmo del t-SNE

Il seguente grafico è stato fatto mediante il plug in Show My diagram di GPT4 – Mermaid sulla base della teoria esposta su Visualizing Data using t-SNE

Esempio di visualizzazione di cluster in due dimensioni derivato dalla riduzione dimensionale

Tratto da Visualizing Data using t-SNE

Codice python

Il seguente è un esempio di codice utile per eseguire una riduzione delle dimensioni a partire dai dati di un file csv. Il codice genera anche un grafico dei punti nello spazio ridimensionato.

import pandas as pd
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

def reduce_dimension(csv_file):
    # Leggi i dati dal file csv
    df = pd.read_csv(csv_file) 

    # Applica l'algoritmo t-SNE 
    tsne = TSNE(n_components=2, random_state=0) # Creazione dell'oggetto tsne
    tsne_data = tsne.fit_transform(df) # Fitting e trasformazione dei dati

    # Crea un nuovo DataFrame per i dati trasformati
    tsne_df = pd.DataFrame(data = tsne_data, columns = ['Dimension 1', 'Dimension 2'])

    return tsne_df

def plot_tsne(df):
    plt.figure(figsize=(6, 6))
    plt.scatter(df['Dimension 1'], df['Dimension 2'])
    plt.xlabel('Dimension 1')
    plt.ylabel('Dimension 2')
    plt.title('t-SNE 2D Visualization')
    plt.show()

csv_file = "dati.csv" 
new_df = reduce_dimension(csv_file)

print(new_df.head())

# Visualizza i dati
plot_tsne(new_df)