Il sorprendente comportamento dei dati in dimensioni superiori

Lo straordinario comportamento dei dati nelle dimensioni superiori

Un viaggio nel sorprendente mondo dei dati ad alte dimensioni: le benedizioni e le sfide

Foto di Guillermo Ferla su Unsplash

Richard Feynman, il rinomato fisico, una volta disse: “Posso affermare con sicurezza che nessuno capisce la meccanica quantistica”. Nel suo intervista dal titolo “Divertiamoci a immaginare con Richard Feynman“, parlò del comportamento strano delle cose a livello atomico e subatomico, osservando come spesso sfidino il nostro buon senso. Curiosamente, possiamo notare un comportamento simile a livello dei dati ad alte dimensioni. Non è esattamente come la meccanica quantistica, ma c’è un elemento simile di sorpresa e bellezza – mescolato con alcune/molte sfide – quando passiamo da dimensioni inferiori a dimensioni superiori.

In questo e in futuri articoli, voglio fornire alcune informazioni su questo affascinante argomento. Il mio obiettivo è suscitare interesse e incoraggiare l’apprendimento sul mondo dei dati ad alte dimensioni, soprattutto da parte di coloro che ne sono sconosciuti.

I dati ad alte dimensioni, o dati in dimensioni superiori, nel contesto dell’analisi dei dati e dell’IA, si riferiscono generalmente a insiemi di dati che hanno un gran numero di variabili, caratteristiche o attributi. Ognuno di questi rappresenta una “dimensione” diversa nei nostri dati.

Per cominciare, esaminiamo alcuni esempi di base che evidenziano le differenze che si presentano quando passiamo da spazi a dimensioni inferiori a quelli a dimensioni superiori.

Concentrazione del volume in spazi ad alte dimensioni

Innanzitutto, esploriamo il concetto di concentrazione del volume in spazi ad alte dimensioni. Consideriamo la generazione di punti casuali all’interno di un ipercubo i cui lati vanno da 0 a 1. Quanto è probabile che questi punti cadano nella regione centrale di questo ipercubo man mano che le dimensioni aumentano?

Immagine dell'autore

Nell’immagine sopra, supponiamo che x sia un valore piccolo, come 0.1. Il nostro obiettivo è determinare come varia la probabilità che un punto cada casualmente in questa regione centrale (non sul bordo) man mano che le dimensioni aumentano.

  1. Spazio unidimensionale (Linea)

Immagina un segmento di linea da 0 a 1. La parte centrale si trova tra 0.1 e 0.9. La possibilità che un punto casuale cada qui è semplicemente la lunghezza di questo segmento centrale rispetto alla lunghezza totale, che è 0.8.

2. Spazio bidimensionale (Quadrato)

Ora, immagina un quadrato in cui ogni lato varia da 0 a 1. La regione centrale è un quadrato più piccolo, con ogni lato compreso tra 0.1 e 0.9. Il calcolo della probabilità prevede il confronto tra l’area di questo quadrato più piccolo e l’area totale, ottenendo così una probabilità del 0.64.

3. Spazio tridimensionale (Cubo)

Per un cubo con ogni lato di misura 1, la regione centrale è un cubo più piccolo, con ogni lato da 0.1 a 0.9. Qui, la probabilità è il volume di questo cubo più piccolo diviso per il volume totale, ottenendo 0.512.

4. Dimensioni superiori (Ipercubo)

In un ipercubo di n dimensioni, il “volume” della regione centrale si riduce drasticamente all’aumentare delle dimensioni. Ad esempio, in 4D, la probabilità è del 0.4096; in 5D, è del 0.32768; e in 10D si riduce a circa 0.10737.

La generalizzazione di questa idea parte dal considerare il bordo come una piccola distanza x, come mostrato nell’immagine sopra. Per una linea, la probabilità che un punto cada nella regione centrale è di 1-2x. Per un quadrato, è (1-2x)*(1-2x), poiché un punto deve cadere al centro di entrambe le dimensioni.

Questo modello continua in n dimensioni, dove la probabilità di cadere nella regione centrale è (1–2x)^n, diventando molto piccola in dimensioni più grandi.

Si noti che qui semplifichiamo considerando la lunghezza di ogni lato come 1.

Incidere una Ipersfera in un Ipercubo

Per illustrare ulteriormente il concetto di concentrazione di volume, ho eseguito una semplice simulazione utilizzando python, in cui incidiamo una ipersfera in un ipercubo, e quindi confrontiamo il rapporto tra il volume della ipersfera e l’ipercubo al crescere delle dimensioni.

Cosa è un Ipercubo?

Immagina un quadrato. Ora, gonfialo in un cubo. Questo è il salto da 2D a 3D. Ora, fai un salto di immaginazione nella quarta dimensione e oltre – è qui che entrano in gioco gli ipercubi. Un ipercubo è essenzialmente un cubo esteso in dimensioni superiori. È una forma con lati uguali e, nella nostra simulazione, stiamo considerando ipercubi con lunghezze dei lati di 2. La formula per il suo volume? semplicemente 2^n(2 alla potenza n) per un ipercubo n-dimensionale.

