I vicini più vicini ai dati ad alta dimensione?


163

Qualche giorno fa ho fatto una domanda su come trovare i vicini più vicini per un determinato vettore. Il mio vettore ha ora 21 dimensioni e prima di procedere oltre, poiché non faccio parte del dominio di Machine Learning né della matematica, sto iniziando a farmi alcune domande fondamentali:

  • La distanza euclidea è una buona metrica per trovare in primo luogo i vicini più vicini? In caso contrario, quali sono le mie opzioni?
  • Inoltre, come si fa a decidere la soglia giusta per determinare i vicini k? C'è qualche analisi che può essere fatta per capire questo valore?
  • In precedenza, mi era stato suggerito di utilizzare kd-Trees ma la pagina di Wikipedia dice chiaramente che per le dimensioni elevate, kd-Tree è quasi equivalente a una ricerca di forza bruta. In tal caso, qual è il modo migliore per trovare i vicini più vicini in un set di dati da un milione di punti in modo efficiente?

Qualcuno può chiarire alcune (o tutte) delle domande precedenti?


Prova a chiedere su metaoptimize.com
pajton il

4
"Alta dimensione" è 20 per alcune persone e alcuni dati, 50 o 100 o 1000 per altri. Si prega di fornire numeri se è possibile, ad es. "Ho fatto dim 21, 1000000 punti dati, usando xx".
denis,

kD-Tree divide i dati in due lungo una dimensione alla volta. Se hai 20 dimensioni e solo 1M di punti dati, ottieni circa 1 livello di albero - dove livello significa dividere su ogni asse. Poiché non esiste una profondità reale, non si ottiene il vantaggio di ignorare i rami dell'albero. È utile non pensarlo tanto come un albero binario, ma piuttosto come un albero quad, un octtree, ecc. Anche se è implementato come un albero binario.
Phkahler,

@denis, era 'dim 21, 1000000 punti dati' per il set di dati di Higgs?
Nikk,

1
Ecco il link per scaricare il set di dati di Higgs. 11 milioni di osservazioni con 28 attributi. L'ultima colonna è l'etichetta: 1 per segnale, zero per rumore. archive.ics.uci.edu/ml/datasets/HIGGS
nikk

Risposte:


179

Attualmente studio tali problemi - classificazione, ricerca del vicino più vicino - per il recupero di informazioni sulla musica.

Potresti essere interessato agli algoritmi di prossimità approssimativa più vicina ( ANN ). L'idea è che si consenta all'algoritmo di tornare sufficientemente vicino ai vicini (forse non il vicino più vicino); così facendo riduci la complessità. Hai citato l' albero kd ; questo è un esempio. Ma come hai detto, kd-tree funziona male in dimensioni elevate. In effetti, tutte le attuali tecniche di indicizzazione (basate sul partizionamento dello spazio) degradano alla ricerca lineare di dimensioni sufficientemente elevate [1] [2] [3].

Tra gli algoritmi ANN proposti di recente, forse il più popolare è Locality-Sensitive Hashing ( LSH ), che mappa un insieme di punti in uno spazio ad alta dimensione in un insieme di bin, ovvero una tabella hash [1] [3]. Ma a differenza degli hash tradizionali, un hash sensibile alla località posiziona i punti vicini nello stesso cestino.

LSH ha alcuni enormi vantaggi. Innanzitutto è semplice. Devi solo calcolare l'hash per tutti i punti nel tuo database, quindi creare una tabella di hash da essi. Per eseguire una query, basta calcolare l'hash del punto di query, quindi recuperare tutti i punti nello stesso bin dalla tabella hash.

In secondo luogo, esiste una teoria rigorosa che supporta le sue prestazioni. È possibile dimostrare che il tempo di query è sublineare nelle dimensioni del database, ovvero più veloce della ricerca lineare. Quanto più velocemente dipende da quanta approssimazione possiamo tollerare.

Infine, LSH è compatibile con qualsiasi norma Lp per 0 < p <= 2. Pertanto, per rispondere alla tua prima domanda, puoi utilizzare LSH con la metrica della distanza euclidea o puoi usarla con la metrica della distanza di Manhattan (L1). Esistono anche varianti per la distanza di Hamming e la somiglianza del coseno.

