Уровень алгоритма

Участник:Dadrik/Плотностный алгоритм кластеризации: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
 
(не показано 138 промежуточных версий 6 участников)
Строка 1: Строка 1:
 +
{{Assignment|Sleo|Dexter}}
 +
 
{{algorithm
 
{{algorithm
 
| name              = Плотностный алгоритм кластеризации DBSCAN
 
| name              = Плотностный алгоритм кластеризации DBSCAN
| serial_complexity = <math>-</math>
+
| serial_complexity = <math>O(n \log n)</math>
| pf_height        = <math>-</math>
+
| input_data        = <math>n</math>
| pf_width          = <math>-</math>
+
| output_data      = <math>n</math>
| input_data        = <math>-</math>
 
| output_data      = <math>-</math>
 
 
}}
 
}}
  
Авторы описания: [[Участник:Dadrik | Вашуров И.М.]], Шемякин Р.О.
 
  
= Свойства и структура алгоритмов =
+
Авторы описания: [[Участник:Dadrik | Вашуров И.М.]], [[Участник:ramon93i7 | Шемякин Р.О.]]
 +
 
 +
= Свойства и структура алгоритма =
  
 
== Общее описание алгоритма ==
 
== Общее описание алгоритма ==
 +
 +
Задача кластеризации - это задача разбиения заданной входной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались.
 +
 +
Алгоритм DBSCAN (Density-based spatial clustering of applications with noise)<ref>Ester, Martin, et al. "A density-based algorithm for discovering clusters in large spatial databases with noise." Kdd. Vol. 96. No. 34. 1996.</ref> был предложен Мартином Эстер, Гансом-Питером Кригель и коллегами в 1996 году как решение задачи кластеризации с кластерами произвольной формы. DBSCAN является непараметрическим плотностным алгоритмом кластеризации: для заданного набора точек в некотором пространстве, алгоритм группирует те точки, которые расположены достаточно близко друг к другу (точки с большим количеством соседей), и помечает как выбросы те, что располагаются далеко от ближайших соседей.
 +
 +
Близость в алгоритме определяется заданной в пространстве метрикой. Наиболее часто в качестве метрики используют Евклидово расстояние, квадрат Евклидова расстояния, манхэттенскую метрику, расстояние Чебышева или степенное расстояние.
 +
 +
Данный алгоритм кластеризации отличается от остальных тем, что не требует знаний о количестве кластеров, может определять кластеры произвольной формы, а также устойчив к шуму и выбросам.
  
 
== Математическое описание алгоритма ==
 
== Математическое описание алгоритма ==
 +
Вход алгоритма: множество точек <math>X</math> из <math>n</math>-мерного пространства, на котором определена функция расстояния <math>D</math>.
 +
 +
Выход алгоритма: размеченное множество точек <math>X</math>, в котором каждой точке соответствует номер ее кластера.
  
Исходные данные: объекты, которые нужно кластеризовать, параметры <math>MinPts, \  \varepsilon</math> . Между объектами можно считать расстояния.
+
Параметры алгоритма:  
 +
* <math>\varepsilon</math> - максимальное расстояние между соседями;
 +
* <math>MinPts</math> - минимальное количество соседей для создания области связности.
  
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.
 
  
Для построения оценки плотности, на основе соседства точек вводятся понятия
+
=== Определения ===
достижимости и связности. Под <math>\varepsilon </math> -соседями точки <math>x \in X</math> понимается множество точек, расстояние до которых не превышает <math>\varepsilon </math>, т. е. <math>N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}</math>. Тогда точка <math>y</math> достижима из точки <math>x</math>, если существует последовательность точек <math>x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y</math>, для которой выполнено:
 
:<math>
 
  \begin{align}
 
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\
 
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1
 
  \end{align}
 
