Поиск единственного ближайшего соседа с использованием префиксного дерева в O (1)?

Я читаю статью, в которой упоминается, что они смогли найти единственного ближайшего соседа в O (1), используя префиксное дерево. Я опишу общую проблему, а затем классическое решение и, наконец, предлагаемое решение в статье:

Проблема: учитывая список битовых векторов L (все векторы имеют одинаковую длину) и битовый вектор запроса q, мы хотели бы найти ближайшего соседа q. Метрика расстояния - это расстояние Хэмминга (сколько бит различается). Наивный подход заключался бы в том, чтобы просмотреть список и вычислить расстояние Хэмминга между каждым вектором в списке и q, что займет O (N). Однако, учитывая, что у нас будет миллионы битовых векторов, это очень дорого, поэтому мы хотели бы сократить это количество.

Классическое решение: классическое решение этой проблемы заключается в использовании приближения для поиска ближайшего соседа и достижения O (logN). Для этого сначала нужно отсортировать L лексикографически, чтобы похожие битовые векторы были близки друг к другу. Затем, учитывая q, мы применяем двоичный поиск в отсортированном списке, чтобы получить позицию, где q может быть в отсортированном списке, и берем векторы над ним и под ним в списке (поскольку они похожи из-за сортировки) и вычисляем расстояние между ними и выберите тот, у которого наименьшее расстояние. Однако, просто выполняя одну сортировку, мы все равно пропустим много похожих векторов, поэтому, чтобы охватить как можно больше похожих векторов, мы используем P количество списков и P количество смешанных функций. Каждому списку соответствует каждая функция перехода. Затем мы вставляем каждый битовый вектор в каждый список в P после смешивания его битов с соответствующей функцией смешивания. Таким образом, мы получаем P списков, каждый из которых имеет битовые векторы, но с разным порядком битов. Мы снова отсортируем каждый список в P лексикографически. Теперь, учитывая q, мы применяем тот же двоичный поиск для каждого списка в P, но здесь мы перед этим применяем функцию перемешивания к q в соответствии с тем, к какому списку мы обращаемся. На этом шаге мы получаем число P векторов, наиболее похожих на q, поэтому мы, наконец, получаем один, наиболее похожий на q. Таким образом мы охватываем как можно больше похожих векторов. При игнорировании времени, необходимого для сортировки, время, необходимое для обнаружения ближайшего соседа, равно O (log n), что является временем двоичного поиска в каждом списке.

Предлагаемое решение: в этом решении, предложенном в статье (но без каких-либо объяснений), говорится, что мы можем получить ближайшего соседа за время O (1), используя префиксные деревья. В документе они сказали, что они используют P число префиксных деревьев и P число функций перемешивания, где каждая функция перемешивания соответствует каждому дереву. Затем они вставляют битовые векторы в каждое дерево после перемешивания битов каждого вектора с соответствующей функцией перемешивания. Для данного q мы применяем функцию перехода к q, соответствующему каждому дереву, и извлекаем наиболее похожий на q вектор из каждого дерева. Теперь мы получаем P-битовые векторы, извлеченные из деревьев. В статье говорится, что просто получение вектора, наиболее похожего на q из префиксного дерева, составляет O (1). Я действительно этого совсем не понимаю, так как знаю, что дерево префиксов поиска - это O (M), где M - длина битового вектора. Кто-нибудь понимает, почему это O (1)?

Это статья, о которой я говорю (Раздел 3.3.2): Content-Based Crowd Retrieval on the Real-Time Web

http://students.cse.tamu.edu/kykamath/papers/cikm2012/fp105-kamath.pdf

Я также хотел бы, чтобы вы ответили на мой другой вопрос, связанный с этим: Как найти наиболее похожий битовый вектор в префиксном дереве для NN-поиска?


person Jack Twain    schedule 24.06.2013    source источник


Ответы (3)


Я думаю, что аргумент в статье заключается в том, что если бы это было O (f (x)), то x должно было бы быть количеством элементов, хранящихся в дереве, а не количеством измерений. Как вы указываете, для дерева префиксов время увеличивается как O (M), где M - длина битового вектора, но если вы считаете, что M фиксировано, и вас интересует поведение как количество элементов в дерево увеличивается, у вас есть O (1).

