Dimensionality Reduction
La riduzione della dimensionalità mappa dati con molte caratteristiche in uno spazio con molte meno dimensioni, preservandone la struttura con metodi come PCA, t-SNE, UMAP e gli autoencoder.
La riduzione della dimensionalità trasforma dati descritti da molte feature in una rappresentazione con molte meno feature, che conserva le informazioni rilevanti, come la varianza dei dati, le distanze tra i punti o i punti più vicini. Un'immagine a colori 640x640 contiene oltre 1,2 milioni di valori di pixel, un profilo di espressione genica può avere 20.000 misurazioni e un embedding di immagini ha spesso centinaia di dimensioni. Ridurre le dimensioni velocizza i modelli di machine learning, diminuisce il rischio di overfitting, riduce lo spazio di archiviazione e permette di rappresentare i dati in due o tre dimensioni per la visualizzazione dei dati.
Perché aiutano meno dimensioni#
Richard Bellman coniò l'espressione «maledizione della dimensionalità» nei suoi studi sulla programmazione dinamica per descrivere come i problemi diventino più difficili all'aumentare delle dimensioni. Il volume dello spazio cresce in modo esponenziale a ogni nuova feature, quindi una quantità fissa di dati di addestramento lo copre in modo sempre più sparso; inoltre, in spazi di dimensioni molto elevate, le distanze tra punti casuali diventano quasi uguali, indebolendo i metodi basati sulla distanza, come i k-nearest neighbors e il clustering k-means.
I dati reali raramente riempiono tutto il loro spazio. Le immagini di cifre scritte a mano variano soprattutto per spessore dei tratti, inclinazione e pochi altri fattori, quindi si trovano vicino a una superficie, o varietà, di dimensioni molto inferiori all'interno dello spazio dei pixel. La riduzione della dimensionalità individua coordinate su quella superficie e, poiché non richiede etichette, la maggior parte dei metodi è una forma di apprendimento non supervisionato.
Metodi lineari e non lineari#
L'analisi delle componenti principali (PCA), introdotta da Karl Pearson nel 1901, ruota i dati lungo direzioni ortogonali ordinate in base alla varianza che catturano e mantiene le prime. Il rapporto di varianza spiegata indica quanti componenti servono a un dataset. L'analisi discriminante lineare, introdotta da Ronald Fisher nel 1936, usa le etichette di classe per individuare le direzioni che separano meglio le classi. La proiezione casuale moltiplica i dati per una matrice casuale; il lemma di Johnson-Lindenstrauss garantisce che le distanze tra n punti vengano preservate entro una tolleranza scelta, usando un numero di dimensioni che cresce solo con il logaritmo di n.
I metodi non lineari seguono varietà curve. Isomap e l'embedding localmente lineare, entrambi pubblicati su Science nel 2000, preservano le distanze lungo la varietà e i vicinati lineari locali. t-SNE e UMAP dispongono punti simili vicini su una mappa 2D e sono quindi strumenti standard per visualizzare cluster di embedding, anche se le distanze tra cluster lontani su queste mappe hanno scarso significato. Gli autoencoder apprendono un encoder che mappa ogni input in un codice compatto nello spazio latente e un decoder che lo ricostruisce; nel 2006 Geoffrey Hinton e Ruslan Salakhutdinov hanno dimostrato che, per immagini e documenti, gli autoencoder profondi producono codici migliori della PCA.
Questo esempio comprime immagini di cifre 8x8, passando da 64 caratteristiche pixel al minor numero possibile di componenti principali che mantengono il 90% della varianza, quindi classifica le cifre con i k vicini più prossimi, prima e dopo:
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import make_pipeline
X, y = load_digits(return_X_y=True) # 1,797 images of 8x8 pixels = 64 features
# Keep the fewest principal components that explain 90% of the variance
pca = PCA(n_components=0.90).fit(X)
print(f"Features: {X.shape[1]} -> {pca.n_components_}")
# Classify with k-nearest neighbors on the raw pixels and on the reduced features
raw = cross_val_score(KNeighborsClassifier(), X, y).mean()
reduced = cross_val_score(make_pipeline(PCA(n_components=0.90), KNeighborsClassifier()), X, y).mean()
print(f"Accuracy: {raw:.3f} with 64 features, {reduced:.3f} with {pca.n_components_}")Ventuno componenti contengono il 90% della varianza e l'accuratezza convalidata in modo incrociato passa solo da 0.963 a 0.959 usando un terzo delle caratteristiche. Eseguire il fit della PCA all'interno della pipeline consente di apprendere la proiezione esclusivamente dai dati di ciascun fold di training, evitando così fughe di informazioni dai fold di test.
Selezione ed estrazione delle caratteristiche#
La selezione delle caratteristiche mantiene un sottoinsieme delle colonne originali, ad esempio eliminando canali di sensori ridondanti, così le caratteristiche rimanenti conservano il loro significato. La riduzione della dimensionalità in senso stretto è l'estrazione delle caratteristiche: crea nuove caratteristiche come combinazioni di quelle esistenti, ottenendo in genere una compressione migliore ma risultando più difficile da interpretare. Entrambe sono fasi di preelaborazione dei dati e progettazione delle caratteristiche. Le reti profonde eseguono l'estrazione durante l'addestramento, comprimendo i pixel in embedding, mentre l'apprendimento di rappresentazioni Matryoshka addestra embedding le cui dimensioni iniziali sono utilizzabili autonomamente, consentendo a un database vettoriale di memorizzare vettori più brevi.
Applicazioni nella computer vision#
La computer vision si basa su rappresentazioni ridotte in diverse fasi. Proiettare gli embedding delle immagini in 2D con t-SNE o UMAP permette di vedere se le classi si separano e dove si trovano i valori anomali, mentre la PCA o la quantizzazione vettoriale riduce gli embedding alla base della ricerca vettoriale, così milioni di immagini possono essere conservate in memoria. I modelli di segmentazione di istanze YOLO26 integrano questa idea nell'output: la head calcola 32 maschere prototipo per immagine a un quarto della risoluzione di input e predice solo 32 coefficienti per oggetto; la maschera di ciascun oggetto è la somma ponderata dei prototipi, quindi una maschera 160x160 per un input di 640 pixel, composta da 25.600 valori, viene codificata con 32 numeri.