</math>
 
  
Здесь значение <math>MinPts</math> задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее <math>MinPts \   \varepsilon</math> -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее <math>MinPts \   \varepsilon </math> -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.
+
[[File:Cluster_scheme.png|thumb|right|400px| Рис. 1. [https://upload.wikimedia.org/wikipedia/commons/a/af/DBSCAN-Illustration.svg] Здесь ''MinPts'' = 4. Точка ''A'' и другие красные точки - ядровые и образуют единый кластер, так как достижимы друг из друга. Точки ''B'' и ''C'' не являются ядровыми, но достижимы из ''A'', а значит также принадлежат кластеру. Точка ''N'' - не достижима из других точек и является шумом.]]
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества <math>X</math> . Точки, не попавшие в какой-либо кластер (не принадлежащие <math>\varepsilon</math> -окрестности какого-либо «ядра»), относятся к классу «шум».
+
 
 +
Все заданные точки классифицируются на три группы:
 +
 
 +
* ''ядровые точки'': точка <math>p</math> является ядровой, если количество <math>\varepsilon</math>-соседей, включая саму точку <math>p</math>, не меньше <math>MinPts</math>. Под ''<math>\varepsilon</math>-соседями'' точки <math>p \in X</math> понимается множество точек, расстояние до которых не превышает <math>\varepsilon</math>, т.е. <math>N_\varepsilon(p) = \{ x \in X | D(p, x) \le \varepsilon \}</math>. Эти точки являются напрямую достижимыми из <math>p</math>;
 +
 
 +
* ''достижимые точки'': точка <math>q</math> достижима из <math>p</math>, если  существует путь <math>p_1, \dots, p_n</math>, где <math>p_1 = p</math> и <math>p_n = q</math>, для которого выполнено:
 +
:<math>\begin{align}
 +
p_{i + 1} \in N_\varepsilon(p_i),  i = 1, \dots, n-1 \\
 +
| N_\varepsilon(p_{i}) | \ge MinPts, i = 1, \dots, n-1 \\
 +
\end{align}</math>
 +
 
 +
* ''шум'' (выбросы): все точки, недостижимые из какой-либо другой точки считаются шумом (выбросом).
 +
 
 +
Так, если <math>p</math> - ядровая точка, то она образует кластер вместе со всеми точками, достижимыми из неё. Каждый кластер содержит по крайней мере одну ядровую точку; неядровые точки могут быть частью кластера, образуя при этом его "границу", так как они не могут быть использованы для достижения других точек.
 +
 
 +
 
 +
Достижимость не является симметричным отношением, так как по определению никакая точка не может быть достижима из неядровой точки, независимо от расстояния. Поэтому в DBSCAN применяется следующий термин ''связности'': две точки <math>p</math> и <math>q</math> связанны, если существует такая точка <math>o</math>, что <math>p</math> и <math>q</math> достижимы из <math>o</math>. Такое отношение связности симметрично.
 +
 
 +
 
 +
''Кластер'' в таком случае определяется двумя свойствами:
 +
* Все точки внутри кластера взаимно связанны;
 +
* Если точка достижима из любой точки кластера, она также является частью кластера.
 +
 
 +
=== Шаги алгоритма ===
 +
 
 +
#Выбирается произвольная непосещенная точка <math>p</math>.
 +
#Точка <math>p</math> помечается как посещенная.
 +
#У точки <math>p</math> определяется множество её <math>\varepsilon</math>-соседей - <math>N_\varepsilon(p)</math>.
 +
#*Если точка <math>p</math> оказалась ядровой - <math>| N_\varepsilon(p) | \ \ge MinPts</math>, то:
 +
#**она становится началом нового кластера или сохраняет номер кластера, который был ей присвоен ранее;
 +
#**все точки из <math>N_\varepsilon(p)</math> добавляются в её кластер;
 +
#**процесс продолжается рекурсивно для каждой новой добавленной непосещенной точки <math>p' \in N_\varepsilon(p)</math> c шага 2 (в качестве новой <math>p</math>).
 +
#*Если точка <math>p</math> оказалась не ядровой, то <math>p</math> объявляется шумом. Алгоритм продолжается с шага 4.
 +
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.
  
 
== Вычислительное ядро алгоритма ==
 
== Вычислительное ядро алгоритма ==
  
== Макроструктура алгоритма ==
+
Вычислительным ядром алгоритма является нахождение <math>\varepsilon</math>-соседей каждой точки входного множества <math>X</math>.  
Алгоритм DBSCAN использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или k-d дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами <math>\rho(u,v)</math>, в, это расстояние можно вводить разными способами. Например, если <math>\rho(u,v)</math> - метрика в евклидовом пространстве, <math>u=(u_1,...,u_n)</math> и <math>(v_1,...,v_n)</math>, то расстояние вычисляется следующим образом: <math>\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}</math>
+
 
 +
Для решения этой задачи требуется найти расстояния между любыми двумя точками множества <math>X</math> по заданной метрике. Например, если используется расстояние Минковского порядка <math>k</math>, то расстояние между точками <math>p=(p_1,...,p_n) \in X</math> и <math>q=(q_1,...,q_n) \in X</math> вычисляется как <math>D(p, q) = (\sum_{i = 1}^{n}|p_i - q_i|^k)^{1 / k}</math>, частным случаем которой при <math>k = 2</math> является широко распространённая евклидова метрика <math>D(p, q) = \sqrt{\sum_{i = 1}^{n} (p_i - q_i)^2}</math>.
 +
 
 +
== Макроструктура алгоритма ==
 +
 
 +
Как записано и в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]], основную часть метода составляют вызовы функции <math>request\_neighbours</math> получения <math>\varepsilon</math>-соседей и нахождение расстояний между точками множества <math>X</math>.
 +
 
 
== Схема реализации последовательного алгоритма ==
 
== Схема реализации последовательного алгоритма ==
 +
 +
 +
<math>DBSCAN</math> проходит через все точки множества <math>X</math> и определяет, являются ли они шумом или началом нового кластера.
 +
В последнем случае новому кластеру присваивается уникальный номер и вызывается функция расширения кластера.
 +
 +
<math>DBSCAN(\varepsilon, MinPts)</math>
 +
  <math>C = 0</math>
 +
  for <math>\forall p \in X</math>
 +
      if <math>p</math> is visited then
 +
        continue
 +
      mark <math>p</math> as visited
 +
      <math>neighbours</math> = <math>request\_neighbours(p, \varepsilon)</math>
 +
      if <math>| neighbours | < MinPts</math> then
 +
        mark <math>p</math> as <math>NOISE</math>
 +
      else
 +
        <math>C = next\_cluster</math>
 +
        <math>expand\_cluster(p, neighbours, C, \varepsilon, MinPts)</math>
 +
 +
<math>expand\_cluster</math> рекурсивно проходит через все точки множества <math>neighbours</math> - соседей точки <math>p</math>,
 +
и определяет, принадлежат ли эти точки тому же кластеру <math>C</math>, тем самым расширяя этот кластер.
 +
 +
<math>expand\_cluster(p, neighbours, C, \varepsilon, MinPts)</math>
 +
  add <math>p</math> to cluster <math>C</math>
 +
  for <math>\forall p' \in neighbours</math>
 +
      if <math>p'</math> is not visited
 +
        mark <math>p'</math> as visited
 +
        <math>neighbours'</math> = <math>request\_neighbours(p, \varepsilon)</math>
 +
        if <math>| neighbours' | \ \ge MinPts</math>
 +
            <math>neighbours</math> = <math>neighbours \cup neighbours'</math> 
 +
      if <math>p'</math> is not yet member of any cluster
 +
        add <math>p'</math> to cluster <math>C</math>
 +
 +
<math>request\_neighbours</math> возвращает для точки <math>p</math> множество всех её <math>\varepsilon</math>-соседей,
 +
используя функцию расстояния <math>D</math>
 +
