Как понять местность чувствительного хеширования?

Я заметил, что LSH кажется хорошим способом найти похожие объекты с высокоразмерными свойствами.

После прочтения статьи http://www.slaney.org/malcolm/yahoo/Slaney2008-LSHTutorial.pdf я все еще смущен этими формулами.

Кто-нибудь знает блог или статью, объясняющую, что это простой способ?

Ответ 1

Лучший учебник, который я видел для LSH, приведен в книге: "Добыча массивных наборов данных". Проверка главы 3 - Поиск похожих элементов http://infolab.stanford.edu/~ullman/mmds/ch3a.pdf

Также рекомендую нижний слайд: http://www.cs.jhu.edu/%7Evandurme/papers/VanDurmeLallACL10-slides.pdf. Пример в слайде помогает мне в понимании хэширования для сходства косинусов.

Я беру два слайда из Бенджамина Ван Дурме и Эшвина Лалла, ACL2010 и попытаюсь объяснить немного интуиции семейств LSH для косинусного расстояния. enter image description here

  • На рисунке представлены два круга: красный и желтый, представляющий две двумерные точки данных. Мы пытаемся найти их сходство с косинусом с использованием LSH.
  • Серые линии представляют собой некоторые равномерно случайно выбранные плоскости.
  • В зависимости от того, находится ли точка данных выше или ниже серой линии, мы отмечаем это отношение как 0/1.
  • В верхнем левом углу расположены две строки белых/черных квадратов, представляющие собой подпись двух точек данных соответственно. Каждый квадрат соответствует бит 0 (белый) или 1 (черный).
  • Итак, если у вас есть пул самолетов, вы можете кодировать точки данных с их местоположением, соответствующим самолетам. Представьте себе, что когда в пуле больше самолетов, разница angular, закодированная в сигнатуре, ближе к фактической разнице. Поскольку только плоскости, которые находятся между двумя точками, будут иметь два значения бит данных.

enter image description here

  • Теперь мы рассмотрим подпись двух точек данных. Как и в примере, мы используем только 6 бит (квадратов) для представления каждого из данных. Это хэш LSH для исходных данных, которые у нас есть.
  • Расстояние хеминга между двумя значениями хэширования равно 1, потому что их подписи отличаются только на 1 бит.
  • Учитывая длину сигнатуры, мы можем вычислить их сходство angular, как показано на графике.

У меня есть пример кода (всего 50 строк) в python здесь, который использует сходство с косинусом. https://gist.github.com/94a3d425009be0f94751

Ответ 2

Твиты в векторном пространстве могут быть отличным примером высокомерных данных.

Отправляй сообщение в своем блоге о том, как использовать локальную чувствительность для твитов, чтобы найти похожие.

http://micvog.com/2013/09/08/storm-first-story-detection/

И поскольку одно изображение - тысяча слов, проверьте изображение ниже:

enter image description herehttp://micvog.files.wordpress.com/2013/08/lsh1.png

Надеюсь, это поможет. @mvogiatzis

Ответ 3

Вот презентация из Стэнфорда, которая это объясняет. Это имело большое значение для меня. Вторая часть больше о LSH, но первая часть также освещает это.

Картинка обзора (на слайдах их гораздо больше):

enter image description here

Поиск в окрестностях соседей в многомерных данных - часть 1: http://www.stanford.edu/class/cs345a/slides/04-highdim.pdf

Поиск в окрестностях соседей в многомерных данных - часть 2: http://www.stanford.edu/class/cs345a/slides/05-LSH.pdf

Ответ 4

  • LSH - это процедура, которая принимает в качестве входных данных набор документов/изображений/объектов и выводит своего рода хэш-таблицу.
  • Показатели этой таблицы содержат документы, такие, что документы, которые находятся на тот же индекс схожими считаются и те, по разным показателям являются "непохожи".
  • Где сходство зависит от метрической системы, а также от порогового сходства s, которое действует как глобальный параметр LSH.
  • Это зависит от вас, чтобы определить, какой порог s соответствует вашей проблеме.

enter image description here

Важно подчеркнуть, что разные меры сходства имеют разные реализации LSH.

В своем блоге я попытался подробно объяснить LSH для случаев minHashing (мера сходства jaccard) и simHashing (мера косинусного расстояния). Я надеюсь, что вы найдете это полезным: https://aerodatablog.wordpress.com/2017/11/29/locality-sensitive-hashing-lsh/

Ответ 5

Я визуальный человек. Вот что работает для меня как интуиция.

Скажите, что каждая вещь, которую вы хотите найти приблизительно, это физические объекты, такие как яблоко, куб, стул.

Моя интуиция для LSH заключается в том, что он похож на отбрасывание теней этих объектов. Например, если вы возьмете тень 3D-куба, вы получите 2D-квадрат на листе бумаги, или 3D-сфера даст вам круговую тень на листе бумаги.

В конце концов, в задаче поиска есть более трех измерений (где каждое слово в тексте может быть одним измерением), но аналогия с тенью все еще очень полезна для меня.

Теперь мы можем эффективно сравнивать строки битов в программном обеспечении. Битовая строка фиксированной длины более или менее похожа на строку в одном измерении.

Таким образом, с помощью LSH я в конечном итоге проецирую тени объектов в виде точек (0 или 1) на одну строку/битовую строку фиксированной длины.

Весь трюк состоит в том, чтобы использовать тени так, чтобы они все еще имели смысл в более низком измерении, например, они достаточно хорошо напоминают исходный объект, который можно распознать.

Двухмерный чертеж куба в перспективе говорит мне, что это куб. Но я не могу легко отличить двухмерный квадрат от трехмерной кубической тени без перспективы: они оба выглядят для меня как квадрат.

То, как я представляю свой объект свету, будет определять, получу ли я хорошо узнаваемую тень или нет. Поэтому я думаю о "хорошем" LSH как о том, что превратит мои объекты перед светом так, чтобы их тень лучше всего узнавалась как представляющая мой объект.

Напомним: я думаю о вещах, которые нужно индексировать с помощью LSH, как о физических объектах, таких как куб, стол или стул, и я проецирую их тени в 2D и, в конечном итоге, вдоль линии (битовая строка). И "хорошая" LSH "функция" - это то, как я представляю свои объекты перед источником света, чтобы получить приблизительно различимую форму в 2D-плоскости, а затем и в моей битовой струне.

Наконец, когда я хочу найти, похож ли мой объект на некоторые объекты, которые я проиндексировал, я беру тени этого объекта "запрос", используя тот же способ, чтобы представить мой объект перед источником света (в конечном итоге получая немного Строка тоже). И теперь я могу сравнить, насколько похожа эта битовая строка со всеми моими другими индексированными битовыми строками, которая является прокси-сервером для поиска моих объектов целиком, если я нашла хороший и узнаваемый способ представить мои объекты моему свету.

Ответ 6

В очень короткий, TL;DR ответ:

Примером хеширования, чувствительного к локальности, может быть сначала произвольно установить плоскости (с вращением и смещением) в пространстве входных данных для хэширования, а затем сбросить точки в хэш в этом пространстве и для каждой измеряемой плоскости, если точка выше или ниже (например, 0 или 1), и ответом является хеш. Таким образом, точки, сходные по пространству, будут иметь аналогичный хэш, если измеряться с косинусным расстоянием до или после.

Вы можете прочитать этот пример, используя scikit-learn: https://github.com/guillaume-chevalier/SGNN-Self-Governing-Neural-Networks-Projection-Layer