Другие журналы

научное издание МГТУ им. Н.Э. Баумана

НАУКА и ОБРАЗОВАНИЕ

Издатель ФГБОУ ВПО "МГТУ им. Н.Э. Баумана". Эл № ФС 77 - 48211.  ISSN 1994-0408

Параллельный алгоритм поиска ближайшей точки в радиусе

# 11, ноябрь 2013
DOI: 10.7463/1113.0624368
Файл статьи: Mogilko_P.pdf (517.27Кб)
автор: Могилко А. А.

УДК 004.93'1

Россия, МГТУ им. Н.Э. Баумана

CMogilko@gmail.com

Введение

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

Такая задача возникает в многих предметных областях. Например, решение этой задачи необходимо в классификации текстов [1], персонализированной агрегации новостей, рекомендательных системах [2], онлайновых системах рекламы [3], семантическом поиске [4].

Однако существуют предметные области, в которых необходимо искать ближайшие точки в замкнутом метрическом пространстве. Одним из таких примеров являются геонауки [5], в которых часто возникает задача глобального поиска близких географических объектов по всему земному шару. При моделировании движения жидкости на основе метода сглаженных частиц наибольшее время на каждом шаге моделирования занимает поиск для каждой частицы всех соседей в радиусе взаимодействия [6]. Объем данных в этих задачах постоянно увеличивается, а ответ нужен мгновенно.

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

Рисунок 1. Поиск ближайших соседей на сфере в радиусе

 

Для запроса , задача поиска ближайшего соседа состоит из поиска одного наиболее близко расположенного элемента из  к точке . Такая задача обозначается .

                     (1.1)

Также существует поиск k ближайших соседей , в данной работе мы рассматриваем случай поиска всех соседей в радиусе от заданной точки .

                    (1.2)

                               (1.3)

Важным ограничением является то, что метрическое пространство может быть замкнутым – для случая поиска на сфере.

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

1                 Алгоритмы поиска ближайших соседей

Среди алгоритмов поиска ближайших соседей можно выделить линейный поиск, поиск в kD-деревьях [8], поиск в BSP-деревьях [9], LS-хеширование [10], метод редких точек [11] и поиск в VP-деревьях [7]. LS-хеширование и метод редких точек основаны на свойствах сложных объектов, в том числе текста, для бинарных данных выигрыша добиться сложно. kD- и BSP-деревья сложно адаптируются для многомерных замкнутых пространств, а линейный поиск заведомо медленный. Поэтому за основу берется поиск в VP-деревьях.

1.1.          Линейный поиск

Линейный поиск, или полный перебор – наиболее простой в реализации алгоритм, который просматривает каждый элемент множества и проверяет, удовлетворяет ли тот заданному условию.

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

Для решения поставленной задачи не приемлем, в силу линейной сложности – O(n) – не лучший алгоритм обработки больших массивов.

1.2.          Поиск в kD-деревьях

kD-дерево или k-мерное дерево – структура данных, служащая для организации точек в k-мерном пространстве. Является частным случаем бинарного дерева поиска. Разбиение пространства происходит по одной из координатных осей так, чтобы точка разбиения была посередине между наиболее удаленными объектами вдоль этой оси. Разбиение происходит рекурсивно с циклическим чередованием координатных осей [3]. Пример карты kD-дерева представлен на рисунке 2.

Рисунок 2. kD-дерево.

 

Алгоритм поиска проходит по дереву и производит поиск только в том листе дерева, чей центр ближе к точке запроса.

Является наиболее простым видом дерева, поиск эффективней линейного. Сложность алгоритма поиска составляет , где k – размерность пространства, что для двухмерного случая будет  [3].

Недостатками данного алгоритма является ситуация «чайник на стадионе», когда при неравномерно распределенных данных большинство листьев дерева пустуют, а обход в заполненных листьях происходит линейным поиском на всем массиве данных. Другим недостатком является повышающаяся сложность в многомерных пространствах и неадаптированность к замкнутым пространствам. В случае замкнутых пространств возможна ситуация, при которой две соседние точки будут в разных листах дерева, из-за их нахождения в начале и в конце координат.

1.3.          Поиск в BSP-деревьях

