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
- 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)
- 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
- 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.
- Als nächstes suche ich nach ähnlichen Skizzen, indem ich Folgendes mache
- Ich habe den Skizzenvektor in b Bänder mit r Bits aufgeteilt
- 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.
- 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?