<math>request\_neighbours(p, \varepsilon)</math>
 +
    return <math>\{ p' \ | \ \forall p' \in X: D(p, p') < \varepsilon \}</math>
  
 
== Последовательная сложность алгоритма ==
 
== Последовательная сложность алгоритма ==
Для того, чтобы алгоритм мог кластеризовать все объекты, необходимо пройти по каждому из них хотя бы один раз. Если использовать специальную пространственную структуру данных для определения соседних объектов со сложностью <math>O(n)</math>, то сложность алгоритма <math>O(nlogn)</math>. Если не использовать пространственную структуру, то в худшем случае алгоритм будет иметь сложность <math>O(n^2)</math>, так как придется считать полную матрицу расстояний между объектами.
+
 
 +
DBSCAN проходит через каждую точку входного множества, возможно, по несколько раз. Временная сложность зависит в большей степени от вызова функции <math>request\_neighbours</math> (нахождение <math>\varepsilon</math>-соседей для заданной точки). Эта функция вызывается ровно один раз для каждой точки множества <math>X</math>.
 +
 
 +
Если использовать индексированную структуру данных (например, R-деревья), выполняющую операцию <math>request\_neighbours</math> за <math>O(\log n)</math>, то суммарная сложность алгоритма в среднем составит <math>O(n \log n)</math>, с учётом хорошо подобранного параметра <math>\varepsilon</math>, такого что в среднем <math>request\_neighbours</math> возвращает <math>O(\log n)</math> точек. Без использования ускоряющих структур или на вырожденных данных (таких, что все точки находятся на расстоянии меньшем, чем <math>\varepsilon</math> друг от друга) сложность по времени в худшем случае будет <math>O(n^2)</math>.
 +
 
 +
 
 +
Расстояния между точками можно вычислить заранее за <math>O(\frac {n(n - 1)}{2})</math>, например в виде матрицы расстояний, но это потребует <math>O(n^2)</math> памяти. Иначе, расстояния будут вычисляться при каждом запуске функции <math>request\_neighbours</math> за <math>O(n)</math> и потребуют <math>O(n)</math> памяти. Итоговая сложность вычисления расстояний в таком случае составляет <math>O(n^2)</math>. Сложность рассчета расстояний зависит от природы объектов из <math>X</math> и заданной метрики <math>D</math>. Например, если <math>X\subset\mathbb{R}^m</math>, то сложность равна <math>O(m)</math>, но оценка может быть улучшена при использовании векторных операций.
  
 
== Информационный граф ==
 
== Информационный граф ==
  
== Ресурс параллелизма алгоритма ==
+
Опишем граф алгоритма<ref>Воеводин В.В.  Математические основы параллельных вычислений// М.: Изд. Моск. ун-та, 1991. 345 с.</ref><ref>Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002. – 608 с.</ref><ref>Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.</ref>.
 +
 
 +
 
 +
[[File:Dbscan abstract.png |thumb|right|320px| Рис. 2. Внешний цикл алгоритма.]]
 +
 
 +
 
 +
На рис. 2 изображен информационный граф внешнего цикла алгоритма, который соответствует коду основной функции <math>DBSCAN</math>:
 +
*Макрооперация ''Init'' заключается в получении множества <math>X</math> и инициирования вспомогательных структур.
 +
*Макрооперация ''Choose'' производит выбор непосещенной точки из <math>X</math>.
 +
*Макрооперация ''Build cluster'' строит кластер, если точка ядровая, или объявляет ее шумом.
 +
 
 +
 
 +
Переход от ''Build cluster'' к ''Choose'' заключает в себе зависимость данных о принадлежности некоторых точек к текущему кластеру или шуму и об их посещенности.
 +
 
 +
[[File:Expand cluster 2.png |thumb|right|600px| Рис. 3. Расширение кластера.]]
 +
 
 +
 
 +
На рис. 3 изображен информационный граф алгоритма расширения кластера из начальной точки кластера:
 +
*Макрооперация ''Init'' заключается в создании кластера из его начальной вершины.
 +
*Макрооперация ''Nε'' вычисляет множество <math>\varepsilon</math>-соседей.
 +
*Желтым цветом обозначены узлы, в которых точки из <math>\varepsilon</math>-соседей классифицируются на ядровые, граничные точки и шум. В рамках операции для конкретного соседа вычисляется множество его <math>\varepsilon</math>-соседей.
 +
*Макрооперации ''Ñε'', ''Ňε'', ... производят объединение входных множеств.
 +
*Макрооперация ''Ø'' выполняется тогда, когда объединение входных множеств является пустым.
 +
 
  
= ЧАСТЬ. Программная реализация алгоритма =
+
[[File:N eps 3.png        |thumb|right|320px| Рис. 4. Подсчет <math>\varepsilon</math>-соседей.]]
Вторая часть описания алгоритмов в рамках AlgoWiki рассматривает все составные части процесса их реализации. Рассматривается как последовательная реализация алгоритма, так и параллельная. Описывается взаимосвязь свойств программ, реализующих алгоритм, и особенностей архитектуры компьютера, на которой они выполняются. Исследуется работа с памятью, локальность данных и вычислений, описывается масштабируемость и эффективность параллельных программ, производительность компьютеров, достигаемая на данной программе. Обсуждаются особенности реализации для разных классов архитектур компьютеров, приводятся ссылки на реализации в существующих библиотеках.
 
  
== Особенности реализации последовательного алгоритма ==
+
На рис. 4 изображен информационный граф алгоритма вычисления множества <math>\varepsilon</math>-соседей:
Здесь описываются особенности и варианты реализации алгоритма в виде последовательной программы, которые влияют на [[глоссарий#Эффективность реализации|''эффективность ее выполнения'']]. В частности, в данном разделе имеет смысл ''сказать о существовании блочных вариантов реализации алгоритма'', дополнительно описав потенциальные преимущества или недостатки, сопровождающие такую реализацию. Важный вопрос - это ''возможные варианты организации работы с данными'', варианты структур данных, наборов временных массивов и другие подобные вопросы. Для различных вариантов реализации следует оценить доступный ресурс параллелизма и объем требуемой памяти.
+
*Операция ''D'' - вычисление расстояния между точками.
 +
*Операция ''ε'' - сравнение расстояния с ε.
 +
*Операция ''U'' - объединение результатов.
  
Важным нюансом является ''описание необходимой разрядности выполнения операций алгоритма'' (точности). На практике часто нет никакой необходимости выполнять все арифметические операции над вещественными числами с двойной точностью, т.к. это не влияет ни на устойчивость алгоритма, ни на точность получаемого результата. В таком случае, если значительную часть операций можно выполнять над типом float, и лишь в некоторых фрагментах необходим переход к типу double, это обязательно нужно отметить. Это прямое указание не только на правильную реализацию с точки зрения устойчивости по отношению к ошибкам округления, но и на более эффективную.
+
== Ресурс параллелизма алгоритма ==
  
Опираясь на информацию из [[#Описание ресурса параллелизма алгоритма|п.1.8]] (описание ресурса параллелизма алгоритма), при описании последовательной версии стоит сказать про возможности [[глоссарий#Эквивалентное преобразование|''эквивалентного преобразования программ'']], реализующих данных алгоритм. В дальнейшем, это даст возможность простого использования доступного параллелизма или же просто покажет, как использовать присущий алгоритму параллелизм на практике. Например, параллелизм на уровне итераций самого внутреннего цикла обычно используется для векторизации. Однако, в некоторых случаях этот параллелизм можно поднять "вверх" по структуре вложенности объемлющих циклов, что делает возможной и эффективную реализацию данного алгоритма на многоядерных SMP-компьютерах.
+
Поиск <math>\varepsilon</math>-соседей требует вычисления <math>n</math> расстояний (функция <math>D</math>) и выполнения <math>n</math> сравнений с <math>\varepsilon</math>. Эти операции для каждой пары точек независимы и могут быть выполнены параллельно. Таким образом, при наличии неограниченного числа процессоров сложность поиска составит <math>O(1)</math>. Т.к. поиск выполняется для каждой точки ровно один раз, параллельная сложность всего алгоритма составит <math>O(n)</math>.
  
С этой же точки зрения, в данном разделе весьма полезны соображения по реализации алгоритма на различных параллельных вычислительных платформах. Высокопроизводительные кластеры, многоядерные узлы, возможности для векторизации или использования ускорителей - особенности этих архитектур не только опираются на разные свойства алгоритмов, но и по-разному должны быть выражены в программах, что также желательно описать в данном разделе.
+
== Входные и выходные данные алгоритма ==
  
== [[Локальность данных и вычислений]] ==
 
Вопросы локальности данных и вычислений не часто изучаются на практике, но именно локальность определяет эффективность выполнения программ на современных вычислительных платформах [2, 3]. В данном разделе приводятся оценки степени [[глоссарий#Локальность использования данных|''локальности данных'']] и [[глоссарий#Локальность вычислений|вычислений]] в программе, причем рассматривается как [[глоссарий#Временная локальность|''временна́я'']], так и [[глоссарий#Пространственная локальность|''пространственная'']] локальность. Отмечаются позитивные и негативные факты, связанные с локальностью, какие ситуации и при каких условиях могут возникать. Исследуется, как меняется локальность при переходе от последовательной реализации к параллельной. Выделяются ключевые шаблоны взаимодействия программы, реализующей описываемый алгоритм, с памятью. Отмечается возможная взаимосвязь между используемыми конструкциями языков программирования и степенью локальности, которыми обладают результирующие программы.
 
  
Отдельно приводятся профили взаимодействия с памятью для вычислительных ядер и ключевых фрагментов. Если из-за большого числа обращений по общему профилю сложно понять реальную специфику взаимодействия программ с памятью, то проводится последовательная детализация и приводится серия профилей более мелкого масштаба.  
+
Вход алгоритма: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидово расстояние между векторами из <math>\mathbb{R}^n</math>.
  
На рис.3 и рис.4 показаны профили обращения в память для программ, реализующих разложение Холецкого и быстрое преобразование Фурье, по которым хорошо видна разница свойств локальности у данных алгоритмов.
+
Выход алгоритма: размеченное множество точек <math>X</math>, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из <math>X</math> сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера <math>|X|</math>.
  
[[file:Cholesky_locality1.jpg|thumb|center|700px|Рис.3 Реализация метода Холецкого. Общий профиль обращений в память]]
+
== Свойства алгоритма ==
[[file:fft 1.PNG|thumb|center|700px|Рис.4 Нерекурсивная реализация БПФ для степеней двойки. Общий профиль обращений в память]]
 
  
== Возможные способы и особенности параллельной реализации алгоритма ==
+
Соотношение последовательной и параллельной сложностей алгоритма является линейным (отношение квадратичной к линейной).
Раздел довольно обширный, в котором должны быть описаны основные факты и положения, формирующие параллельную программу. К их числу можно отнести:
 
* представленный иерархически ресурс параллелизма, опирающийся на структуру циклических конструкций и на граф вызовов программы;
 
* комбинацию (иерархию) массового параллелизма и параллелизма конечного;
 
* возможные способы распределения операций между процессами/нитями;
 
* возможные способы распределения данных;
 
* оценку количества операций, объёма и числа пересылок данных (как общего числа, так и в пересчёте на каждый параллельный процесс);
 
  
и другие.
+
При этом вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.
  
В этом же разделе должны быть даны рекомендации или сделаны комментарии относительно реализации алгоритма с помощью различных технологий параллельного программирования: MPI, OpenMP, CUDA или использования директив векторизации.
+
=== Преимущества алгоритма ===
  
== Масштабируемость алгоритма и его реализации ==
+
# не требует указывать число кластеров;
Задача данного раздела - показать пределы [[глоссарий#Масштабируемость|''масштабируемости'']] алгоритма на различных платформах. Очень важный раздел. Нужно выделить, описать и оценить влияние точек барьерной синхронизации, глобальных операций, операций сборки/разборки данных, привести оценки или провести исследование [[глоссарий#Сильная масштабируемость|''сильной'']] и [[глоссарий#Слабая масштабируемость|''слабой'']] масштабируемости алгоритма и его реализаций.
+
# может определять кластера произвольной формы;
 +
# может определять шум и устойчив к выбросам;
 +
# требует всего два параметра и по в большинстве случаев не чувствителен к порядку заданных точек;
 +
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с <math>\varepsilon</math>).
  
Масштабируемость алгоритма определяет свойства самого алгоритма безотносительно конкретных особенностей используемого компьютера. Она показывает, насколько параллельные свойства алгоритма позволяют использовать возможности растущего числа процессорных элементов. Масштабируемость параллельных программ определяется как относительно конкретного компьютера, так и относительно используемой технологии программирования, и в этом случае она показывает, насколько может вырасти реальная производительность данного компьютера на данной программе, записанной с помощью данной технологии программирования, при использовании бóльших вычислительных ресурсов (ядер, процессоров, вычислительных узлов).
+
=== Недостатки алгоритма ===
  
Ключевой момент данного раздела заключается в том, чтобы показать ''реальные параметры масштабируемости программы'' для данного алгоритма на различных вычислительных платформах в зависимости от числа процессоров и размера задачи  [4]. При этом важно подобрать такое соотношение между числом процессоров и размером задачи, чтобы отразить все характерные точки в поведении параллельной программы, в частности, достижение максимальной производительности, а также тонкие эффекты, возникающие, например, из-за блочной структуры алгоритма или иерархии памяти.
+
# не детерминирован: граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован. Впрочем, от недетерминизма можно избавиться, если считать все граничные точки шумом (алгоритм DBSCAN*);
 +
# качество алгоритма зависит от используемой функции расстояния <math>D</math>. Наиболее часто используемое Евклидово расстояние в многомерных множествах может оказаться практически бесполезным из-за так называемого "проклятия размерности", значительно затрудняя нахождение подходящего значения <math>\varepsilon</math>;
 +
# не может выделять кластеры, имеющие разную плотность, так как параметры алгоритма не могут быть выбранны отдельно для каждого кластера.
  
На рис.5. показана масштабируемость классического алгоритма умножения плотных матриц в зависимости от числа процессоров и размера задачи. На графике хорошо видны области с большей производительностью, отвечающие уровням кэш-памяти.
+
= Программная реализация алгоритма =
[[file:Масштабируемость перемножения матриц производительность.png|thumb|center|700px|Рис.5 Масштабируемость классического алгоритма умножения плотных матриц в зависимости от числа процессоров и размера задачи]]
 
  
== Динамические характеристики и эффективность реализации алгоритма ==
+
== Особенности реализации последовательного алгоритма ==
Это объемный раздел AlgoWiki, поскольку оценка эффективности реализации алгоритма требует комплексного подхода [5], предполагающего аккуратный анализ всех этапов от архитектуры компьютера до самого алгоритма. Основная задача данного раздела заключается в том, чтобы оценить степень эффективности параллельных программ, реализующих данный алгоритм на различных платформах, в зависимости от числа процессоров и размера задачи. Эффективность в данном разделе понимается широко: это и [[глоссарий#Эффективность распараллеливания|''эффективность распараллеливания'']] программы, это и [[глоссарий#Эффективность реализации|''эффективность реализации'']] программ по отношению к пиковым показателям работы вычислительных систем.
 
  
Помимо собственно показателей эффективности, нужно описать и все основные причины, из-за которых эффективность работы параллельной программы на конкретной вычислительной платформе не удается сделать выше. Это не самая простая задача, поскольку на данный момент нет общепринятой методики и соответствующего инструментария, с помощью которых подобный анализ можно было бы провести. Требуется оценить и описать эффективность работы с памятью (особенности профиля взаимодействия программы с памятью), эффективность использования заложенного в алгоритм ресурса параллелизма, эффективность использования коммуникационной сети (особенности коммуникационного профиля), эффективность операций ввода/вывода и т.п. Иногда достаточно интегральных характеристик по работе программы, в некоторых случаях полезно показать данные мониторинга нижнего уровня, например, по загрузке процессора, кэш-промахам, интенсивности использования сети Infiniband и т.п. Хорошее представление о работе параллельной MPI-программы дают данные трассировки, полученные, например, с помощью системы Scalasca.
+
== Локальность данных и вычислений ==
  
== Выводы для классов архитектур ==
+
== Возможные способы и особенности параллельной реализации алгоритма ==
В данный раздел должны быть включены рекомендации по реализации алгоритма для разных классов архитектур. Если архитектура какого-либо компьютера или платформы обладает специфическими особенностями, влияющими на эффективность реализации, то это здесь нужно отметить.
 
  
На практике это сделать можно по-разному: либо все свести в один текущий раздел, либо же соответствующие факты сразу включать в предшествующие разделы, где они обсуждаются и необходимы по смыслу. В некоторых случаях, имеет смысл делать отдельные варианты всей [[#ЧАСТЬ. Программная реализация алгоритмов|части II]] AlgoWiki применительно к отдельным классам архитектур, оставляя общей машинно-независимую [[#ЧАСТЬ. Свойства и структура алгоритмов|часть I]]. В любом случае, важно указать и позитивные, и негативные факты по отношению к конкретным классам. Можно говорить о возможных вариантах оптимизации или даже о "трюках" в написании программ, ориентированных на целевые классы архитектур.
+
== Масштабируемость алгоритма и его реализации ==
  
== Существующие реализации алгоритма ==
+
!!! ЭКСПЕРИМЕНТЫ ДО 15 НОЯБРЯ !!!
Для многих пар алгоритм+компьютер уже созданы хорошие реализации, которыми можно и нужно пользоваться на практике. Данный раздел предназначен для того, чтобы дать ссылки на основные существующие последовательные и параллельные реализации алгоритма, доступные для использования уже сейчас. Указывается, является ли реализация коммерческой или свободной, под какой лицензией распространяется, приводится местоположение дистрибутива и имеющихся описаний. Если есть информация об особенностях, достоинствах и/или недостатках различных реализаций, то это также нужно здесь указать. Хорошими примерами реализации многих алгоритмов являются MKL, ScaLAPACK, PETSc, FFTW, ATLAS, Magma и другие подобные библиотеки.
 
  
= Литература =
+
== Динамические характеристики и эффективность реализации алгоритма ==
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.
 
  
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.
+
== Выводы для классов архитектур ==
  
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.
+
== Существующие реализации алгоритма ==
  
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.
+
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python)]
 +
* [https://cran.r-project.org/web/packages/dbscan/dbscan.pdf R-project] ([https://github.com/mhahsler/dbscan github])
 +
* [https://www.mathworks.com/matlabcentral/fileexchange/52905-dbscan-clustering-algorithm Matlab]
 +
* P-DBSCAN (Parallel DBSCAN)<ref>Chen, Min, Xuedong Gao, and HuiFei Li. "Parallel DBSCAN with priority r-tree." Information Management and Engineering (ICIME), 2010 The 2nd IEEE International Conference on. IEEE, 2010.</ref>
 +
* Parallel DBSCAN with MPI<ref>Savvas, Ilias K., and Dimitrios Tselios. "Parallelizing DBSCaN Algorithm Using MPI." Enabling Technologies: Infrastructure for Collaborative Enterprises (WETICE), 2016 IEEE 25th International Conference on. IEEE, 2016.</ref>
 +
* PDSDBSCAN (Parallel Disjoint-Set DBSCAN)<ref>Patwary, Md Mostofa Ali, et al. "A new scalable parallel DBSCAN algorithm using the disjoint-set data structure." High Performance Computing, Networking, Storage and Analysis (SC), 2012 International Conference for. IEEE, 2012.</ref>
  
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.
+
= Литература =
  
[[en:Description of algorithm properties and structure]]
+
<references />

Текущая версия на 14:56, 3 декабря 2016

Symbol confirmed.svgЭта работа успешно выполнена
Преподавателю: в основное пространство, в подстраницу

Данное задание было проверено и зачтено.
Проверено Dexter и Sleo.



Плотностный алгоритм кластеризации DBSCAN
Последовательный алгоритм
Последовательная сложность [math]O(n \log n)[/math]
Объём входных данных [math]n[/math]
Объём выходных данных [math]n[/math]


Авторы описания: Вашуров И.М., Шемякин Р.О.

Содержание

1 Свойства и структура алгоритма

1.1 Общее описание алгоритма

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

Алгоритм DBSCAN (Density-based spatial clustering of applications with noise)[1] был предложен Мартином Эстер, Гансом-Питером Кригель и коллегами в 1996 году как решение задачи кластеризации с кластерами произвольной формы. DBSCAN является непараметрическим плотностным алгоритмом кластеризации: для заданного набора точек в некотором пространстве, алгоритм группирует те точки, которые расположены достаточно близко друг к другу (точки с большим количеством соседей), и помечает как выбросы те, что располагаются далеко от ближайших соседей.

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

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

1.2 Математическое описание алгоритма

Вход алгоритма: множество точек [math]X[/math] из [math]n[/math]-мерного пространства, на котором определена функция расстояния [math]D[/math].

Выход алгоритма: размеченное множество точек [math]X[/math], в котором каждой точке соответствует номер ее кластера.

Параметры алгоритма:

  • [math]\varepsilon[/math] - максимальное расстояние между соседями;
  • [math]MinPts[/math] - минимальное количество соседей для создания области связности.


1.2.1 Определения

Рис. 1. [1] Здесь MinPts = 4. Точка A и другие красные точки - ядровые и образуют единый кластер, так как достижимы друг из друга. Точки B и C не являются ядровыми, но достижимы из A, а значит также принадлежат кластеру. Точка N - не достижима из других точек и является шумом.

Все заданные точки классифицируются на три группы:

  • ядровые точки: точка [math]p[/math] является ядровой, если количество [math]\varepsilon[/math]-соседей, включая саму точку [math]p[/math], не меньше [math]MinPts[/math]. Под [math]\varepsilon[/math]-соседями точки [math]p \in X[/math] понимается множество точек, расстояние до которых не превышает [math]\varepsilon[/math], т.е. [math]N_\varepsilon(p) = \{ x \in X | D(p, x) \le \varepsilon \}[/math]. Эти точки являются напрямую достижимыми из [math]p[/math];
  • достижимые точки: точка [math]q[/math] достижима из [math]p[/math], если существует путь [math]p_1, \dots, p_n[/math], где [math]p_1 = p[/math] и [math]p_n = q[/math], для которого выполнено:
[math]\begin{align} p_{i + 1} \in N_\varepsilon(p_i), i = 1, \dots, n-1 \\ | N_\varepsilon(p_{i}) | \ge MinPts, i = 1, \dots, n-1 \\ \end{align}[/math]
  • шум (выбросы): все точки, недостижимые из какой-либо другой точки считаются шумом (выбросом).

Так, если [math]p[/math] - ядровая точка, то она образует кластер вместе со всеми точками, достижимыми из неё. Каждый кластер содержит по крайней мере одну ядровую точку; неядровые точки могут быть частью кластера, образуя при этом его "границу", так как они не могут быть использованы для достижения других точек.


Достижимость не является симметричным отношением, так как по определению никакая точка не может быть достижима из неядровой точки, независимо от расстояния. Поэтому в DBSCAN применяется следующий термин связности: две точки [math]p[/math] и [math]q[/math] связанны, если существует такая точка [math]o[/math], что [math]p[/math] и [math]q[/math] достижимы из [math]o[/math]. Такое отношение связности симметрично.


Кластер в таком случае определяется двумя свойствами:

  • Все точки внутри кластера взаимно связанны;
  • Если точка достижима из любой точки кластера, она также является частью кластера.

1.2.2 Шаги алгоритма

  1. Выбирается произвольная непосещенная точка [math]p[/math].
  2. Точка [math]p[/math] помечается как посещенная.
  3. У точки [math]p[/math] определяется множество её [math]\varepsilon[/math]-соседей - [math]N_\varepsilon(p)[/math].
    • Если точка [math]p[/math] оказалась ядровой - [math]| N_\varepsilon(p) | \ \ge MinPts[/math], то:
      • она становится началом нового кластера или сохраняет номер кластера, который был ей присвоен ранее;
      • все точки из [math]N_\varepsilon(p)[/math] добавляются в её кластер;
      • процесс продолжается рекурсивно для каждой новой добавленной непосещенной точки [math]p' \in N_\varepsilon(p)[/math] c шага 2 (в качестве новой [math]p[/math]).
    • Если точка [math]p[/math] оказалась не ядровой, то [math]p[/math] объявляется шумом. Алгоритм продолжается с шага 4.
  4. Если остались непосещенные точки, то алгоритм продолжается с шага 1.

1.3 Вычислительное ядро алгоритма

Вычислительным ядром алгоритма является нахождение [math]\varepsilon[/math]-соседей каждой точки входного множества [math]X[/math].

Для решения этой задачи требуется найти расстояния между любыми двумя точками множества [math]X[/math] по заданной метрике. Например, если используется расстояние Минковского порядка [math]k[/math], то расстояние между точками [math]p=(p_1,...,p_n) \in X[/math] и [math]q=(q_1,...,q_n) \in X[/math] вычисляется как [math]D(p, q) = (\sum_{i = 1}^{n}|p_i - q_i|^k)^{1 / k}[/math], частным случаем которой при [math]k = 2[/math] является широко распространённая евклидова метрика [math]D(p, q) = \sqrt{\sum_{i = 1}^{n} (p_i - q_i)^2}[/math].

1.4 Макроструктура алгоритма

Как записано и в описании ядра алгоритма, основную часть метода составляют вызовы функции [math]request\_neighbours[/math] получения [math]\varepsilon[/math]-соседей и нахождение расстояний между точками множества [math]X[/math].

1.5 Схема реализации последовательного алгоритма

[math]DBSCAN[/math] проходит через все точки множества [math]X[/math] и определяет, являются ли они шумом или началом нового кластера. В последнем случае новому кластеру присваивается уникальный номер и вызывается функция расширения кластера.

[math]DBSCAN(\varepsilon, MinPts)[/math]
  [math]C = 0[/math]
  for [math]\forall p \in X[/math]
     if [math]p[/math] is visited then
        continue
     mark [math]p[/math] as visited
     [math]neighbours[/math] = [math]request\_neighbours(p, \varepsilon)[/math]
     if [math]| neighbours | \lt  MinPts[/math] then
        mark [math]p[/math] as [math]NOISE[/math]
     else
        [math]C = next\_cluster[/math]
        [math]expand\_cluster(p, neighbours, C, \varepsilon, MinPts)[/math]

[math]expand\_cluster[/math] рекурсивно проходит через все точки множества [math]neighbours[/math] - соседей точки [math]p[/math], и определяет, принадлежат ли эти точки тому же кластеру [math]C[/math], тем самым расширяя этот кластер.

[math]expand\_cluster(p, neighbours, C, \varepsilon, MinPts)[/math]
  add [math]p[/math] to cluster [math]C[/math]
  for [math]\forall p' \in neighbours[/math]
     if [math]p'[/math] is not visited 
        mark [math]p'[/math] as visited
        [math]neighbours'[/math] = [math]request\_neighbours(p, \varepsilon)[/math]
        if [math]| neighbours' | \ \ge MinPts[/math]
           [math]neighbours[/math] = [math]neighbours \cup neighbours'[/math]  
     if [math]p'[/math] is not yet member of any cluster
        add [math]p'[/math] to cluster [math]C[/math]

[math]request\_neighbours[/math] возвращает для точки [math]p[/math] множество всех её [math]\varepsilon[/math]-соседей, используя функцию расстояния [math]D[/math]

[math]request\_neighbours(p, \varepsilon)[/math]
   return [math]\{ p' \ | \ \forall p' \in X: D(p, p') \lt  \varepsilon \}[/math]

1.6 Последовательная сложность алгоритма

DBSCAN проходит через каждую точку входного множества, возможно, по несколько раз. Временная сложность зависит в большей степени от вызова функции [math]request\_neighbours[/math] (нахождение [math]\varepsilon[/math]-соседей для заданной точки). Эта функция вызывается ровно один раз для каждой точки множества [math]X[/math].

Если использовать индексированную структуру данных (например, R-деревья), выполняющую операцию [math]request\_neighbours[/math] за [math]O(\log n)[/math], то суммарная сложность алгоритма в среднем составит [math]O(n \log n)[/math], с учётом хорошо подобранного параметра [math]\varepsilon[/math], такого что в среднем [math]request\_neighbours[/math] возвращает [math]O(\log n)[/math] точек. Без использования ускоряющих структур или на вырожденных данных (таких, что все точки находятся на расстоянии меньшем, чем [math]\varepsilon[/math] друг от друга) сложность по времени в худшем случае будет [math]O(n^2)[/math].


Расстояния между точками можно вычислить заранее за [math]O(\frac {n(n - 1)}{2})[/math], например в виде матрицы расстояний, но это потребует [math]O(n^2)[/math] памяти. Иначе, расстояния будут вычисляться при каждом запуске функции [math]request\_neighbours[/math] за [math]O(n)[/math] и потребуют [math]O(n)[/math] памяти. Итоговая сложность вычисления расстояний в таком случае составляет [math]O(n^2)[/math]. Сложность рассчета расстояний зависит от природы объектов из [math]X[/math] и заданной метрики [math]D[/math]. Например, если [math]X\subset\mathbb{R}^m[/math], то сложность равна [math]O(m)[/math], но оценка может быть улучшена при использовании векторных операций.

1.7 Информационный граф

Опишем граф алгоритма[2][3][4].


Рис. 2. Внешний цикл алгоритма.


На рис. 2 изображен информационный граф внешнего цикла алгоритма, который соответствует коду основной функции [math]DBSCAN[/math]:

  • Макрооперация Init заключается в получении множества [math]X[/math] и инициирования вспомогательных структур.
  • Макрооперация Choose производит выбор непосещенной точки из [math]X[/math].
  • Макрооперация Build cluster строит кластер, если точка ядровая, или объявляет ее шумом.


Переход от Build cluster к Choose заключает в себе зависимость данных о принадлежности некоторых точек к текущему кластеру или шуму и об их посещенности.

Рис. 3. Расширение кластера.


На рис. 3 изображен информационный граф алгоритма расширения кластера из начальной точки кластера:

  • Макрооперация Init заключается в создании кластера из его начальной вершины.
  • Макрооперация вычисляет множество [math]\varepsilon[/math]-соседей.
  • Желтым цветом обозначены узлы, в которых точки из [math]\varepsilon[/math]-соседей классифицируются на ядровые, граничные точки и шум. В рамках операции для конкретного соседа вычисляется множество его [math]\varepsilon[/math]-соседей.
  • Макрооперации Ñε, Ňε, ... производят объединение входных множеств.
  • Макрооперация Ø выполняется тогда, когда объединение входных множеств является пустым.


Рис. 4. Подсчет [math]\varepsilon[/math]-соседей.

На рис. 4 изображен информационный граф алгоритма вычисления множества [math]\varepsilon[/math]-соседей:

  • Операция D - вычисление расстояния между точками.
  • Операция ε - сравнение расстояния с ε.
  • Операция U - объединение результатов.

1.8 Ресурс параллелизма алгоритма

Поиск [math]\varepsilon[/math]-соседей требует вычисления [math]n[/math] расстояний (функция [math]D[/math]) и выполнения [math]n[/math] сравнений с [math]\varepsilon[/math]. Эти операции для каждой пары точек независимы и могут быть выполнены параллельно. Таким образом, при наличии неограниченного числа процессоров сложность поиска составит [math]O(1)[/math]. Т.к. поиск выполняется для каждой точки ровно один раз, параллельная сложность всего алгоритма составит [math]O(n)[/math].

1.9 Входные и выходные данные алгоритма

Вход алгоритма: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидово расстояние между векторами из [math]\mathbb{R}^n[/math].

Выход алгоритма: размеченное множество точек [math]X[/math], в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из [math]X[/math] сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера [math]|X|[/math].

1.10 Свойства алгоритма

Соотношение последовательной и параллельной сложностей алгоритма является линейным (отношение квадратичной к линейной).

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

1.10.1 Преимущества алгоритма

  1. не требует указывать число кластеров;
  2. может определять кластера произвольной формы;
  3. может определять шум и устойчив к выбросам;
  4. требует всего два параметра и по в большинстве случаев не чувствителен к порядку заданных точек;
  5. параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с [math]\varepsilon[/math]).

1.10.2 Недостатки алгоритма

  1. не детерминирован: граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован. Впрочем, от недетерминизма можно избавиться, если считать все граничные точки шумом (алгоритм DBSCAN*);
  2. качество алгоритма зависит от используемой функции расстояния [math]D[/math]. Наиболее часто используемое Евклидово расстояние в многомерных множествах может оказаться практически бесполезным из-за так называемого "проклятия размерности", значительно затрудняя нахождение подходящего значения [math]\varepsilon[/math];
  3. не может выделять кластеры, имеющие разную плотность, так как параметры алгоритма не могут быть выбранны отдельно для каждого кластера.

2 Программная реализация алгоритма

2.1 Особенности реализации последовательного алгоритма

2.2 Локальность данных и вычислений

2.3 Возможные способы и особенности параллельной реализации алгоритма

2.4 Масштабируемость алгоритма и его реализации

!!! ЭКСПЕРИМЕНТЫ ДО 15 НОЯБРЯ !!!

2.5 Динамические характеристики и эффективность реализации алгоритма

2.6 Выводы для классов архитектур

2.7 Существующие реализации алгоритма

3 Литература

  1. Ester, Martin, et al. "A density-based algorithm for discovering clusters in large spatial databases with noise." Kdd. Vol. 96. No. 34. 1996.
  2. Воеводин В.В. Математические основы параллельных вычислений// М.: Изд. Моск. ун-та, 1991. 345 с.
  3. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002. – 608 с.
  4. Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.
  5. Chen, Min, Xuedong Gao, and HuiFei Li. "Parallel DBSCAN with priority r-tree." Information Management and Engineering (ICIME), 2010 The 2nd IEEE International Conference on. IEEE, 2010.
  6. Savvas, Ilias K., and Dimitrios Tselios. "Parallelizing DBSCaN Algorithm Using MPI." Enabling Technologies: Infrastructure for Collaborative Enterprises (WETICE), 2016 IEEE 25th International Conference on. IEEE, 2016.
  7. Patwary, Md Mostofa Ali, et al. "A new scalable parallel DBSCAN algorithm using the disjoint-set data structure." High Performance Computing, Networking, Storage and Analysis (SC), 2012 International Conference for. IEEE, 2012.