Этот алгоритм применяется в компьютерной графике для определения приоритетов визуализации объектов. BSP-дерево является методом рекурсивного разбиения пространства на выпуклые множества гиперплоскостями. Каждое разбиение делит пространство на два подмножества, что позволяет построить двоичное дерево.

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

Сложность алгоритма поиска составляет , где k – размерность пространства, что для двухмерного случая будет

1.4.          LS-хэширование

Данный алгоритм основывается на допущении, что можно найти такую хэш-функцию h, что для любых точек p, q и границы R:

Если , то  с вероятностью как минимум P1;

Если , то  с вероятностью не более P2.

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

Недостатком данного алгоритма в нашем случае является невозможность составить настолько простую хэш-функцию для точек с числовыми координатами.

1.5.          Метод редких точек

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

Сложность алгоритма поиска составляет .

1.6.          VP-дерево

VP-деревья, от слов Vantagepoint – опорная точка, основываются на выборе опорной точки и разбиении множества точек на 2 поддерева по принципу среднего расстояния от этой опорной точки до остальных точек множества. Каждый узел дерева имеет центральную точку и радиус, точки находящиеся в котором принадлежат узлу. Пример карты VP-дерева представлен на рисунке 3. Работа с точками происходит только с помощью функции расстояния, алгоритм с отдельными координатами точек не имеет дела, поэтому размерность пространства и его замкнутость не имеют значения [7]. Сложность алгоритма построения дерева – , алгоритма поиска – .

Рисунок 3. VP-дерево.

 

2                 Алгоритм построения VP-дерева

Построение VP-дерева является рекурсивной процедурой, как и большинство алгоритмов построения других видов деревьев. На входе имеется множество точек, для которого необходимо построить дерево. На первой итерации алгоритма все множество разбивается на два поддерева и для каждого поддерева повторяется аналогичная операция.

На каждой итерации построения поддерева необходимо выбрать опорную точку и вычислить среднее расстояние от неё до всех остальных точек. Входное множество точек разбивается на две части, относя точку в множество точек внутреннего (или левого) поддерева, если расстояние от неё до опорной точки меньше среднего, и в множество точек внешнего (или правого) в противном случае. Для каждого множества выполняется рекурсивная операция построения дерева до тех пор, пока размеры множеств не достигнут заданного предела – максимального размера листа [4]. АлгоритмприведенвЛистинге 1.

function Make_vp_tree(S)

if S = 0 then return 0;

new(node);

node.center := Select_vp(S); //выборопорнойточки

node.radius :=

L :=

R :=

node.left = Make_vp_tree(L);

node.right = Make_vp_tree(R);

Листинг 1. Построение VP-дерева.

Если для каждого узла дерева находить опорную точку, которая бы образовала поддерево с половиной точек. Предлагается статистический подход [7]. Выбор опорной точки происходит следующим образом: выберем определенный набор случайных точек множества, это точки-кандидаты в опорные точки. Для каждой точки из этого набора выберем ещё один набор случайных точек. Для каждой точки из первого набора найдем разброс среднего расстояния до всех точек второго набора. Точка из первого набора, имеющая наибольший разброс, будет охватывать наибольшее количество точек во всем множестве. Описанный принцип представлен на Рисунке 4.

 

Рисунок 4. Выбор опорной точки.

 

Точка-кандидат охватит большее количество точек, а следовательно, и половина от них будет ближе к половине всех точек, если разброс расстояния до точек второго набора будет максимальным. Данные шаги изложены в Листинге 2.

functionSelect_vp(S)

P := RandomsampleofS // точки-кандинаты

best_spread := 0

for p

      D := Random sample of S

      mu :=

      //Разброс среднего расстояния от точек-кандидатов

spread :=

      if spread > best_spread

           best_spread := spread; best_p := p;

returnbest_p;

Листинг 2. Выбор опорной точки.

3                 Алгоритм поиска ближайших соседей в VP-дереве

3.1 Исходный алгоритм поиска

Оригинальный алгоритм поиска в VP-дереве [7] предполагает только поиск одного ближайшего соседа. Рассмотрим исходный алгоритм.

