Реализация Minhash, как найти хеш-функции для перестановок

У меня проблема с реализацией minhashing. На бумаге и после прочтения я понимаю концепцию, но моя проблема заключается в "фокусе" перестановки. Вместо того, чтобы переставлять матрицу множеств и значений, предложение для реализации: "выбрать k (например, 100) независимых хеш-функций", а затем алгоритм говорит:

for each row r 
    for each column c 
        if c has 1 in row r 
           for each hash function h_i  do
            if h_i(r) is a smaller value than M (i, c) then
            M(i, c) := h_i(r)

В разных небольших примерах и учебниках они используют только две или три хеш-функции в виде (h = a*x + b mod p). Это легко найти, но как это сделать на практике, как я могу найти 100 таких независимых функций.

В примере Java здесь генерируются хеш-значения только из одной хеш-функции вместо нескольких хеш-функций, независимо от индекса строки. В чем разница? Теперь у меня вопрос, как найти эти независимые хеш-функции или, если есть подход только с одной хеш-функцией, как обрабатывать эти значения в алгоритме?

2 ответа

Одним простым способом является использование параметрического семейства хэшей, такого как функции хэширования таблиц ( http://en.wikipedia.org/wiki/Tabulation_hashing)

В примере книги (a*x+b mod p), выбрав разные наборы (a, b, p), вы можете иметь разные хеш-функции. Один из способов иметь независимые хеш-функции - это выбрать (a, b, p) простое / взаимно простое число и предпочтительно большие числа

Согласно ответу iampat, вы можете использовать хэширование таблиц ( http://en.wikipedia.org/wiki/Tabulation_hashing).

Другой очень эффективный вариант, который дает хорошие результаты, - это использовать одну хэш-функцию хорошего качества (например, FNV_1a) для создания главного хэша, а затем изменить его, используя 100 различных комбинаций XOR и битролла.

Чтобы сгенерировать каждый хеш, вы берете главный хеш, разбиваете его на заданное расстояние, затем XOR с заданным значением. Значения bitroll и XOR выбираются случайным образом для каждой из 100 хеш-функций. Смотрите это обсуждение для получения дополнительной информации.

Некоторые люди рекомендуют умножение вместо XOR, в этом случае вы можете выбрать простые числа.

Другие вопросы по тегам