Una panoramica decente è stata scritta da Malcolm Slaney e Michael Casey per la rivista IEEE Signal Processing nel 2008 [4].

LSH è stato applicato apparentemente ovunque. Potresti provare.


[1] Datar, Indyk, Immorlica, Mirrokni, "Schema di hash sensibili alla località basato su distribuzioni p-stabili", 2004.

[2] Weber, Schek, Blott, "Un'analisi quantitativa e studio delle prestazioni per metodi di ricerca di somiglianza in spazi ad alta dimensione", 1998.

[3] Gionis, Indyk, Motwani, "Ricerca di somiglianza in grandi dimensioni tramite hashing", 1999.

[4] Slaney, Casey, "Hashing sensibile alla posizione per trovare i vicini più vicini", 2008.


1
@Steve: grazie per la risposta. Hai qualche suggerimento su un'implementazione di LSH? L'unico che ho visto è stato quello del MIT. Ci sono altri pacchetti in giro?
Legenda,

1
Oltre a quello, no, non conosco altri. Ho finito per scrivere il mio in Python per i miei scopi specifici. In sostanza, ogni tabella hash è implementata come un dizionario Python d, dove d[k]è presente un cestino con chiave k. d[k]contiene le etichette di tutti i punti il ​​cui hash è k. Quindi, devi solo calcolare l'hash per ogni punto. Vedi Eq. (1) in [4] o sezione 3 in [1].
Steve Tjoa,

@Steve: grazie per l'aiuto. Inizierò a implementarlo ora. Hai idea di come questa metodologia si comporta per grandi serie di dati per caso?
Legenda,

1
Un altro riferimento a sostegno di LSH: confronto tra gli algoritmi del vicino più vicino nello spazio ad alta dimensione , Hendra Gunadi, 2011. cs.anu.edu.au/student/projects/11S2/Reports/Hendra%20Gunadi.pdf
Oliver Coleman,

1
@SteveTjoa: è stato difficile comprendere visivamente parole chiave e formula integrata. Dato che hai già avuto un singolo highlight su LSH, l'ho integrato. Con solo le migliori intenzioni. Sentiti libero di tornare, però. Dopo tutto è la tua risposta. :)
Regexident,

81

I. La metrica della distanza

Innanzitutto, il numero di funzioni (colonne) in un set di dati non è un fattore nella selezione di una metrica della distanza da utilizzare in kNN. Ci sono alcuni studi pubblicati diretti proprio a questa domanda, e le solite basi per il confronto sono:

  • la distribuzione statistica sottostante dei tuoi dati;

  • la relazione tra le caratteristiche che compongono i tuoi dati (sono indipendenti - ovvero, che aspetto ha la matrice di covarianza); e

  • lo spazio delle coordinate da cui sono stati ottenuti i dati.

Se si dispone di alcuna conoscenza preliminare della distribuzione (s) da cui i dati è stato campionato, almeno uno (ben documentate e approfondite) lo studio conclude che la distanza euclidea è la scelta migliore.

YMetrica euclidea utilizzata nei motori di raccomandazione Web su larga scala e nella ricerca accademica attuale. Le distanze calcolate da Euclide hanno un significato intuitivo e le scale di calcolo - cioè, la distanza euclidea viene calcolata allo stesso modo, indipendentemente dal fatto che i due punti siano in due dimensioni o in uno spazio di ventidue dimensioni.

Ha fallito solo per me alcune volte, ognuno di quei casi la distanza euclidea è fallita perché il sistema di coordinate (cartesiano) sottostante era una scelta sbagliata. E di solito lo riconoscerai perché, ad esempio, le lunghezze del percorso (distanze) non sono più additive - ad esempio, quando lo spazio metrico è una scacchiera, la distanza di Manhattan è migliore di Euclide, allo stesso modo quando lo spazio metrico è Terra e le tue distanze sono trans -continentali, una metrica di distanza adatta per un sistema di coordinate polari è una buona idea (ad esempio, Londra a Vienna è di 2,5 ore, Vienna a San Pietroburgo è di altre 3 ore, più o meno nella stessa direzione, eppure da Londra a St Pietroburgo non è di 5,5 ore, invece è poco più di 3 ore.)