Начиная с корневого узла дерева, необходимо находить расстояние до центра узла, и если оно меньше радиуса области узла,  продолжить поиск во внутреннем поддереве, иначе во внешнем. По достижении листа выполнить линейный поиск среди точек листа [4]. Данные шаги представлены в Листинге 3.

function SearchNN(node, s)

if dist(s, node.center) < node.radius

      if node.left is leaf

           LinearSearch(node.left, s);

      else

           SearchNN(node.left, s)

else

      if node.right is leaf

           LinearSearch(node.right, s);

      else

           SearchNN(node.right, s)

Листинг 3. Поиск ближайшего соседа в VP-дереве.

3.2 Модификация алгоритма поиска

Для поиска ближайших соседей в радиусе необходимо модифицировать алгоритм поиска одного соседа. Возможны ситуации, когда искомые точки находятся в нескольких листьях. В таком случае необходимо выявлять факт выхода области поиска из области узла, и если факт подтверждается, то производить поиск в обоих поддеревьях. Данная ситуация изображена на Рисунке 5. Область поиска входит целиком во внутреннее поддерево первого разбиения (красное), но далее искомые точки содержатся уже в обоих поддеревьях.

 

Рисунок 5. Пересечение области поиска и области узла

Чтобы выяснить, входит ли область поиска целиком во внутреннее поддерево, необходимо, чтобы выполнялось условие (3.1).

                                 (3.1)

где d(q,s) – расстояние от центра узла до точки поиска, r – радиус поиска, T – радиус узла, граница внутреннего поддерева.

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

Чтобы выяснить, входит ли область поиска целиком во внешнее поддерево, необходимо выполнение условия (3.2).

                                 (3.2)

Если это условие выполняется, то поиск можно продолжать только во внешнем поддереве. Модифицированный алгоритм представлен в Листинге 4.

function SearchNNR(node, s, r)

if dist(s, node.center) – r < node.radius

      if node.left is leaf

           LinearSearch(node.left, s, r)

      else

           SearchNNR(node.left, s, r)

if dist(s, node.center) + r > node.radius

      if node.right is leaf

           LinearSearch(node.right, s, r);

      else

           SearchNNR(node.right, s, r)

Листинг 4. Поиск ближайших соседей в радиусе в VP-дереве.

4 Использование параллельных вычислений

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

Существуют два типа параллельного взаимодействия: взаимодействие через разделяемую память и через распределенную память.

Взаимодействие через распределенную память

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

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

Взаимодействие через разделяемую память

При таком виде взаимодействия программа делится на потоки, взаимодействующие между собой с помощью объектов синхронизации – семафоров, мьютексов, мониторов. Потоки исполняются в одном пространстве памяти и могут легко создаваться на лету или браться из пула потоков.

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

5 Параллельный алгоритм построения VP-дерева

В алгоритме построения VP-дерева рекурсия разветвляется надвое всегда, и каждая ветка рекурсии не зависит от соседней ей, а также не вносит никаких изменений в данные, полученные на предыдущем шаге рекурсии, наилучшим решением будет выполнение новых двух веток рекурсии параллельно, что отражено в Листинге 5.

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

Также необходимо следить за числом потоков и ограничить их количество максимальным число процессоров, иначе накладные расходы на диспетчеризацию будут возрастать, а число одновременно исполняемых потоков – нет. При достижении максимального числа потоков необходимо выполнять обе ветки рекурсии последовательно.

function Make_vp_tree(S)

     if S = 0 then return 0;

     new(node);

     node.center := Select_vp(S);

     node.radius :=

     L :=

     R :=

     if (threadCount > threadsMax)

           node.left = Make_vp_tree(L);

           node.right = Make_vp_tree(R);

     else

           threadCount += 1;

           Parallel

           {

                node.left = Make_vp_tree(L);

                node.right = Make_vp_tree(R);

           }

           threadCount -= 1;

Листинг 5. Параллельное построение VP-дерева.

6                 Параллельный алгоритм поиска в VP-дереве

В алгоритме поиска в VP-дереве рекурсия разветвляется надвое при необходимости поиска в обоих поддеревьях, при этом каждая ветка рекурсии зависит от других только по добавлению точек в массив результатов. Лучшим решением будет выполнение новых двух веток рекурсии параллельно, что отражено в Листинге 6.

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

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