E una Ipersfera?

Una ipersfera, l’equivalente a più dimensioni di una sfera, emerge quando si estende un cerchio 2D a 3D (formando una sfera) e poi si continua in dimensioni superiori. L’inghippo? Il suo volume non è così semplice da calcolare. Coinvolge il pi greco (sì, il famoso 3.14159…) e la funzione gamma, che è come un fattoriale con gli steroidi. In poche parole, il volume di una ipersfera con un raggio di 1 in uno spazio n-dimensionale è:

La funzione Gamma Γ(n) estende la funzione fattoriale a numeri reali e complessi. Per interi positivi n, Γ(n)=(n−1)! e per valori non interi, viene calcolata numericamente.

Per calcolare questo rapporto utilizzando python, possiamo utilizzare il seguente codice:

import math
import matplotlib.pyplot as plt

def volume_ipersfera(dim):
    """ Calcola il volume di una ipersfera con raggio 1 in 'dim' dimensioni. """
    return math.pi ** (dim / 2) / math.gamma(dim / 2 + 1)

def volume_ipercubo(dim):
    """ Calcola il volume di un ipercubo con lato 2 in 'dim' dimensioni. """
    return 2 ** dim

# Numero di dimensioni da considerare
max_dim = 20

# Liste per contenere i volumi e i valori delle dimensioni
dimensioni = range(1, max_dim + 1)
volumi_ipersfere = [volume_ipersfera(dim) for dim in dimensioni]
volumi_ipercubi = [volume_ipercubo(dim) for dim in dimensioni]
rapporti = [volumi_ipersfere[i] / volumi_ipercubi[i] for i in range(max_dim)]

# Plot dei risultati
plt.figure(figsize=(10, 6))
plt.plot(dimensioni, rapporti, marker='o')
plt.xlabel('Numero di Dimensioni')
plt.ylabel('Rapporto Volumi (Ipersfera/Ipercubo)')
plt.title('Concentrazione di Volume in Dimensioni Superiori')
plt.grid(True)
plt.show()

L’output del codice sopra è il seguente grafico:

Immagine dell'autore

Possiamo chiaramente vedere che all’aumentare delle dimensioni il rapporto diminuisce rapidamente, lasciando il volume concentrato maggiormente agli angoli dell’ipercubo.

Questi esempi dimostrano che in dimensioni superiori, il volume della regione centrale diventa una frazione progressivamente più piccola del volume totale, evidenziando la natura controintuitiva degli spazi ad alta dimensione.

D: Quali sono alcune delle implicazioni di questo fenomeno di concentrazione del volume sulle performance degli algoritmi di ML?

L’esperimento del Foglio di Carta e del DVD

Considera l’esperimento in cui cerchi di far passare un DVD attraverso un pezzo di carta con un buco quadrato. Inizialmente, sembra impossibile poiché la diagonale del quadrato è più piccola del diametro del DVD. Tuttavia, piegando il foglio di carta permette al DVD di passare attraverso.

La piegatura del foglio di carta, un piccolo ma efficace adattamento delle dimensioni spaziali, è la chiave del puzzle. Un’analogia affascinante per comprendere la complessità dei paesaggi ad alta dimensione può essere trovata in questo esperimento.

Quando il foglio viene appoggiato per la prima volta, forma un piano bidimensionale. Lo spazio quadrato sembra troppo stretto per far passare il DVD a causa delle sue dimensioni prefissate.

Questa situazione ipotetica è coerente con le nostre esperienze quotidiane in un ambiente tridimensionale, in cui lunghezza, larghezza e altezza sono le unità di misura per dimensione e distanza. Ma nel momento in cui iniziamo a piegare il foglio, aggiungiamo un’altra dimensione. Il buco e la connessione spaziale del DVD vengono completamente modificati da questa azione di piegatura.

In questa nuova configurazione tridimensionale, il concetto di distanza, che era così rigido e chiaro nelle due dimensioni, diventa più flessibile e meno intuitivo. Il foglio viene piegato, il che modifica efficacemente gli angoli generati dai bordi del foglio e le distanze tra i punti circostanti il buco.

Il buco in questa nuova forma tridimensionale può ospitare il DVD, dimostrando come l’inclusione di una terza dimensione possa rendere fattibile un compito apparentemente impossibile in uno spazio bidimensionale. La matematica alla base di questo esperimento è spiegata in modo completo in uno studio interessante di Weiwei Lin et al.

Un modello di kirigami ispirato ai giochi e le sue prestazioni cinematiche mediante l’applicazione di meccanismi e macchine…

Abstract. Origami che può assumere varie forme impostando semplici piegature sul foglio e piegandolo lungo queste piegature…

