In informatica, un ball tree (letteralmente albero a sfere) è una struttura dati spaziale ad albero utilizzata per organizzare punti in uno spazio metrico multidimensionale. Trova la sua principale applicazione nell'ottimizzazione di query geometriche, in particolare nella ricerca dei vicini più prossimi (Nearest Neighbor Search) e nel clustering di dati in spazi a elevata dimensionalità (), dove altre strutture come i k-d tree soffrono della cosiddetta maledizione della dimensionalità.
A differenza dei k-d tree, che dividono lo spazio orientando iperpiani lungo gli assi cartesiani, i ball tree partizionano i dati racchiudendoli in ipersfere (o ball) che possono intersecarsi liberamente, ma il cui volume complessivo viene minimizzato per ottimizzare i tempi di potatura durante la ricerca.
Un ball tree è un albero binario in cui ogni nodo definisce una regione ipersferica nello spazio metrico considerato.
Ogni nodo interno dell'albero è caratterizzato da una coppia , dove:
La proprietà fondamentale di un ball tree è il vincolo di contenimento geometrico: Se un nodo ha come figli i nodi (sinistro) e (destro), allora tutti i punti geometrici contenuti nelle ipersfere di e devono essere rigorosamente contenuti nell'ipersfera di :
Tuttavia, le sfere figlie e non sono necessariamente disgiunte e possono parzialmente sovrapporsi. I punti fisici del dataset sono memorizzati esclusivamente nelle foglie dell'albero.
La costruzione efficiente di un ball tree si basa sulla decomposizione ricorsiva del dataset. L'obiettivo principale è scegliere i centri delle ipersfere in modo da minimizzare il loro raggio (e quindi il volume dello spazio racchiuso), riducendo le sovrapposizioni.
Il metodo euristico standard più utilizzato segue questi passaggi:
La ricerca del vicino più prossimo con un ball tree sfrutta la disuguaglianza triangolare per implementare una potente strategia branch and bound, che permette di scartare interi rami dell'albero senza doverne esaminare i punti interni.
Dato un punto di query e una distanza di soglia mobile (che rappresenta la distanza attuale dal -esimo vicino più prossimo trovato fino a quel momento):
Mentre i k-d tree dividono lo spazio con iperpiani ortogonali agli assi, creando regioni cubiche o rettangolari, i ball tree usano regioni sferiche. Questo comporta differenze strutturali cruciali:
| Caratteristica | K-d Tree | Ball Tree |
|---|---|---|
| Geometria dei nodi | Iperrettangoli asse-allineati | Ipersfere |
| Partizione dello spazio | Disgiunta
(nessuna sovrapposizione) |
Non disgiunta
(possibile sovrapposizione) |
| Prestazioni ad alte
dimensioni (d ≥ 20) |
Decade rapidamente
(maledizione della dimensionalità) |
Più robusto,
volumi di potatura più compatti |
| Costo computazionale
di partizionamento |
Basso
(mediana su un singolo asse) |
Moderato
(calcolo distanze geometriche) |
Al crescere della dimensionalità, gli "angoli" degli iper-rettangoli dei k-d tree tendono a svuotarsi a causa delle proprietà degli spazi iperdimensionali, costringendo l'algoritmo di ricerca a verificare quasi tutti i rami. Le iper-linee curve delle sfere riducono questo volume inutilizzato, rendendo i ball tree decisamente più efficienti in contesti di apprendimento automatico con molte feature (ad es. embedding di immagini o testi).