Ma a parte quei casi in cui i tuoi dati appartengono a un sistema di coordinate non cartesiane, la scelta della metrica della distanza non è di solito materiale. (Vedi questo post sul blog di uno studente CS, confrontando diverse metriche di distanza esaminando il loro effetto sul classificatore kNN - chi square dà i migliori risultati, ma le differenze non sono grandi; Uno studio più completo è nel documento accademico, Studio comparativo di Funzioni a distanza per i vicini più vicini - Mahalanobis (essenzialmente euclideo normalizzato per tenere conto della covarianza dimensionale) è stato il migliore in questo studio.

Una condizione importante: affinché i calcoli della metrica della distanza siano significativi, è necessario ridimensionarei tuoi dati - raramente è possibile creare un modello kNN per generare previsioni accurate senza farlo. Ad esempio, se stai costruendo un modello kNN per prevedere le prestazioni atletiche e le tue variabili di aspettativa sono altezza (cm), peso (kg), grasso corporeo (%) e polso a riposo (battiti al minuto), un punto dati tipico potrebbe assomigliare a questo: [180.4, 66.1, 11.3, 71]. Chiaramente il calcolo della distanza sarà dominato dall'altezza, mentre il contributo di% di grasso corporeo sarà quasi trascurabile. In altre parole, se invece i dati fossero riportati in modo diverso, in modo che il peso corporeo fosse in grammi anziché in chilogrammi, il valore originale di 86.1 sarebbe 86.100, il che avrebbe un grande effetto sui risultati, che è esattamente ciò che si indossa voglio.

X_new = (X_old - mu) / sigma


II. La struttura dei dati

Se sei preoccupato per le prestazioni della struttura kd-tree, A Voronoi Tessellation è un contenitore concettualmente semplice ma che migliorerà drasticamente le prestazioni e ridimensionerà meglio di kd-Trees.

dat

Questo non è il modo più comune di conservare i dati di addestramento di kNN, sebbene l'applicazione di VT a questo scopo, così come i conseguenti vantaggi in termini di prestazioni, siano ben documentati (vedi ad esempio questo rapporto di Microsoft Research ). Il significato pratico di questo è che, a condizione che tu stia utilizzando un linguaggio 'mainstream' (ad esempio, nell'indice TIOBE ), dovresti trovare una libreria per eseguire VT. So che in Python e R, ci sono più opzioni per ogni lingua (ad esempio, il pacchetto voronoi per R disponibile su CRAN )

L'uso di un VT per kNN funziona in questo modo ::