Кстати, в статье Муджи и Лоу «Быстрые приблизительные ближайшие соседи с автоматической конфигурацией алгоритма» также рассматриваются древовидные конкуренты LSH. Идея здесь, по-видимому, состоит в том, чтобы рандомизировать построение дерева, создать несколько деревьев и выполнить быстрый, но отрывочный поиск каждого дерева, выбирая лучший ответ, найденный в любом дереве.

person mcdowella    schedule 24.06.2013
comment
Также вы рекомендуете использовать технику по упомянутой вами бумаге? & Почему? - person Jack Twain; 24.06.2013
comment
Не могли бы вы объяснить мне, как получить одинаковый вектор из каждого дерева? Найти, существует ли ключ в дереве, несложно, но найти наиболее похожий я не могу вообще понять. stackoverflow.com/questions/17282902/ - person Jack Twain; 25.06.2013
comment
В разделе 3.2 статьи описывается, как они получают похожие векторы - это немного напоминает A *, если вы с ним знакомы. Начните сверху и несколько раз извлекайте лучший узел из очереди с приоритетом, просматривайте его и помещайте его потомки в очередь. Приоритет зависит от того, насколько близко узел к цели, поэтому вы сначала исследуете ближайшие узлы. С несколькими деревьями используйте общую очередь, чтобы в первую очередь исследовать наиболее перспективные деревья. Остановитесь после выполнения фиксированного объема работы, при этом фиксированный объем является одним из многих параметров, настроенных на тестовых данных. - person mcdowella; 25.06.2013
comment
Я бы рекомендовал использовать существующую библиотеку, такую ​​как cs.umd.edu/~mount/ANN и изменение только после того, как все заработало, и если вы знали из профилирования, что изменение может привести к значительному улучшению. (Но я подумал, что это интересная статья) - person mcdowella; 25.06.2013
comment
На самом деле я имел в виду статью, на которую ссылаюсь в вопросе, а не упомянутую вами статью :). Поскольку они вообще не объясняют, как они получают похожие векторы. Я надеялся, что вы объясните мне, как получить аналогичные векторы их способом. Я полностью застрял! - person Jack Twain; 25.06.2013
comment
Я думаю, что они просто работают вниз по дереву префиксов от верхнего ветвления, чтобы следовать за целевым вектором, если они могут - эвристическая процедура, которая не гарантирует наилучшего совпадения. Это соответствует разделу 3.2.2, где они говорят, что повторяют это так называемое ближайшее совпадение для разных перестановок битов, и это примерно так же схематично, как и процедура, более подробно описанная в разделе 3 их справочника [23], который просто рассматривает ближайший B элементов к цели в отсортированном списке - это бумага Рандомизированные алгоритмы и nlp: использование хеш-функции с учетом местоположения для высокоскоростной кластеризации существительных - person mcdowella; 26.06.2013

Это O(1) только в очень неопределенном смысле. Фактически, я бы пошел еще дальше, чтобы оспорить их использование в этом случае.

Из их статьи, Чтобы определить ближайшего соседа к пользователю, u.

  1. «Сначала мы вычисляем его подпись, u»: может быть O(1) в зависимости от «подписи»
  2. "Тогда для каждого префиксного дерева в P": Ой, звучит не очень O(1), O(P) было бы более правильным.
  3. итерационная часть из 2. "... мы находим ближайшую сигнатуру в дереве префиксов, выполняя итерацию по дереву по одному уровню за раз ...": в лучшем случае O(d), где d - глубина дерево или длина слова. (это щедро, так как найти ближайшую точку в префиксном дереве может быть больше, чем это)
  4. «После этого ... мы получаем |P| подписей ... из которых выбирается наименьшее расстояние Хэмминга»: так что еще P вычислений умножают на длину слова. O(Pd).

Точнее, общее время выполнения O(1) + O(P)+ O(Pd) + O(Pd) = O(Pd)

Я считаю, что @mcdowella прав в своем анализе того, как они пытаются сделать это O(1), но судя по тому, что я читал, они меня не убедили.

person greedybuddha    schedule 24.06.2013
comment
не могли бы вы также ответить на другой вопрос, связанный с этим? stackoverflow.com/questions/17282902/ - person Jack Twain; 25.06.2013

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

person Peter Lawrey    schedule 24.06.2013