Calcolo della distanza dal kth vicino più vicino per tutti i punti nel set


9

Per un'applicazione di apprendimento della macchina, i miei bisogni di gruppo per calcolare la distanza euclidea al esimo vicino più prossimo in un insieme per ogni (per tra il 5 e circa 100 e alcune centinaia fino a qualche milione). Attualmente stiamo usando l'approccio o quello ovvio con un albero kd su , che quando è alto eè relativamente basso non vince mai. (Tutto è in memoria.)X x ( X Y ) R d d | X | | Y | O ( d | X | |kXx(XY)Rdd|X||Y|X d | X |O(d|X||XY|)Xd|X|

Sembra che ci debba essere un modo migliore della forza bruta, almeno - almeno uno che sfrutti la disuguaglianza del triangolo, o forse con gli hash sensibili alla località. Un'approssimazione ragionevolmente stretta è anche potenzialmente a posto.

La ricerca che sono stato in grado di trovare sembra concentrarsi sul problema di trovare il vicino più vicino (o uno che è approssimativamente il più vicino). Il problema che sto cercando va con un altro nome o c'è una connessione a un problema correlato a cui non ho pensato?


2
i kd-alberi sfruttano la disuguaglianza del triangolo. Hai provato ad usare altri alberi di partizionamento dei dati spaziali? Un'altra cosa che potresti esaminare (non so nulla del tuo algoritmo di apprendimento automatico) se i punti specifici tendono ad avere una struttura, il che potrebbe aiutarti a trovare rapidamente iperpiani e usarli in un albero simile a kd invece del solito mediano per- divisione delle coordinate che si comporta male in dimensioni elevate.
Ross Snider,

@RossSnider grazie per i suggerimenti. E sicuramente, gli alberi KD usano la disuguaglianza del triangolo, ma stavo pensando a qualcosa che sarebbe stato più veloce della forza bruta. :) Quali altri tipi di alberi di partizionamento dei dati spaziali consiglieresti? Della lista di Wikipedia solo forse gli alberi vp sembrano applicabili, e non sembrano essere migliori degli alberi kd per la distanza euclidea. E penserò se esiste un modo migliore per i problemi specifici per definire gli iperpiani di separazione, ma non ci viene in mente.
Dougal,

Immagino che sperassi che il fatto che sappiamo che stiamo valutando questo per tutti gli (così come altri punti) consentirebbe un qualche tipo di aiuto nell'algoritmo. Non sono sicuro che sia così, però. X
Dougal,

che cosa è in genere nelle tue applicazioni? k
Suresh Venkat,

1
@SureshVenkat Usiamo solitamente una di circa 3, a volte un po 'più grande. k
Dougal,

Risposte:


10

Ecco un semplice trucco che potrebbe essere utile. Considera un campione casuale che prende ogni punto con probabilità 1 / k. È facile verificare che, con buona probabilità, nel campione si trovasse esattamente uno dei tuoi k vicini più vicini. Calcola il vicino più vicino nel campione. Ripetere questa O (k log n) volte. Con alta probabilità i k punti più vicini nei punti calcolati sono i k vicini più vicini alla tua query. Quindi, trovare il k vicino più vicino, equivale a fare query vicino più vicino.O ( k registro n )O(klogn)O(klogn)

In breve, dammi una struttura dati veloce per rispondere alle domande del vicino più vicino e sarei felice di darti una struttura dati veloce del vicino k più vicino.


Bel trucco. Dovrebbe essere corretto riutilizzare i campioni anche per diversi punti di query, giusto? Quindi per calcolare il -nearest-neighbour per ogni punto dell'insieme, ho solo bisogno di costruire la struttura dati volte. O ( k registro n )kO(klogn)
Dougal,

1
Riutilizzare i campioni è complicato, perché in questo caso è necessario che un campione fisso funzioni per QUALSIASI query (la quantificazione viene invertita) e quindi le probabilità cambieranno. L'idea generale sarebbe quindi quella di costruire una serie di campioni di dimensioni maggiori (questo dipende dalle #query) e usarli, se questo è un problema.
Suresh Venkat,

@SureshVenkat Ah, certo. Mi siederò e scoprirò le reali probabilità. Grazie a tutti!
Dougal,

Se campioni , ogni query ha esito positivo con probabilità . Nota che questo trucco è leggermente migliore di quanto sembri a prima vista: hai campioni , ognuno dei quali di dimensioni (con alta probabilità se non è troppo grande). Ciò significa tempi di interrogazione migliori per ciascuno dei campioni. 1 - δ O ( k log n ) O ( n / k ) kO(klog(1/δ))1δO(klogn)O(n/k)k
Sariel Har-Peled,

3

Una soluzione approssimativa economica che utilizza un "hash sensibile alla località" sarebbe quella di convertire ciascun punto nella sua forma bit interfogliata:

[xxx, yyy, zzz] -> xyzxyzxyz

quindi radix sort per la preelaborazione.

Scegli il punto su cui eseguire la query e vai punti in entrambe le direzioni per ottenere un set di dimensioni ; quindi prendi il più vicino al tuo punto. Vedi anche questo articolo di Connor e Kumar.2 k k t hk2kkth

Vedi anche questo articolo di Callahan e Kosaraju.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.