J'ai remarqué que LSH semble être un bon moyen de trouver des articles similaires avec des propriétés de grande dimension.
Après avoir lu le document http://www.slaney.org/malcolm/yahoo/Slaney2008-LSHTutorial.pdf , je suis toujours confus avec ces formules.
Est-ce que quelqu'un connaît un blog ou un article qui explique cela facilement?
Le meilleur tutoriel que j'ai vu pour LSH se trouve dans le livre: Mining of Massive Datasets. Consultez le chapitre 3 - Trouver des articles similaires http://infolab.stanford.edu/~ullman/mmds/ch3a.pdf
Aussi, je recommande la diapositive ci-dessous: http://www.cs.jhu.edu/%7Evandurme/papers/VanDurmeLallACL10-slides.pdf . L'exemple de la diapositive m'aide beaucoup à comprendre le hachage pour la similarité de cosinus.
J'emprunte deux diapositives de Benjamin Van Durme et Ashwin Lall, ACL201 et tente d'expliquer un peu les intuitions de LSH Families pour la distance en cosinus.
J'ai quelques exemples de code (seulement 50 lignes) dans python ici, qui utilise la similarité cosinus.) https://Gist.github.com/94a3d425009be0f94751
Les tweets dans un espace vectoriel peuvent constituer un excellent exemple de données de grande dimension.
Consultez mon article de blog sur l’application de Locality Sensitive Hashing aux tweets pour en trouver des similaires.
http://micvog.com/2013/09/08/storm-first-story-detection/
Et parce qu’une image vaut mille mots, regardez l’image ci-dessous:
http://micvog.files.wordpress.com/2013/08/lsh1.png
J'espère que ça aide. @mvogiatzis
Voici une présentation de Stanford qui l'explique. Cela a fait une grande différence pour moi. La deuxième partie est davantage consacrée à LSH, mais la première le couvre également.
Une image de la vue d'ensemble (il y en a beaucoup plus dans les diapositives):
Recherche de proche voisinage dans les données de haute dimension - Partie 1: http://www.stanford.edu/class/cs345a/slides/04-highdim.pdf
Recherche de proche voisinage dans les données de haute dimension - Partie 2: http://www.stanford.edu/class/cs345a/slides/05-LSH.pdf
Il est important de souligner que différentes mesures de similarité ont des implémentations différentes de LSH.
Dans mon blog, j'ai essayé d'expliquer en détail LSH pour les cas minHashing (mesure de similarité jaccard) et simHashing (mesure de distance cosinus). J'espère que vous le trouverez utile: https://aerodatablog.wordpress.com/2017/11/29/locality-sensitive-hashing-lsh/
Je suis une personne visuelle. Voici ce qui fonctionne pour moi comme une intuition.
Disons que chaque objet que vous souhaitez rechercher est approximativement un objet physique tel qu'un Apple, un cube, une chaise.
Mon intuition pour un LSH est qu'il est similaire de prendre les ombres de ces objets. Comme si vous preniez l'ombre d'un cube 3D, vous obtenez un carré 2D sur un morceau de papier, ou une sphère 3D vous obtiendrez une ombre circulaire sur un morceau de papier.
Finalement, il y a beaucoup plus de trois dimensions dans un problème de recherche (où chaque mot d'un texte peut être une dimension) mais l'analogie ombre m'est toujours très utile.
Maintenant, nous pouvons comparer efficacement les chaînes de bits dans le logiciel. Une chaîne de bits de longueur fixe est un peu, plus ou moins, comme une ligne dans une seule dimension.
Donc, avec un LSH, je projette éventuellement les ombres des objets sous forme de points (0 ou 1) sur une seule ligne/chaîne de bits de longueur fixe.
L'astuce consiste à prendre les ombres de telle sorte qu'elles aient encore un sens dans la dimension inférieure, par exemple. ils ressemblent à l’objet d’origine assez bien pour être reconnus.
Un dessin 2D d'un cube en perspective m'indique qu'il s'agit d'un cube. Mais je ne peux pas distinguer facilement un carré 2D d'une ombre de cube 3D sans perspective: ils ressemblent tous les deux à un carré.
La façon dont je présente mon objet à la lumière déterminera si je reçois une bonne ombre reconnaissable ou non. Je pense donc à un "bon" LSH comme celui qui retournera mes objets devant une lumière de telle sorte que leur ombre soit mieux reconnaissable comme représentant mon objet.
Donc, pour résumer: je pense aux choses à indexer avec un LSH en tant qu'objets physiques comme un cube, une table ou une chaise, et je projette leurs ombres en 2D et éventuellement sur une ligne (une chaîne de bits). Et une "bonne" fonction "LSH" est la façon dont je présente mes objets devant une lumière pour obtenir une forme à peu près distincte dans le 2D flatland et plus tard ma chaîne de bits.
Enfin, lorsque je veux rechercher si un objet que je possède est similaire à certains objets que j’ai indexés, je prends les ombres de cet objet "query" de la même manière pour présenter mon objet devant la lumière (pour finir par un peu ficelle aussi). Et maintenant, je peux comparer à quel point cette chaîne de bits est similaire à toutes mes autres chaînes de bits indexées, ce qui est un proxy pour la recherche de tous mes objets si je trouvais un moyen efficace et reconnaissable de présenter mes objets à ma lumière.
En résumé, tldr répond:
Un exemple de hachage sensible à la localité pourrait être de définir d’abord des plans de manière aléatoire (avec une rotation et un décalage) dans votre espace d’entrées en hachage, puis d’abandonner vos points dans l’espace, et pour chaque plan que vous mesurez si le point est au-dessus ou au-dessous (par exemple: 0 ou 1), et la réponse est le hachage. Ainsi, les points similaires dans l'espace auront un hachage similaire s'ils sont mesurés avec la distance cosinus avant ou après.
Vous pouvez lire cet exemple en utilisant scikit-learn: https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer