Trova coppie vicine in uno spazio dimensionale molto elevato con vettori sparsi


9

Ho (~ un milione) di vettori di funzioni. Ci sono (~ un milione) di caratteristiche binarie, ma in ogni vettore solo (~ un migliaio) di loro sarebbe , il resto sono . Sto cercando le coppie di vettori che hanno almeno (~ cento) caratteristiche in comune ( in entrambi). Il numero di tali coppie ha una magnitudine simile a (~ un milione).M K 1 0 L 1 NNMK10L1N

Penso che questo potrebbe essere affrontato come ricerca di coppie di punti ravvicinati in uno spazio di dimensioni molto elevate. La funzione di distanza potrebbe essere tale da basarsi su quante caratteristiche hanno in comune i due vettori. Ma sarebbe probabilmente utile anche con una metrica di distanza più convenzionale (come Euclide).

Quali algoritmi noti sarebbero utili per affrontare questo problema? Tutto ciò che è quadratico in o non sarà pratico.MNM


Un esempio di formulazione del problema nel mondo reale è considerare persone che si spostano tra un numero di posizioni. Se due persone fossero nello stesso posto allo stesso tempo, diciamo che si sono incontrate. (Il numero di combinazioni luogo-tempo con almeno 1 persona presente è ) Cerchiamo amici: persone che hanno incontrato almeno volte.M LNML


1
Se il vettore 1, la funzione 1 è , e il vettore 2, anche la funzione 1 è , hanno quella funzione "in comune"? 000
gung - Ripristina Monica

@utente777, presumo di no , nel qual caso la tua risposta è perfetta, ma sarebbe bello che ciò fosse esplicitamente dichiarato dall'OP.
gung - Ripristina Monica

@gung, presumi giusto. Ho modificato la domanda per chiarire. Grazie!
Daniel Darabos,

1
A proposito di quante coppie di vettori hanno> 100 caratteristiche in comune - campione casuale + forza bruta? Le dimensioni 1M x 1M sono un vero problema o sono state inventate? Vedi anche l'approccio nella ricerca della stringa di bit più vicina al vicino su StackOverflow.
denis,

