J'essaie de créer un hachage sensible aux localités cosinus afin de pouvoir trouver des paires d'articles similaires candidates sans avoir à comparer toutes les paires possibles. Je l'ai essentiellement, mais la plupart des paires de mes données semblent avoir une similitude cosinus dans la plage -0,2 à +0,2, donc j'essaie de le découper assez finement et de choisir des choses avec une similitude cosinus de 0,1 et plus.
J'ai lu le chapitre 3 de Mining Massive Datasets. Il s'agit d'augmenter la précision de la sélection de paires candidates en amplifiant une famille sensible à la localité. Je pense que je comprends à peu près l'explication mathématique, mais j'ai du mal à voir comment je l'implémente pratiquement.
Ce que j'ai jusqu'à présent est le suivant
- J'ai dit 1000 films chacun avec des notes d'une sélection d'utilisateurs de 1M. Chaque film est représenté par un vecteur épars de scores utilisateur (numéro de ligne = ID utilisateur, valeur = score utilisateur)
- Je construis N vecteurs aléatoires. La longueur du vecteur correspond à la longueur des vecteurs de film (c'est-à-dire le nombre d'utilisateurs). Les valeurs vectorielles sont +1 ou -1. En fait, j'encode ces vecteurs en binaire pour économiser de l'espace, avec +1 mappé à 1 et -1 mappé à 0
- Je crée des vecteurs d'esquisse pour chaque film en prenant le produit scalaire du film et chacun des N vecteurs aléatoires (ou plutôt, si je crée une matrice R en posant les N vecteurs aléatoires horizontalement et en les superposant, puis l'esquisse pour le film m est R * m), puis en prenant le signe de chaque élément dans le vecteur résultant, je termine avec un vecteur d'esquisse pour chaque film de + 1s et -1s, que j'encode à nouveau comme binaire. Chaque vecteur a une longueur de N bits.
- Ensuite, je cherche des croquis similaires en procédant comme suit
- J'ai divisé le vecteur d'esquisse en bandes b de bits r
- Chaque bande de r bits est un nombre. Je combine ce numéro avec le numéro de bande et ajoute le film à un seau de hachage sous ce numéro. Chaque film peut être ajouté à plusieurs compartiments.
- Je regarde ensuite dans chaque seau. Tous les films qui sont dans le même ensemble sont des paires candidates.
En comparant cela à 3.6.3 de mmds, mon étape ET est quand je regarde les bandes de r bits - une paire de films passe l'étape ET si les r bits ont la même valeur. Mon étape OU se produit dans les compartiments: les films sont des paires candidates s'ils sont tous les deux dans l'un des compartiments.
Le livre suggère que je puisse "amplifier" mes résultats en ajoutant plus d'étapes ET et OU, mais je ne sais pas comment le faire pratiquement car l'explication du processus de construction pour d'autres couches consiste à vérifier l'égalité par paire plutôt que venir avec des numéros de seau.
Quelqu'un peut-il m'aider à comprendre comment procéder?