Verstärkung eines lokalitätssensitiven Hash

10

Ich versuche, einen für die Kosinuslokalität sensiblen Hash zu erstellen, damit ich ähnliche Elementpaare finden kann, ohne jedes mögliche Paar vergleichen zu müssen. Ich habe es im Grunde funktioniert, aber die meisten Paare in meinen Daten scheinen Cosinus-Ähnlichkeit im Bereich von -0,2 bis +0,2 zu haben, also versuche ich, es ziemlich fein zu würfeln und Dinge mit Cosinus-Ähnlichkeit von 0,1 und höher auszuwählen.

Ich habe Kapitel 3 über Mining Massive Datasets gelesen. Hier geht es darum, die Genauigkeit der Auswahl von Kandidatenpaaren durch Verstärkung einer lokalitätssensitiven Familie zu erhöhen. Ich glaube, ich verstehe die mathematische Erklärung fast, aber ich habe Mühe zu sehen, wie ich dies praktisch umsetze.

Was ich bisher habe, ist wie folgt

  1. Ich habe 1000 Filme mit Bewertungen von einer Auswahl von 1M Benutzern gesagt. Jeder Film wird durch einen spärlichen Vektor von Benutzerbewertungen dargestellt (Zeilennummer = Benutzer-ID, Wert = Benutzerbewertung)
  2. Ich baue N Zufallsvektoren. Die Vektorlänge entspricht der Länge der Filmvektoren (dh der Anzahl der Benutzer). Die Vektorwerte sind +1 oder -1. Ich codiere diese Vektoren tatsächlich als binär, um Platz zu sparen, wobei +1 auf 1 und -1 auf 0 abgebildet sind
  3. Ich erstelle Skizzenvektoren für jeden Film, indem ich das Punktprodukt des Films und jeden der N Zufallsvektoren nehme (oder besser gesagt, wenn ich eine Matrix R erstelle, indem ich die N Zufallsvektoren horizontal lege und sie übereinander lege, dann die Skizze für Film m ist R * m), dann nehme ich das Vorzeichen jedes Elements im resultierenden Vektor, also beende ich mit einem Skizzenvektor für jeden Film von + 1s und -1s, den ich wiederum als binär codiere. Jeder Vektor hat eine Länge von N Bits.
  4. Als nächstes suche ich nach ähnlichen Skizzen, indem ich Folgendes mache
    1. Ich habe den Skizzenvektor in b Bänder mit r Bits aufgeteilt
    2. Jedes Band von r Bits ist eine Zahl. Ich kombiniere diese Nummer mit der Bandnummer und füge den Film einem Hash-Bucket unter dieser Nummer hinzu. Jeder Film kann zu mehr als einem Bucket hinzugefügt werden.
    3. Ich schaue dann in jeden Eimer. Alle Filme, die sich im selben Bucket befinden, sind Kandidatenpaare.

Wenn ich dies mit 3.6.3 von mmds vergleiche, ist mein UND-Schritt, wenn ich Bänder mit r Bits betrachte - ein Filmpaar besteht den UND-Schritt, wenn die r Bits den gleichen Wert haben. Mein ODER-Schritt geschieht in den Eimern: Filme sind Kandidatenpaare, wenn sie beide in einem der Eimer sind.

Das Buch schlägt vor, dass ich meine Ergebnisse durch Hinzufügen weiterer UND- und ODER-Schritte "verstärken" kann, aber ich bin nicht in der Lage, dies praktisch zu tun, da die Erklärung des Konstruktionsprozesses für weitere Schichten eher in der Überprüfung der paarweisen Gleichheit als in der Überprüfung besteht mit Eimernummern kommen.

Kann mir jemand helfen zu verstehen, wie das geht?

Philip Pearl
quelle

Antworten:

4

Ich glaube, ich habe etwas herausgefunden. Grundsätzlich suche ich nach einem Ansatz, der in einer Map / Reduce-Typ-Umgebung funktioniert, und ich denke, dieser Ansatz macht es.

So,

  • Angenommen, ich habe b Bänder mit r Reihen und möchte eine weitere UND-Stufe hinzufügen, z. B. eine weitere c UND.
  • Anstelle von b * r-Bits benötige ich also Hashes von b * r * c-Bits
  • und ich führe meine vorherige Prozedur c-mal aus, jedes Mal auf b * r Bits
  • Wenn durch eine dieser Prozeduren festgestellt wird, dass x und y ein Kandidatenpaar sind, gibt es ein Schlüsselwertpaar ((x, y), 1) mit dem Tupel der IDs (x, y) als Schlüssel und dem Wert 1 aus
  • Am Ende der c-Prozeduren gruppiere ich diese Paare nach Schlüssel und Summe
  • Jedes Paar (x, y) mit einer Summe von c war in jeder der c Runden ein Kandidatenpaar, ebenso wie ein Kandidatenpaar der gesamten Prozedur.

Jetzt habe ich eine praktikable Lösung und alles, was ich tun muss, ist herauszufinden, ob die Verwendung von 3 Schritten wie diesem mir tatsächlich hilft, ein besseres Ergebnis mit weniger Hash-Bits oder einer besseren Gesamtleistung zu erzielen ...

Philip Pearl
quelle
0

h(x,v)={0wenn sgn(xv)<01sonst
vh'(x,ich)=(h(x,vich+1),...,h(x,vich+r))h(x,j)=f(h'(x,rj),j)
h(x,y)={1wenn h(x,j)=h(y,j) für jeden j[0,b)0sonst
h : S S ' S ' h " ( x , j ) j j y vh(x,y)h^::S.S.'S.'Dies führt jedoch wahrscheinlich auch zu falsch positiven und / oder negativen Ergebnissen. Eine Idee für einen Hash ist das Minimum von für alle (oder das Minimum über alle und alle direkt und indirekt assoziierten ). Beides würde eindeutig zu Voreingenommenheit führen. Ich könnte eines davon ausprobieren, obwohl ich nicht sicher bin, ob die Hashes von einem zufälligen UND / ODER beim nächsten Mal von Bedeutung sind. Aber vielleicht unter Berücksichtigung einer gleichmäßigen Verteilung von zufälligem und einer großen Anzahl von Replikationen?h(x,j)jjyv
Deasmhumnha
quelle