1
Un suggerimento forse pazzo: visualizza i tuoi vettori di funzionalità da 1 Mbit come immagini di 1000 x 1000 pixel e cerca i metodi per il clustering di immagini, ad esempio stackoverflow.com/search?q=[image lasting+ clustering . Dopodiché devi trovare buone funzionalità (non singoli pixel) affinché funzioni, ma non sono un esperto.
denis,

Risposte:


6

Sembra che l'approccio che stai cercando sia una combinazione di firme minhash e Locality Sensitive Hashing (LSH); il pdf (liberamente disponibile) dei set di dati di massa mineraria descrive questo approccio (e altre misure di somiglianza) in alcuni dettagli nel capitolo 3, ma brevemente:

Una firma minhash è una rappresentazione condensata della tua matrice originale che viene costruita applicando un numero n di funzioni hash alle caratteristiche, riducendo così il numero di caratteristiche per osservazione. Ciò riduce la dimensione dei tuoi dati, tuttavia probabilmente noterai che questo ti lascia ancora con un problema .O(N2)

Per ovviare a questo, MMDS consiglia che se tutto ciò che vuoi trovare sono coppie al di sopra di una certa soglia di somiglianza (che sembrerebbe applicarsi nel tuo caso), allora puoi concentrarti solo su quelle coppie che hanno più probabilità di essere simili - questo approccio si chiama Locality Sensitive Hashing e nella sezione 3.4 illustrano un esempio di come combinare l'approccio della firma minhash con LSH.

Oltre al testo, ci sono anche lezioni disponibili sull'omonimo corso di Coursera .


7

Sto cercando le coppie di vettori che hanno almeno caratteristiche in comune.L

Questo è solo un prodotto interno dei vettori di caratteristiche binarie. Quando il prodotto interno è maggiore di , la coppia avrà almeno L elementi in comune. Questo dovrebbe essere un calcolo relativamente veloce - almeno, più veloce della distanza euclidea, che sarebbe dispendioso e lento per questi dati. Dato che stabilisci che stai cercando coppie, ciò significa intrinsecamente che devi fare per confrontare ogni vettore.L1L(N2)

Trovare punti vicini è davvero un problema di raggruppamento. Ma il primo passo degli algoritmi di clustering con cui ho familiarità è il calcolo di distanze o somiglianze a coppie. Sono sicuro che qualcuno ha sviluppato alternative più efficienti. Un punto sulla terminologia: avere almeno vicini comuni è definito come una somiglianza , non come una distanza! I prodotti interni sono, in questo caso, somiglianze al coseno non normalizzate.L

Puoi renderlo più tracciabile eseguendo il calcolo del prodotto interno solo quando la somma del vettore di feature (che in questo caso è la stessa della norma) per un'osservazione è maggiore di , poiché è impossibile per quel vettore di feature binario di avere un prodotto interno un'altra caratteristica vettore binario che soddisfano il criterio quando questa somma è inferiore . Ovviamente, calcolare queste somme è solo complessità , quindi sono un modo economico per ridurre l'entità del passaggio interno del prodotto.L O ( N )L1LO(N)

Ma il modo classico per ridurre la portata di questo problema è quello di effettuare un pre-filtro aggiuntivo. Sei particolarmente interessato a quando una funzionalità, un po 'insolita, assume il valore 1? In tal caso, eseguire solo il calcolo per quei vettori di caratteristiche.

O forse potresti beneficiare di ri-inquadrare il tuo problema. Ad esempio, è noto che il campionamento abbia delle belle proprietà; la statistica inferenziale si sviluppa su questa idea con una certa profondità. Quindi forse è impossibile analizzare l'intero set di dati, ma è perfettamente fattibile esaminare un piccolo campione. Non so a quale domanda stai cercando di rispondere, ma se progetti attentamente il tuo esperimento, potresti cavartela solo guardando qualche migliaio di osservazioni, con più che sufficienti dati lasciati a fini di validazione.

Dopo qualche pensiero in più, ho una forte sensazione che i dati si sta lavorando è un qualche tipo di grafo . È molto plausibile che sia composto da diversi componenti collegati, nel qual caso è possibile scomporre in una serie di grafici, con il felice effetto collaterale di ridurre la dimensionalità dei dati. Anche se il grafico è solo due componenti collegati approssimativamente della stessa dimensione, ciò significa che i tuoi confronti coppie hanno approssimativamente il costo totale!G G O ( N 2 ) 1GGGO(N2)14

Se il grafico è simmetrico, possono essere utili le seguenti osservazioni:

  1. Definisci il Laplaciano del tuo grafico come , dove è una matrice diagonale di grado (la somma di ogni vettore di funzione) e è la matrice di adiacenza (l'accatastamento dei vettori di funzione in una matrice).D AP=DADA
  2. Il numero di volte appare come un autovalore di è il numero di componenti collegati di . Decomporre il grafico nei suoi componenti collegati e lavorare esclusivamente con tali componenti avrà l'effetto collaterale di ridurre la dimensione dei dati; calcolare la tua quantità di interesse sarà più facile. Ma calcolare la composizione elettronica sarà costoso per un milione di vertici ...P G0PG
  3. (Dopo una permutazione completa) è un blocco matrice diagonale dei Laplacians dei componenti collegati di .GPG
  4. P è semidefinito positivo. Questo è quasi certamente utile in qualche modo.
  5. La connettività algebrica di è il valore del secondo più piccolo autovalore di . Questo ti dice quanto sia ben collegato . Forse questo risponderà ad alcune delle domande che ti interessano: i vettori che hanno caratteristiche in comune. La teoria dei grafi spettrali sviluppa questa idea in modo più dettagliato.P GGPsol

"È un problema SNA?" Non ne sono sicuro. In un'applicazione le funzionalità descrivono il comportamento e stiamo cercando di connettere le persone con comportamenti simili. Questo rende questo un problema SNA?

Se hai un grafico bipartito che collega le persone ai comportamenti, puoi pensare a questo come a una rete di affiliazione , con persone come file e comportamenti come colonne. Se si desidera collegare le persone alle persone tramite i comportamenti che hanno in comune, è possibile calcolare . è il numero di comportamenti che le persone hanno in comune. Ovviamente, l'insieme di vertici in cui risponde alla tua domanda.B B T = A A i j A i jLBBBT=UNUNiojUNiojL


Grazie per l'ottima risposta! Sono molte le cose che dovrò approfondire. Tuttavia, non sono convinto che i confronti a coppie siano inevitabili. Non è questo un problema di clustering in cui cerco cluster di dimensioni> 1? Mi aspettavo che un approccio di partizionamento spaziale potesse ridurre fortemente il numero di confronti a coppie.
Daniel Darabos,

Mi dispiace, non so molto sulla scienza dei dati. Ma non è un problema di raggruppamento quando stiamo cercando di raggruppare punti che si trovano vicini? Ho una distanza massima (L) e voglio trovare gruppi (coppie) di punti che si trovano entro tale distanza l'uno dall'altro. Questo sta allungando troppo la definizione di clustering?
Daniel Darabos,

1
Può davvero essere definito un problema grafico. In quel caso abbiamo un grafico bipartito di N punti e caratteristiche M e vogliamo trovare coppie di punti che abbiano almeno L vicini vicini. Sto specificamente esaminando il fraseggio basato su vettori ora, sperando che ci sia un metodo di clustering che potrebbe essermi utile. A K-SVD è stato suggerito un problema simile in stats.stackexchange.com/questions/93366/… , quindi al momento sto leggendo questo. Grazie!
Daniel Darabos,

"È un problema SNA?" Non ne sono sicuro. In un'applicazione le funzionalità descrivono il comportamento e stiamo cercando di connettere le persone con comportamenti simili. Questo rende questo un problema SNA? Grazie per avermi introdotto alla terminologia, è molto utile guidare la mia ricerca.
Daniel Darabos,

Ho rivisto la mia risposta. Il tuo obiettivo finale è solo quello di elencare le persone con molti comportamenti in comune o è qualcos'altro?
Sycorax dice di reintegrare Monica l'

2

Alla ricerca di persone che si incontrano in blocchi spazio-temporali:
dividere lo spazio in blocchi (isolati, km quadrati, qualunque cosa) e il tempo in blocchi . C'è una buona probabilità che se le persone si incontrano, si incontreranno nello stesso isolato. Quindi esegui NN all'interno di ciascun blocco. I tempi di esecuzione e i tassi di errore dipenderanno ovviamente dalle dimensioni e dalle forme dei blocchi (anche da cosa si può parallelizzare / MapReduce), ma si hanno parametri con cui giocare - ingegneria, non .N t i m e O ( N 2 )NSpun'ceNtiome
O(N2)

Vedi anche:
vicini-vicini-ricerca-di-dati-molto-dimensionali su datascience.stackexchange

pairwise.py :

utilizza la libreria Python Gensim e heapq della libreria standard per effettuare confronti in modo massicciamente scalabili e scalabili tra un numero di documenti aribtrariamente elevato usando TF-IDF e distanza del coseno.


1

Xfeun't1:vun'lue1,feun't101:vun'lue101KKK

Per ogni funzione, crea un dizionario contenente gli indici che condividono questa funzione. Speriamo che questo numero non sia troppo grande (se hai una funzione condivisa da tutti gli indici, questo approccio è rovinato, puoi smettere di leggere qui).

feun't1:{1,101,202},feun't2:{7,202},feun't3:{202}...feun'tM:{3,45,6}feun't3O(NK)

XXXPO(N2)

Xyd(X,y)<X,y>XyO(K)

O(NPK)O(MN2)

Ho applicato questo metodo per implementare un KNN su set di testo di grandi dimensioni (treno: 2 000 000 di linee, test di 35000 linee, numero di funzioni: 10 000, numero medio di funzioni per elemento: 20), che ha funzionato in circa un'ora .. .


Non capisco del tutto questo approccio - questo non è perché non ti credo, è interamente dovuto alla mia mancanza di familiarità con le diverse strategie per la rappresentazione dei dati. Forse potresti approfondire di più quello che tratterai nei primi due paragrafi?
Sycorax dice di ripristinare Monica

O(N2)

1

KO(LNlog(N))

L. Erotz, M. Steinbach e V. Kumar. "Un nuovo algoritmo di cluster condiviso vicino più vicino e le sue applicazioni." Atti del 1 ° Workshop sul clustering di dati ad alta dimensione e sue applicazioni, 2002.


Grazie, è una lettura interessante. Come hai ottenuto il tempo O (LN log (N))? Sembra fantastico. Ma la descrizione dell'algoritmo inizia con "Costruisci la matrice di somiglianza" e sarebbe una matrice NxN, per quanto ho capito.
Daniel Darabos,

@DanielDarabos La complessità è descritta nel libro Practical Graph Mining con R.
Sycorax dice Reinstate Monica

1

O(Klogn)K<<n

Dato che k è 100 e n è 1e6, questo dovrebbe darti una velocità ~ 1e4x rispetto alla classica FFT.

Se hai bisogno di altri 20x di velocità e sei un sostenitore del rischio, quindi invece di contorto tutte le righe rispetto al dominio e cercando il picco, potresti avviare un sottoinsieme di righe.

Puoi anche pre-filtrare le colonne rimuovendo le colonne le cui somme sono inferiori a 50 o qualche altra soglia dell'ordine della metà del numero di righe che stai cercando di abbinare. Per lo meno, è necessario rimuovere le colonne di tutti gli zeri e tutti gli 1 come non informativi. Lo stesso vale per le righe che sono completamente vuote o abbastanza vuote o che sono così piene da essere irrilevanti.

Da fare: dovrei mettere un esempio qui usando dati sintetici e confrontare alcuni dei metodi.


0

Mi sono appena imbattuto in un documento direttamente pertinente.

Algoritmi randomizzati e NLP: utilizzo della funzione hash sensibile alla località per il clustering di nomi ad alta velocità (Ravichandran et al, 2005)

In realtà è implementato in https://github.com/soundcloud/cosine-lsh-join-spark che è dove l'ho trovato.

Si basa sull'hashing sensibile alla località (già menzionato in altre risposte). Dopo aver ridotto i vettori di funzionalità a uno spazio a bassa dimensione, utilizza una veloce unione di Hamming per trovare i vicini più vicini.

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.