function Search(node, s, r, id)

     sleft := dist(s, node.center) – r < node.radius;

     sright := dist(s, node.center) + r > node.radius;

     if ((sleft OR sright) AND NOT (sleft = sright)

                     AND (threadCount < threadsMax))

           if (sleft)

                if node.left is leaf

                     LinearSearch(node.left, s, r, id);

                else

                     Search(node.left, s, r, id)

           else

                if node.right is leaf

                     LinearSearch(node.right, s, r, id);

                else

                     Search(node.right, s, r, id)

     else

           threadCount += 1;

           Parallel sections

           {

                Section

                {

                     if node.left is leaf

                           LinearSearch(node.left, s, r, id);

                     else

                           Search(node.left, s, r, id);

                }

                Section

                {

                     if node.right is leaf

                           LinearSearch(node.right, s, r,newid);

                     else

                           Search(node.right, s, r, newid);

                }

           }

           threadCount -= 1;

Листинг 6. Параллельный поиск в VP-дереве.

7                 Эксперименты по оценке производительности алгоритмов поиска

Для проведения экспериментов были сгенерированы случайные массивы точек размерами 10 000 000 точек в двухмерном евклидовом пространстве. Генерация производилась с равномерным распределением с диапазоном значения координат ([0; 10], [0; 10]) для случая на плоскости и ([0; ], []) для случая на сфере, соответственно. Для случая на плоскости функцией расстояния является формула (7.1), для случая на сфере – (7.2).

                                                                 (7.1)

   (7.2)

На рисунках 6 – 7 представлены графики производительности линейного поиска и поиска в VP-дереве (в параллельной и последовательной версиях), на оси абсцисс представлен объем выдачи поиска – число точек, удовлетворяющих условию запроса. На оси ординат представлено относительное ускорение времени поиска по отношению к времени линейного поиска на одном процессоре.

Рисунок 6. Сравнительный график производительности поиска на плоскости для 10 000 000 точек.

 

Рисунок 7. Сравнительной график производительности поиска на сфере для 10 000 000 точек.

 

Как видно из графиков, использование параллельного алгоритма поиска в  VP-дереве позволяет получить ускорение до 15 раз по сравнению с линейным поиском. Наиболее успешные результаты поиск в VP-дереве получает на точных запросах, когда объем результатов мал относительно всего массива данных (левее на графике). Если запрос неточен и радиус поиска велик, то проход осуществляется по большей части дерева (правее на графике), приближая поиск к линейному поиску с дополнительными расходами на сам обход дерева.

Также следует отметить отсутствие существенных отличий в поиске на плоскости и на сфере, небольшая разница во времени поиска может возникать только в случае использования сложной функции расстояния между точками.

На рисунке 8 представлен график сравнения времени построения VP-дерева на одном и четырех процессорах, показано, что использование параллельных вычислений позволяет значительно ускорить время построения дерева.

 

Рисунок 8. Сравнение времени построения VP-дерева.

8 Эффективность распараллеливания

Для замеров использовался компьютер с процессором IntelCorei7, имеющий 4 ядра. Объем выборки составлял 10 млн. точек. Показателями успешного распараллеливания программ являются ускорение (8.1) и эффективность (8.2), представленные на рисунках 9 и 10, соответственно. Ускорение- это отношение времени выполнения на одном процессоре к времени на p процессорах. Эффективность – ускорение, деленное на количество процессоров.

                                                           (8.1)

,                                                         (8.2)

где T1 – время выполнения на одном процессоре,

Tp – время выполнения на p процессорах.

Рисунок 9. Ускорение распараллеливания алгоритма построения и поиска в VP-дереве

 

Рисунок 10. Эффективность распараллеливания алгоритма построения и поиска в VP-дереве

 

Линейное падение эффективности вызвано блокировками на добавление результатов в массив, а так же тем, что какое-то время остальные процессоры простаивают, пока обход не пойдёт по разным веткам дерева.