Dai tuoi dati, seleziona casualmente i punti w: questi sono i tuoi centri Voronoi. Una cella Voronoi incapsula tutti i punti vicini che sono più vicini a ciascun centro. Immagina se assegni un colore diverso a ciascuno dei centri Voronoi, in modo che ogni punto assegnato a un dato centro sia dipinto quel colore. Finché hai una densità sufficiente, farlo mostrerà bene i confini di ciascun centro Voronoi (come il confine che separa due colori.

Come selezionare i centri Voronoi? Uso due linee guida ortogonali. Dopo aver selezionato casualmente i punti w, calcolare il VT per i dati di allenamento. Quindi controlla il numero di punti dati assegnati a ciascun centro Voronoi: questi valori dovrebbero essere più o meno gli stessi (data la densità dei punti uniforme nello spazio dati). In due dimensioni, ciò causerebbe un VT con tessere della stessa dimensione. Questa è la prima regola, ecco la seconda. Seleziona w per iterazione: esegui l'algoritmo kNN con w come parametro variabile e misura le prestazioni (tempo necessario per restituire una previsione eseguendo una query sul VT).

Quindi immagina di avere un milione di punti dati ..... Se i punti persistessero in una normale struttura di dati 2D o in un albero kd, eseguiresti in media un paio di milioni di calcoli di distanza per ciascunonuovi punti dati di cui si desidera prevedere la variabile di risposta. Naturalmente, questi calcoli vengono eseguiti su un singolo set di dati. Con una V / T, la ricerca del vicino più vicino viene eseguita in due passaggi uno dopo l'altro, rispetto a due diverse popolazioni di dati: prima contro i centri Voronoi, quindi una volta trovato il centro più vicino, i punti all'interno della cella corrispondenti a quel centro viene cercato per trovare l'attuale vicino più vicino (mediante calcoli di distanza successivi) Combinati, questi due look-up sono molto più veloci di un singolo look-forza bruta. È facile da vedere: per i punti dati 1M, supponi di selezionare 250 centri Voronoi per tassellare il tuo spazio dati. In media, ogni cella Voronoi avrà 4.000 punti dati. Quindi, invece di eseguire in media 500.000 calcoli di distanza (forza bruta), esegui molto meno, in media solo 125 + 2.000.

III. Calcolo del risultato (la variabile di risposta prevista)

Esistono due passaggi per calcolare il valore previsto da una serie di dati di allenamento kNN. Il primo è identificare n, o il numero di vicini più vicini da usare per questo calcolo. Il secondo è come ponderare il loro contributo al valore previsto.

Con il primo componente, puoi determinare il valore migliore di n risolvendo un problema di ottimizzazione (molto simile all'ottimizzazione dei minimi quadrati). Questa è la teoria; in pratica, la maggior parte delle persone usa solo n = 3. In ogni caso, è semplice eseguire l'algoritmo kNN su una serie di istanze di test (per calcolare i valori previsti) per n = 1, n = 2, n = 3, ecc. E tracciare l'errore in funzione di n. Se vuoi solo un valore plausibile per n per iniziare, usa nuovamente n = 3.

Il secondo componente è come ponderare il contributo di ciascuno dei vicini (assumendo n> 1).

La tecnica di ponderazione più semplice è semplicemente moltiplicare ciascun vicino per un coefficiente di ponderazione, che è solo 1 / (dist * K), o l'inverso della distanza da quel vicino all'istanza del test spesso moltiplicata per una costante derivata empiricamente, K. I non sono un fan di questa tecnica perché spesso sovrappesa i vicini più vicini (e contemporaneamente sottopeso i pesi a quelli più distanti); il significato di ciò è che una determinata previsione può dipendere quasi interamente da un singolo vicino, il che a sua volta aumenta la sensibilità dell'algoritmo al rumore.

Una funzione di ponderazione migliore, che evita sostanzialmente questa limitazione, è la funzione gaussiana , che in pitone assomiglia a questa:

def weight_gauss(dist, sig=2.0) :
    return math.e**(-dist**2/(2*sig**2))

Per calcolare un valore previsto usando il tuo codice kNN, dovresti identificare gli n vicini più vicini al punto dati di cui desideri prevedere la variabile di risposta ("istanza di prova"), quindi chiamare la funzione weight_gauss, una volta per ciascuno dei n vicini, passando nella distanza tra ciascun vicino il punto di prova. Questa funzione restituirà il peso per ciascun vicino, che viene quindi utilizzato come coefficiente di quel vicino nel calcolo della media ponderata.


2
Bella risposta! Completo e preciso rispetto alla mia esperienza.
Ted Dunning il

Bella risposta, +1, ho aggiunto una nuova risposta più recente qui , va bene?
gsamaras,

1
"Immagina di avere un milione di punti dati ..... Se i punti persistessero in una normale struttura di dati 2D o in un albero kd , eseguiresti in media un paio di milioni di calcoli di distanza per ogni nuovo punto dati la cui risposta variabile che desideri prevedere ". Disaccordo. È possibile dimostrare che gli alberi KD presentano una O(sqrt(n))complessità di ricerca in 2D.
Antoine,

16

Ciò che stai affrontando è noto come la maledizione della dimensionalità . A volte è utile eseguire un algoritmo come PCA o ICA per assicurarsi di avere davvero bisogno di tutte le 21 dimensioni e possibilmente trovare una trasformazione lineare che ti consenta di utilizzare meno di 21 con approssimativamente la stessa qualità di risultato.

Aggiornamento: li ho incontrati in un libro chiamato Biomedical Signal Processing di Rangayyan (spero di ricordarmelo correttamente). L'ICA non è una tecnica banale, ma è stata sviluppata da ricercatori in Finlandia e penso che il codice Matlab sia disponibile pubblicamente per il download. PCA è una tecnica più ampiamente utilizzata e credo che dovresti essere in grado di trovare la sua R o altra implementazione software. La PCA viene eseguita risolvendo le equazioni lineari in modo iterativo. L'ho fatto troppo tempo fa per ricordare come. =)

L'idea è di suddividere i segnali in autovettori indipendenti (autofunzioni discrete, in realtà) e i loro autovalori, 21 nel tuo caso. Ogni autovalore mostra la quantità di contributo che ciascuna autofunzione fornisce a ciascuna delle tue misurazioni. Se un autovalore è minuscolo, puoi rappresentare molto da vicino i segnali senza usare la sua autofunzione corrispondente, ed è così che ti liberi di una dimensione.


+1 Grazie. Questo è un suggerimento molto interessante e ha perfettamente senso. Come ultima richiesta, hai familiarità con qualsiasi tutorial pratico (in Python o R o in qualche altro linguaggio) che spiega come farlo in modo interattivo (intendo spiegare passo dopo passo l'intero processo). Ho letto alcuni documenti da ieri, ma la maggior parte sembra essere fuori dalla mia comprensione. Eventuali suggerimenti?
Legenda,

4
Nitpicking: ICA non è un algoritmo di riduzione dimensionale. Non sa come assegnare un punteggio ai componenti e non dovrebbe essere usato come tale.
Gael Varoquaux,

12

Le risposte migliori sono buone ma vecchie, quindi vorrei aggiungere una risposta del 2016 .


Come detto, in uno spazio ad alta dimensione, la maledizione della dimensionalità si nasconde dietro l'angolo, rendendo gli approcci tradizionali, come il popolare kd tree, lenti come un approccio a forza bruta. Di conseguenza, rivolgiamo il nostro interesse alla ricerca approssimativa del vicino più vicino (ANNS) , che a favore di una certa precisione, accelera il processo. Ottieni una buona approssimazione dell'esatto NN, con una buona propensione.


Argomenti caldi che potrebbero essere degni:

  1. Approcci moderni di LSH , come quelli di Razenshteyn .
  2. Foresta RKD : Foresta / e di alberi kd randomizzati (RKD), come descritto in FLANN , o in un approccio più recente di cui facevo parte, kd-GeRaF .
  3. LOPQ che sta per Quantizzazione del prodotto localmente ottimizzato, come descritto qui . E 'molto simile al nuovo Babenko + di Lemptitsky approccio .

Puoi anche controllare le mie risposte pertinenti:

  1. Due serie di punti ad alta dimensione: trova il vicino più vicino nell'altra serie
  2. Confronto del runtime delle query Neighbor più vicine su diverse strutture di dati
  3. Implementazione kd-tree PCL estremamente lenta

8

Per rispondere alle tue domande una ad una:

  • No, la distanza euclidea è una cattiva metrica nello spazio ad alta dimensione. Fondamentalmente in dimensioni elevate, i punti dati presentano grandi differenze tra loro. Ciò riduce la differenza relativa della distanza tra un dato punto dati e il suo vicino più vicino e più lontano.
  • Numerosi articoli / ricerche sono presenti in dati ad alta dimensione, ma la maggior parte delle cose richiede molta sofisticazione matematica.
  • L'albero KD è dannoso per i dati ad alta dimensione ... evitarlo con ogni mezzo

Ecco un bel documento per iniziare nella giusta direzione. " Quando nel prossimo più vicino significativo ?" di Beyer et all.

Lavoro con dati testuali di dimensioni 20K e superiori. Se vuoi un consiglio relativo al testo, potrei essere in grado di aiutarti.


1
+1 Sto stampando quel foglio per leggerlo ora. Nel frattempo, hai suggerimenti su come altro per capire i vicini più vicini? Se sia la metrica della distanza che la definizione del vicino stesso sono imperfette, come possono generalmente le persone risolvere i problemi di dimensione superiore dove vogliono fare una corrispondenza approssimativa basata sui vettori di caratteristiche? Eventuali suggerimenti?
Legenda,

1
Nel caso del testo usiamo molto la somiglianza del coseno. Sto lavorando nella classificazione del testo da solo e trovo che per dimensioni elevate, SVM con kernel lineari sembra essere il più efficace.
BiGYaN,

@BiGYaN Come hai definito il tuo spazio. Voglio dire in base alla bage del vettore di parole o al vettore incorporato?
user3487667,

@ user3487667, Lo spazio dipende da come si formula il problema. Stavo parlando di un semplice modello bag-of-word.
BiGYaN

5

La somiglianza del coseno è un modo comune per confrontare i vettori ad alta dimensione. Si noti che poiché si tratta di una somiglianza non di una distanza, si vorrebbe massimizzare non minimizzarlo. Puoi anche utilizzare un modo specifico del dominio per confrontare i dati, ad esempio se i tuoi dati erano sequenze di DNA, potresti usare una somiglianza di sequenza che tiene conto delle probabilità di mutazioni, ecc.

Il numero di vicini più vicini da utilizzare varia in base al tipo di dati, alla quantità di rumore presente, ecc. Non ci sono regole generali, devi solo trovare ciò che funziona meglio per i tuoi dati e problemi specifici provando tutti i valori all'interno di un intervallo . Le persone hanno una comprensione intuitiva che più dati ci sono, meno vicini hai bisogno. In una situazione ipotetica in cui hai tutti i dati possibili, devi solo cercare il singolo vicino più vicino per classificare.

Il metodo k Neighbor Neighbor è noto per essere computazionalmente costoso. È uno dei motivi principali per cui le persone si rivolgono ad altri algoritmi come le macchine vettoriali di supporto.


Questo è interessante. Puoi approfondire il modo in cui potrei utilizzare SVM nel mio caso? Pensavo che i vicini di K-più vicini fossero più come incustoditi e che gli SVM siano sorvegliati. Perfavore, correggimi se sbaglio.
Legenda,

2
Entrambi i metodi sono supervisionati, poiché i dati di allenamento sono annotati con le classi corrette. Se hai solo i vettori delle caratteristiche e non conosci le classi a cui appartengono, non puoi usare kNN o SVM. I metodi di apprendimento senza supervisione sono generalmente indicati come algoritmi di clustering. Possono identificare gruppi di dati simili, ma non ti dicono cosa significano i gruppi.
Colin,

Grazie per il chiarimento. Hai ragione. È davvero una tecnica supervisionata. In realtà non mi rendevo conto che quelle che chiamavo categorie erano in realtà anche classi :)
Legenda il

4

kd-trees in effetti non funzionerà molto bene su dati ad alta dimensione. Poiché la fase di potatura non aiuta più molto, poiché il bordo più vicino - una deviazione monodimensionale - sarà quasi sempre più piccolo della deviazione full-dimensionale rispetto ai vicini più vicini conosciuti.

Inoltre, gli alberi kd funzionano bene solo con le norme Lp per quanto ne so, e c'è l'effetto di concentrazione della distanza che fa degradare gli algoritmi basati sulla distanza con l'aumentare della dimensionalità.

Per ulteriori informazioni, potresti voler leggere la maledizione della dimensionalità e le varie varianti di essa (c'è più di un lato!)

Non sono convinto che sia molto utile avvicinarsi alla cieca ai vicini euclidi più vicini, ad esempio usando LSH o proiezioni casuali. In primo luogo potrebbe essere necessario utilizzare una funzione di distanza molto più precisa!


Hai riferimenti per il tuo primo e secondo comma?
Chuck,

No, ma dovrebbero essere abbastanza evidenti dalle solite istanze di "maledizione della dimensionalità" (cfr. Sondaggio ) e cercare di trovare qualsiasi albero kd che supporti qualsiasi cosa diversa da Euclide ... supportare altre distanze è possibile, ma non comune (ELKI consente tutte le distanze di Minkowski + euclideo quadrato, ma la maggior parte avrà solo euclideo). Considera solo che gli alberi kd usano una dimensione solo per la potatura e confrontala con la distanza che coinvolge tutte le dimensioni. Inoltre, le tue divisioni non saranno in grado di dividere in ogni dimensione.
Erich Schubert,

3

Molto dipende dal motivo per cui vuoi conoscere i vicini più vicini. Potresti esaminare l'algoritmo di spostamento medio http://it.wikipedia.org/wiki/Mean-shift se quello che vuoi davvero è trovare le modalità del tuo set di dati.


2
Per quanto ne so, Mean-Shift non è adatto per il raggruppamento di dati ad alta dimensione. K-Means potrebbe essere una scelta migliore.
fdermishin,

3

Penso che il coseno su tf-idf di funzioni booleane funzionerebbe bene per la maggior parte dei problemi. Questo perché la sua euristica comprovata viene utilizzata in molti motori di ricerca come Lucene. La distanza euclidea nella mia esperienza mostra cattivi risultati per qualsiasi dato testuale. La selezione di pesi ed esempi k diversi può essere effettuata con i dati di allenamento e la selezione dei parametri di forza bruta.


3

iDistance è probabilmente il migliore per il recupero preciso dei dati in alta dimensione. Puoi vederlo come una tessalizzazione Voronoi approssimativa.


3

Ho riscontrato lo stesso problema e posso dire quanto segue.

  1. La distanza euclidea è una buona metrica della distanza, tuttavia è computazionalmente più costosa della distanza di Manhattan e talvolta produce risultati leggermente più scarsi, quindi sceglierei più tardi.

  2. Il valore di k può essere trovato empiricamente. È possibile provare valori diversi e verificare le curve ROC risultanti o qualche altra misura di precisione / richiamo per trovare un valore accettabile.

  3. Sia la distanza euclidea che quella di Manhattan rispettano la disuguaglianza del Triangolo , quindi puoi usarle negli alberi metrici. In effetti, gli alberi KD hanno prestazioni notevolmente ridotte quando i dati hanno più di 10 dimensioni (ho riscontrato questo problema da solo). Ho trovato alberi VP come un'opzione migliore.


3

Gli alberi KD funzionano bene per 21 dimensioni, se si esce presto, dopo aver visto il 5% di tutti i punti. FLANN fa questo (e altri speedups) per abbinare vettori SIFT a 128 dim. (Sfortunatamente FLANN esegue solo la metrica euclidea e la veloce e solida scipy.spatial.cKDTree fa solo metriche Lp; queste possono o meno essere adeguate per i tuoi dati.) Qui c'è ovviamente un compromesso per l'accuratezza della velocità.

(Se potessi descrivere Ndata, Nquery, la distribuzione dei dati, ciò potrebbe aiutare le persone a provare dati simili.)

Aggiunto il 26 aprile, i tempi di esecuzione di cKDTree con cutoff sul mio vecchio Mac PPC, per dare un'idea molto approssimativa della fattibilità:

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=1000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.1 % of the 1000000 points, 0.31 % of 188315 boxes; better 0.0042 0.014 0.1 %
3.5 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.253

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=5000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.48 % of the 1000000 points, 1.1 % of 188315 boxes; better 0.0071 0.026 0.5 %
15 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.245

2

Potresti provare la curva dell'ordine di az. È facile per 3 dimensioni.


0

La distanza euclidea è una buona metrica per trovare in primo luogo i vicini più vicini? In caso contrario, quali sono le mie opzioni?

Suggerirei un clustering di subspazi soft , un approccio abbastanza comune al giorno d'oggi, in cui i pesi delle caratteristiche vengono calcolati per trovare le dimensioni più rilevanti. È possibile utilizzare questi pesi quando si utilizza la distanza euclidea, ad esempio. Vedi la maledizione della dimensionalità per problemi comuni e anche questo articolo può illuminarti in qualche modo:

Un algoritmo di clustering di tipo k per cluster di sottospazi di set di dati numerici e categorici misti

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.