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