Заключение

               Описан алгоритм поиска ближайших соседей в радиусе с использованием VP-деревьев. Разработана параллельная версия алгоритма на разделяемой памяти. Показана эффективность и ускорение распараллеливания на четырех процессорах 65% и 2.6, соответственно. Показано ускорение относительно линейного поиска на одном процессоре до 15 раз.

Список литературы

1.               Агеев М.С., Добров Б.В. Метод эффективного расчета матрицы ближайших соседей для полнотекстовых документов // Вестник Санкт-Петербургского университета. Сер. 10. Прикладная математика. Информатика. Процессы управления. 2011. № 3. С. 72-84.

2.               Кольчугина Е.А., Макарь В.А. Метод коллаборативной фильтрации для масштабируемых рекомендательных систем // Современные научные исследования и инновации. 2012. № 6. Режим доступа: http://web.snauka.ru/issues/2012/06/14316 (дата обращения 01.10.2013).

3.               Vikash Kumar Singh. Role of Search Engine Optimization in Web Technology for Commercialization Rationale by Vikash Kumar Singh // International Journal of Creative Research Thoughts. 2013. Vol. 1, no. 2. Режим доступа: http://ijcrt.com/UploadedArticle/12.pdf  (дата обращения 01.10.2013).

4.               Fanizzi N., d’Amato C., Esposito F. Semantic Nearest Neighbor Search in OWL Ontologies. Dipartimento di Informatica, Universit`a degli studi di Bari Campus Universitario, Italy. Режим доступа: http://ftp.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-314/38.pdf  (дата обращения 23.09.2013).

5.               Vaca-Castano G., ZamirA.R., Shah M. City Scale Geo-Spatial Trajectory Estimation of a Moving Camera. Computer Vision Lab, University of Central Florida, 2012. Режимдоступа: http://www.cs.ucf.edu/~aroshan/index_files/CVPR12_Amir.pdf   (датаобращения 23.09.2013).

6.               Гусев Д.И. Алгоритм поиска ближайших соседей // Программные продукты и системы. 2012. № 3. С. 231-234. Режим доступа:  http://www.swsys.ru/index.php?page=article&id=3249 (дата обращения 23.09.2013).

7.               Yianilos P.N. Data Structures and Algorithms for Nearest Neighbor Search in General Metric Spaces. Режим доступа: http://www.cs.iastate.edu/~honavar/nndatastructures.pdf  (дата обращения 23.09.2013).

8.               Panigrahy R. An Improved Algorithm Finding Nearest Neighbor Using Kd-trees. Microsoft Research, Mountain View CA, USA, 2008. Режимдоступа: http://theory.stanford.edu/~rinap/papers/kdtreelatin.pdf   (датаобращения 23.09.2013).

9.               Maneewongvatana S., Mount D.M. An Empirical Study of a New Approach to Nearest Neighbor Searching. Department of Computer Science, University of Maryland, Maryland. Режимдоступа:http://www.cs.umd.edu/~mount/Papers/alenex01-empir.pdf (датаобращения 23.09.2013).

10.            Jia Pan, Dinesh Manocha. Fast GPU-based Locality Sensitive Hashing for K-Nearest Neighbor Computation. Department of Computer Science, UNC Chapel Hill, 2011. Режимдоступа: http://gamma.cs.unc.edu/KNN/gpuknn.pdf  (датаобращения 23.09.2013).

11.            Tao Y., Sheng C. Fast Nearest Neighbor Search with Keywords. Режим доступа: http://www.cse.cuhk.edu.hk/~taoyf/paper/tkde13-spakey.pdf (дата обращения 23.09.2013).

Поделиться:
 
ПОИСК
 
elibrary crossref ulrichsweb neicon rusycon
 
ЮБИЛЕИ
ФОТОРЕПОРТАЖИ
 
СОБЫТИЯ
 
НОВОСТНАЯ ЛЕНТА



Авторы
Пресс-релизы
Библиотека
Конференции
Выставки
О проекте
Rambler's Top100
Телефон: +7 (915) 336-07-65 (строго: среда; пятница c 11-00 до 17-00)
  RSS
© 2003-2017 «Наука и образование»
Перепечатка материалов журнала без согласования с редакцией запрещена
 Тел.: +7 (915) 336-07-65 (строго: среда; пятница c 11-00 до 17-00)