ms.copernicus.org

È possibile anche guardare questo bellissimo video di “The Action Lab” che illustra l’idea in modo intuitivo:

Un disco rotondo attraverso un buco quadrato più piccolo

Questo cambio di prospettiva ha implicazioni significative, specialmente nei campi della matematica, della fisica e dell’apprendimento automatico. Questa idea si riflette nei metodi di apprendimento automatico come le Support Vector Machine (SVM).

Le SVM e il trucco del kernel

Il trucco del kernel nelle Support Vector Machine (SVM) mostra un’idea simile. Nelle SVM, ci imbattiamo spesso in dati che non sono separabili linearmente. Il trucco del kernel supera questo problema trasformando i dati in uno spazio di dimensioni superiori, come la piegatura del foglio ha cambiato le sue proprietà spaziali. (In realtà, le SVM non trasformano effettivamente i dati in dimensioni superiori, poiché ciò è computazionalmente costoso. Invece, calcolano le relazioni tra i punti dati come se fossero in una dimensione superiore utilizzando il trucco del kernel).

In termini più semplici, le SVM trovano normalmente una linea di separazione (o un iperpiano) in dimensioni inferiori. Ma con dati non lineari, ciò non è possibile. Il trucco del kernel, come la piegatura del foglio, aggiunge dimensioni, rendendo più facile trovare un iperpiano che svolga il compito.

Il trucco del kernel non solo sposta le dimensioni, ma semplifica anche problemi complessi. È davvero un ottimo esempio di come il pensiero in dimensioni superiori possa fornire soluzioni a problemi che sembrano impossibili in dimensioni inferiori.

import numpy as npimport matplotlib.pyplot as pltfrom sklearn.svm import SVC# Qui ho inserito manualmente un set di dati che non è linearmente separabile in 1Dx = np.array([1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30]).reshape(-1, 1)  # Sostituisci i tuoi valori X con i tuoi datiy = np.array([1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1])                 # Sostituisci i tuoi valori Y con le tue etichette di classe# Trasformazione non lineare in 2D (elevazione al quadrato)def transform_to_2d(X):    return np.c_[X, X**2]# Trasformazione dei dati in 2DX_transformed = transform_to_2d(x)# Addestramento SVM con un kernel lineare negli spazi 2D trasformatisvm = SVC(kernel='linear')svm.fit(X_transformed, y)fig, axes = plt.subplots(1, 2, figsize=(12, 5))# Plot dei dati in 1Daxes[0].scatter(x, np.zeros_like(x), c=y, cmap='bwr', edgecolors='k')axes[0].set_title('Dati originali 1D')axes[0].set_xlabel('Caratteristica')axes[0].set_yticks([])# Plot dei dati trasformati in 2Daxes[1].scatter(X_transformed[:, 0], X_transformed[:, 1], c=y, cmap='bwr', edgecolors='k')axes[1].set_title('Dati trasformati in 2D')axes[1].set_xlabel('Caratteristica originale')axes[1].set_ylabel('Caratteristica trasformata (X^2)')# Plot della linea di decisione in 2Dax = axes[1]xlim = ax.get_xlim()ylim = ax.get_ylim()xx = np.linspace(xlim[0], xlim[1], 30)yy = np.linspace(ylim[0], ylim[1], 30)YY, XX = np.meshgrid(yy, xx)xy = np.vstack([XX.ravel(), YY.ravel()]).T# Ottenimento dell'iperpiano di separazioneZ = svm.decision_function(xy).reshape(XX.shape)# Plot della linea di decisione e dei marginiax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,           linestyles=['--', '-', '--'])plt.tight_layout()plt.show()

Il risultato del codice sopra è il seguente grafico:

Immagine di Author

È chiaro che i dati, inizialmente non separabili in modo non lineare a sinistra, diventano separabili in 2D. Questa trasformazione, come mostrato nel grafico a destra, risolve efficacemente il nostro problema. Non è fantastico?

Conclusione

In questo articolo, abbiamo esplorato alcune idee sul mondo dei dati ad alta dimensione. Abbiamo mostrato come l’ingresso in dimensioni più alte possa modificare notevolmente i nostri punti di vista e i metodi di approccio ai problemi, iniziando dalla concentrazione di volume e continuando con l’esempio concreto dell’esperimento con carta e DVD e, infine, il trucco del kernel nelle SVM.

Nell’articolo successivo, discuteremo della “maledizione delle dimensioni”, che si riferisce alle difficoltà e alle complicazioni nel navigare negli spazi ad alta dimensione. Esamineremo come ciò influisca sull’apprendimento automatico e sull’analisi dei dati, nonché le strategie per mitigarne gli effetti.

Grazie per essere arrivati fin qui! Apprezzo davvero il tempo che avete dedicato a leggere questo articolo e spero che abbiate trovato l’argomento interessante. Sentitevi liberi di condividere suggerimenti o possibili modifiche per futuri articoli!