Усиление локально-чувствительного хэша

10

Я пытаюсь создать хеш, чувствительный к косинусной местности, чтобы найти подходящие пары элементов без необходимости сравнивать каждую возможную пару. У меня это в основном работает, но большинство пар в моих данных, похоже, имеют косинусное сходство в диапазоне от -0,2 до +0,2, поэтому я пытаюсь нарезать кубики довольно точно и выбирать вещи с косинусным сходством 0,1 и выше.

Я читал главу 3 «Mining Massive Datasets». В ней рассказывается об увеличении точности выбора пары кандидатов путем усиления семейно-чувствительного семейства. Я думаю, что почти понимаю математическое объяснение, но я изо всех сил пытаюсь увидеть, как я реализую это практически.

То, что я до сих пор, заключается в следующем

  1. Я сказал 1000 фильмов каждый с оценками от некоторого выбора 1M пользователей. Каждый фильм представлен разреженным вектором оценок пользователя (номер строки = идентификатор пользователя, значение = оценка пользователя)
  2. Я строю N случайных векторов. Длина вектора соответствует длине векторов фильма (то есть количеству пользователей). Значения вектора: +1 или -1. Я фактически кодирую эти векторы как двоичные, чтобы сэкономить пространство, с +1, сопоставленным с 1 и -1, сопоставленным с 0
  3. Я строю векторы эскиза для каждого фильма, беря скалярное произведение фильма и каждый из N случайных векторов (точнее, если я создаю матрицу R, кладя N случайных векторов по горизонтали и накладывая их друг на друга, то на эскиз для фильма m - R * m), затем берется знак каждого элемента в результирующем векторе, поэтому я заканчиваю вектором эскиза для каждого фильма с +1 и -1, который снова кодирую как двоичный. Каждый вектор имеет длину N битов.
  4. Далее я ищу похожие наброски, выполняя следующие
    1. Я разделил вектор эскиза на b полос r бит
    2. Каждая полоса из r битов является числом. Я объединяю это число с номером группы и добавляю фильм в корзину для хэша под этим номером. Каждый фильм может быть добавлен в более чем одно ведро.
    3. Я тогда смотрю в каждом ведре. Любые фильмы, которые находятся в одном ведре, являются кандидатами в пары.

Сравнивая это с 3.6.3 ммдс, мой шаг И - когда я смотрю на полосы r битов - пара фильмов проходит шаг И, если r биты имеют одинаковое значение. Мой шаг ИЛИ происходит в сегментах: фильмы - это пары-кандидаты, если они оба находятся в любом из сегментов.

Книга предполагает, что я могу «усилить» свои результаты, добавив больше шагов «И» и «ИЛИ», но я не знаю, как это сделать практически, поскольку объяснение процесса построения для последующих слоев заключается в проверке парного равенства, а не в придумывая номера ведра.

Может кто-нибудь помочь мне понять, как это сделать?

Филип Перл
источник

Ответы:

4

Я думаю, что я что-то придумал. По сути, я ищу подход, который работает в среде отображения / сокращения типов, и я думаю, что этот подход делает это.

Так,

  • Предположим, у меня есть b полос из r строк, и я хочу добавить еще одну стадию AND, скажем, еще одну c AND.
  • поэтому вместо битов b * r мне нужны хеши битов b * r * c
  • и я запускаю свою предыдущую процедуру c раз, каждый раз на b * r битах
  • Если x и y найдены в качестве пары-кандидата в результате какой-либо из этих процедур, она испускает пару ключ-значение ((x, y), 1) с набором идентификаторов (x, y) в качестве ключа и значением 1.
  • В конце процедуры c я группирую эти пары по ключу и сумме.
  • Любая пара (x, y) с суммой, равной c, была парой-кандидатом в каждом из раундов c, как и пара-кандидат всей процедуры.

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

Филип Перл
источник
0

h(x,v)={0if sgn(xv)<01else
vh(x,i)=(h(x,vi+1),...,h(x,vi+r))h(x,j)=f(h(x,rj),j)
h(x,y)={1if h(x,j)=h(y,j) for any j[0,b)0else
ч : S S ' S ' ч " ( х , J ) J J у vh(x,y)h^:SSS, но это также может привести к ложным срабатываниям и / или отрицаниям. Одной из идей для хэша является минимум для всех (или минимум для всех и всех прямо и косвенно связанных ). И то и другое явно внесло бы предвзятость. Я мог бы попробовать один из них, хотя я не уверен, что хэши одного случайного И / ИЛИ будут иметь смысл в следующий раз. Но, учитывая равномерное распределение случайных и большое количество повторений, может быть?h(x,j)jjyv
deasmhumnha
источник