Amplificare un hash sensibile alla località


10

Sto cercando di costruire un hash sensibile alla località coseno in modo da poter trovare coppie di oggetti simili simili senza dover confrontare ogni possibile coppia. L'ho sostanzialmente funzionante, ma la maggior parte delle coppie nei miei dati sembra avere una somiglianza del coseno nell'intervallo da -0,2 a +0,2, quindi sto cercando di tagliarlo abbastanza finemente e scegliere cose con somiglianza del coseno 0.1 e successive.

Ho letto il capitolo 3 dei set di dati di mining di mining in cui si parla di aumentare l'accuratezza della selezione delle coppie di candidati attraverso l'amplificazione di una famiglia sensibile alla località. Penso di aver quasi capito la spiegazione matematica, ma faccio fatica a vedere come lo pratico praticamente.

Quello che ho finora è il seguente

  1. Ho detto 1000 film ciascuno con voti da una selezione di utenti 1M. Ogni film è rappresentato da un vettore sparso di punteggi degli utenti (numero di riga = ID utente, valore = punteggio dell'utente)
  2. Costruisco N vettori casuali. La lunghezza del vettore corrisponde alla lunghezza dei vettori del film (ovvero il numero di utenti). I valori vettoriali sono +1 o -1. In realtà ho codificato questi vettori come binari per risparmiare spazio, con +1 mappato su 1 e -1 mappato su 0
  3. Costruisco vettori di schizzo per ogni film prendendo il punto prodotto del film e ciascuno degli N vettori casuali (o meglio, se creo una matrice R posizionando gli N vettori casuali in orizzontale e sovrapponendoli uno sopra l'altro quindi lo schizzo per il film m è R * m), quindi prendendo il segno di ogni elemento nel vettore risultante, quindi finisco con un vettore di schizzo per ogni film di + 1s e -1s, che di nuovo codifico come binario. Ogni vettore è lunghezza N bit.
  4. Quindi cerco schizzi simili procedendo come segue
    1. Ho diviso il vettore di schizzo in bande b di r bit
    2. Ogni banda di r bit è un numero. Combino quel numero con il numero di banda e aggiungo il filmato a un bucket hash sotto quel numero. Ogni film può essere aggiunto a più di un bucket.
    3. Poi guardo in ogni secchio. Tutti i film che si trovano nello stesso bucket sono coppie candidate.

Confrontando questo con 3.6.3 di mmds, il mio passo AND è quando guardo le bande di r bit - una coppia di film passa il passo AND se i bit r hanno lo stesso valore. Il mio passaggio OR avviene nei bucket: i film sono coppie candidate se sono entrambi in uno dei bucket.

Il libro suggerisce che posso "amplificare" i miei risultati aggiungendo più passi AND e OR, ma sono in perdita per come farlo praticamente poiché la spiegazione del processo di costruzione per ulteriori strati è in termini di controllo dell'uguaglianza a coppie piuttosto che venire con i numeri del secchio.

Qualcuno può aiutarmi a capire come farlo?

Risposte:


4

Penso di aver risolto qualcosa. Fondamentalmente sto cercando un approccio che funzioni in una mappa / riduca l'ambiente di tipo e penso che questo approccio lo faccia.

Così,

  • supponiamo di avere b bande di r righe e di voler aggiungere un altro stadio AND, diciamo un altro c AND.
  • quindi invece di bit b * r ho bisogno di hash di bit b * r * c
  • e eseguo la mia procedura precedente c volte, ogni volta su bit b * r
  • Se xey si rivelano essere una coppia candidata in una di queste procedure, emette una coppia valore-chiave ((x, y), 1), con la tupla di ID (x, y) come chiave e il valore 1
  • Alla fine delle procedure c raggruppo queste coppie per chiave e somma
  • Qualsiasi coppia (x, y) con una somma pari a c era una coppia candidata in ciascuno dei round c, e così è una coppia candidata dell'intera procedura.

Quindi ora ho una soluzione praticabile, e tutto quello che devo fare è capire se l'uso di 3 passaggi come questo mi aiuterà effettivamente a ottenere un risultato migliore con meno bit di hash globali o migliori prestazioni complessive ...


0

Avrei solo commentato ma non posso. Ho cercato un trattamento pratico dell'amplificazione nell'LSH e ciò che hai presentato ha molto senso. Da quello che raccolgo, la funzione hash primaria èper qualche vettore casuale , dopo AND questo diventa e finalmente dopo OR, orOra puoi AND / OR usando

h(X,v)={0Se sgn(Xv)<01altro
vh'(X,io)=(h(X,vio+1),...,h(X,vio+r))h"(X,j)=f(h'(X,rj),j)
h"(X,y)={1Se h"(X,j)=h"(y,j) per ogni j[0,B)0altro
h"(X,y)come descrivi. Sceglieresti quindi candidati basati su dichiarazioni logiche AND / OR; non stai davvero più frullando. A questo punto per continuare l'hashing, avresti bisogno di una mappatura dei bin in modo tale che ogni vettore appaia solo una volta in , ma probabilmente anche questo introdurrà falsi positivi e / o negativi. Un'idea per un hash è il minimo di per tutti (o il minimo tra tutti e tutti direttamente e indirettamente associati ). Entrambi chiaramente introdurrebbero pregiudizi. Potrei provare uno di questi, anche se non sono sicuro che gli hash da un AND casuale o saranno significativi la prossima volta.h^:SS'S'h"(X,j)jjyv e un gran numero di repliche, forse?
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.