<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Elmon</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Elmon"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Elmon"/>
	<updated>2026-10-22T21:22:14Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=16452</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=16452"/>
		<updated>2016-11-11T18:06:05Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Баг с блоком {{Assignment}} в конце статьи, переместил в начало&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию. Основные операции вычислительного ядра алгоритма: нахождение расстояние между элементами множества и сравнение его с порогом для определения того, являются ли один элемент достижимым напрямую из другого.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных (структуры, ориентированной на индексацию многомерной информации, такой как географические данные) — такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Skipping already visited elements&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     # [Core operation] Searching for neighbors&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Found new cluster&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       # Looking for more neighbors, until none left&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           # If element is visited, then either it was marked as part of other cluster, or as noise&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           # [Core operation] Searching for neighbors&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             # We can expand neighbors with new elements from element &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           # If it&#039;s noise — mark as edge-element part of cluster&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px|Рис. 2. Граф алгоритма DBSCAN с отображением входных данных. Element — входные данные, Neighbours —  операция поиска соседей, Check — операция проверки условий, добавления вершины к кластеру и выбора новой, Out — результаты.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Вычислительная мощность алгоритма (отношение числа операций к объему входных и выходных данных) является логарифмической.&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan Параллельная реализация для Python на OpenMP/MPI]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN Параллельная реализация для C++ на Boost и OpenMP с использованием VP-дерева]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Параллельная реализация для С++ на OpenMP с использованием системы непересекающихся множеств]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis Параллельная реализация для многомерных данных для Python на SciPy и NumPy ]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan Последовательная реализация для R на С++]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15693</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15693"/>
		<updated>2016-11-01T21:14:29Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Вернул на проверку&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию. Основные операции вычислительного ядра алгоритма: нахождение расстояние между элементами множества и сравнение его с порогом для определения того, являются ли один элемент достижимым напрямую из другого.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных (структуры, ориентированной на индексацию многомерной информации, такой как географические данные) — такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Skipping already visited elements&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     # [Core operation] Searching for neighbors&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Found new cluster&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       # Looking for more neighbors, until none left&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           # If element is visited, then either it was marked as part of other cluster, or as noise&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           # [Core operation] Searching for neighbors&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             # We can expand neighbors with new elements from element &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           # If it&#039;s noise — mark as edge-element part of cluster&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px|Рис. 2. Граф алгоритма DBSCAN с отображением входных данных. Element — входные данные, Neighbours —  операция поиска соседей, Check — операция проверки условий, добавления вершины к кластеру и выбора новой, Out — результаты.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Вычислительная мощность алгоритма (отношение числа операций к объему входных и выходных данных) является логарифмической.&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan Параллельная реализация для Python на OpenMP/MPI]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN Параллельная реализация для C++ на Boost и OpenMP с использованием VP-дерева]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Параллельная реализация для С++ на OpenMP с использованием системы непересекающихся множеств]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis Параллельная реализация для многомерных данных для Python на SciPy и NumPy ]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan Последовательная реализация для R на С++]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;br /&gt;
{{Assignment}}&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15690</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15690"/>
		<updated>2016-11-01T21:10:51Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Переместил референс изображения так, чтобы его было лучше видно.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию. Основные операции вычислительного ядра алгоритма: нахождение расстояние между элементами множества и сравнение его с порогом для определения того, являются ли один элемент достижимым напрямую из другого.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных (структуры, ориентированной на индексацию многомерной информации, такой как географические данные) — такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Skipping already visited elements&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     # [Core operation] Searching for neighbors&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Found new cluster&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       # Looking for more neighbors, until none left&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           # If element is visited, then either it was marked as part of other cluster, or as noise&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           # [Core operation] Searching for neighbors&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             # We can expand neighbors with new elements from element &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           # If it&#039;s noise — mark as edge-element part of cluster&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px|Рис. 2. Граф алгоритма DBSCAN с отображением входных данных. Element — входные данные, Neighbours —  операция поиска соседей, Check — операция проверки условий, добавления вершины к кластеру и выбора новой, Out — результаты.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Вычислительная мощность алгоритма (отношение числа операций к объему входных и выходных данных) является логарифмической.&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan Параллельная реализация для Python на OpenMP/MPI]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN Параллельная реализация для C++ на Boost и OpenMP с использованием VP-дерева]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Параллельная реализация для С++ на OpenMP с использованием системы непересекающихся множеств]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis Параллельная реализация для многомерных данных для Python на SciPy и NumPy ]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan Последовательная реализация для R на С++]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15687</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15687"/>
		<updated>2016-11-01T21:06:13Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Добавлено описание ссылок на алгоритмы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию. Основные операции вычислительного ядра алгоритма: нахождение расстояние между элементами множества и сравнение его с порогом для определения того, являются ли один элемент достижимым напрямую из другого.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных (структуры, ориентированной на индексацию многомерной информации, такой как географические данные) — такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Skipping already visited elements&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     # [Core operation] Searching for neighbors&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Found new cluster&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       # Looking for more neighbors, until none left&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           # If element is visited, then either it was marked as part of other cluster, or as noise&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           # [Core operation] Searching for neighbors&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             # We can expand neighbors with new elements from element &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           # If it&#039;s noise — mark as edge-element part of cluster&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px|Рис. 2. Граф алгоритма DBSCAN с отображением входных данных. Element — входные данные, Neighbours —  операция поиска соседей, Check — операция проверки условий, добавления вершины к кластеру и выбора новой, Out — результаты.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Вычислительная мощность алгоритма (отношение числа операций к объему входных и выходных данных) является логарифмической.&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan Параллельная реализация для Python на OpenMP/MPI]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN Параллельная реализация для C++ на Boost и OpenMP с использованием VP-дерева]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Параллельная реализация для С++ на OpenMP с использованием системы непересекающихся множеств]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis Параллельная реализация для многомерных данных для Python на SciPy и NumPy ]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan Последовательная реализация для R на С++]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15671</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15671"/>
		<updated>2016-11-01T20:53:48Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Добавена вычислительная мощность алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию. Основные операции вычислительного ядра алгоритма: нахождение расстояние между элементами множества и сравнение его с порогом для определения того, являются ли один элемент достижимым напрямую из другого.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных (структуры, ориентированной на индексацию многомерной информации, такой как географические данные) — такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Skipping already visited elements&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     # [Core operation] Searching for neighbors&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Found new cluster&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       # Looking for more neighbors, until none left&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           # If element is visited, then either it was marked as part of other cluster, or as noise&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           # [Core operation] Searching for neighbors&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             # We can expand neighbors with new elements from element &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           # If it&#039;s noise — mark as edge-element part of cluster&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px|Рис. 2. Граф алгоритма DBSCAN с отображением входных данных. Element — входные данные, Neighbours —  операция поиска соседей, Check — операция проверки условий, добавления вершины к кластеру и выбора новой, Out — результаты.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Вычислительная мощность алгоритма (отношение числа операций к объему входных и выходных данных) является логарифмической.&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15663</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15663"/>
		<updated>2016-11-01T20:49:36Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Добавлено описание информационного графа&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию. Основные операции вычислительного ядра алгоритма: нахождение расстояние между элементами множества и сравнение его с порогом для определения того, являются ли один элемент достижимым напрямую из другого.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных (структуры, ориентированной на индексацию многомерной информации, такой как географические данные) — такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Skipping already visited elements&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     # [Core operation] Searching for neighbors&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Found new cluster&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       # Looking for more neighbors, until none left&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           # If element is visited, then either it was marked as part of other cluster, or as noise&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           # [Core operation] Searching for neighbors&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             # We can expand neighbors with new elements from element &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           # If it&#039;s noise — mark as edge-element part of cluster&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px|Рис. 2. Граф алгоритма DBSCAN с отображением входных данных. Element — входные данные, Neighbours —  операция поиска соседей, Check — операция проверки условий, добавления вершины к кластеру и выбора новой, Out — результаты.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15656</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15656"/>
		<updated>2016-11-01T20:39:55Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Добавлены комментарии к схеме реализации последовательного алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию. Основные операции вычислительного ядра алгоритма: нахождение расстояние между элементами множества и сравнение его с порогом для определения того, являются ли один элемент достижимым напрямую из другого.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных (структуры, ориентированной на индексацию многомерной информации, такой как географические данные) — такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Skipping already visited elements&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     # [Core operation] Searching for neighbors&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       # Found new cluster&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       # Looking for more neighbors, until none left&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           # If element is visited, then either it was marked as part of other cluster, or as noise&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           # [Core operation] Searching for neighbors&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             # We can expand neighbors with new elements from element &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           # If it&#039;s noise — mark as edge-element part of cluster&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px| Граф алгоритма DBSCAN]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15649</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15649"/>
		<updated>2016-11-01T20:28:22Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Описаны подробнее пункты 1.3, 1.4 (Вычислительное ядро алгоритма, Макроструктура алгоритма) соотвественно&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию. Основные операции вычислительного ядра алгоритма: нахождение расстояние между элементами множества и сравнение его с порогом для определения того, являются ли один элемент достижимым напрямую из другого.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных (структуры, ориентированной на индексацию многомерной информации, такой как географические данные) — такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px| Граф алгоритма DBSCAN]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15641</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=15641"/>
		<updated>2016-11-01T20:19:59Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Добавлены свойства алгоритма (пункт 1.1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет ряд отличительных свойств:&lt;br /&gt;
* Не требуется заранее определять число кластеров&lt;br /&gt;
* Может отличать кластеры, которые нельзя разделить прямой линией (плоскостью, для N-мерного пространства), в том числе кластера, частично или полностью окруженные другим кластером.&lt;br /&gt;
* Хорошо работает в условиях зашумленных входных данных&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных: такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px| Граф алгоритма DBSCAN]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon&amp;diff=11968</id>
		<title>Участник:Elmon</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon&amp;diff=11968"/>
		<updated>2016-10-15T20:49:41Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Новая страница: «Гилевич Вячеслав Вячеславович, студент факультета ВМК МГУ имени М.В. Ломоносова, кафедра…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Гилевич Вячеслав Вячеславович, студент факультета ВМК МГУ имени М.В. Ломоносова, кафедра Алгоритмических языков&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=11963</id>
		<title>Участник:Elmon/Плотностный алгоритм кластеризации DBSCAN</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Elmon/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_DBSCAN&amp;diff=11963"/>
		<updated>2016-10-15T20:48:52Z</updated>

		<summary type="html">&lt;p&gt;Elmon: Новая страница: «{{Assignment}} {{algorithm | name              = Плотностный алгоритм кластеризации DBSCAN | serial_complexity = &amp;lt;math&amp;gt;O(n \log n)…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основной автор описания: [[User:Elmon|Гилевич В.В.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация — это процедура, упорядочивающая элементы из некоторого множества в сравнительно однородные группы (кластеры). Элементы могут содержать числовые, категориальные или смешанные данные. Плотностные методы выделяют кластеры на основе следующей идеи: кластером считается регион с высокой плотностью объектов, которые разделены разреженными регионами (с низкой плотностью объектов)&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;A density-based algorithm for discovering clusters in large spatial database / M. Ester, H.-P. Kriegel,&lt;br /&gt;
J. Sander, X. Xu // Proc. 1996 Intern. Conf. on Knowledge Discovery and Data Mining. – 1996.&amp;lt;/ref&amp;gt; — плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения данных на кластеры произвольной формы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Исходные данные ===&lt;br /&gt;
Множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Вычисляемые данные===&lt;br /&gt;
Множество пар из элемента множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, и соответствующий ему номер кластера.&lt;br /&gt;
&lt;br /&gt;
=== Параметры алгоритма ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — максимальное расстояние между соседями;&lt;br /&gt;
* &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; — минимальное количество элементов находящихся &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности данного элемента для создания кластера.&lt;br /&gt;
&lt;br /&gt;
=== Определения ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;ядровой элемент&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, если количество элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности, включая сам элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; больше или равно &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость напрямую элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается достижимым напрямую из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если элемент &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; является ядровым, а элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента q;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;достижимость элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; достижим из элемента &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует путь &amp;lt;math&amp;gt;p_1, \dots, p_n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_1 = p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_n = q&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p_{i + 1}&amp;lt;/math&amp;gt; напрямую достижим из &amp;lt;math&amp;gt;p_{i}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;шум&#039;&#039;: все элементы, недостижимые из какого-либо другого считаются шумом.&lt;br /&gt;
&lt;br /&gt;
Так как достижимость не является симметричным отношением (никакой элемент не может быть достижим из неядрового, вне зависимости от расстояния), то предлагается ввести следующее отношение:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;связанность элемента p и элемента q&#039;&#039;: элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; считается связанным с &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;, если существует такой элемент &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; достижимы из него.&lt;br /&gt;
&lt;br /&gt;
Таким образом &#039;&#039;кластер&#039;&#039; должен удовлетворять двум условиям:&lt;br /&gt;
* Все элементы внутри кластера взаимно связанны;&lt;br /&gt;
* Если элемент связан с каким-либо элементом кластера, то он тоже является частью кластера.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN-Illustration.svg|thumb|right|400px| Рис. 1&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/DBSCAN Density-based spatial clustering of applications with noise (DBSCAN)&amp;lt;/ref&amp;gt;. Для &#039;&#039;MinPts&#039;&#039; = 4. Красные элементы соответствуют ядровым, желтые — достижимым, синяя — шуму.]]&lt;br /&gt;
&lt;br /&gt;
=== Пошаговое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
#Выбирается произвольная непосещенный элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; помечается как посещенный. &lt;br /&gt;
#Проверяется, является ли элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; ядровым.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; является ядровым, то: &lt;br /&gt;
#**Он становится началом нового кластера или сохраняет номер кластера, который был присвоен элементу ранее; &lt;br /&gt;
#**Все элементы из &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляются в его кластер (им присваевается номер кластера элемента &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;);&lt;br /&gt;
#**Процесс продолжается рекурсивно для каждого непосещенного элемента текущего кластера c шага 2.&lt;br /&gt;
#*Если элемент &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; не является ядровым, то &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; объявляется шумом. Алгоритм продолжается с шага 4.&lt;br /&gt;
#Если остались непосещенные точки, то алгоритм продолжается с шага 1.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является поиск элементов в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности каждого элемента входного множества &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. На эту часть алгоритма приходится основное время работы алгоритма, так как для каждого элемента необходимо выполнить эту операцию.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма == &lt;br /&gt;
Алгоритм DBSCAN предполагает использование пространственной структуры данных: такие структуры позволяют найти все элементы в пределах определенного расстояния от текущего за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;, таким образом, использование такой структуры не увеличивает сложность всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;DBSCAN(X, \varepsilon, MinPts)&amp;lt;/math&amp;gt;&lt;br /&gt;
   &amp;lt;math&amp;gt;C = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
   for &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;:&lt;br /&gt;
     if &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
       continue&lt;br /&gt;
     mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(p, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;| neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
       &amp;lt;math&amp;gt;C = C + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
       add &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; to cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
       for &amp;lt;math&amp;gt;q \in neighbours&amp;lt;/math&amp;gt;:&lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; is not &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;:&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;visited&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;q\_neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;\{ o \ | \ \forall o \in X: D(q, o) \le \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
           if &amp;lt;math&amp;gt;| q\_neighbours | \ge MinPts&amp;lt;/math&amp;gt;:&lt;br /&gt;
             &amp;lt;math&amp;gt;neighbours&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;neighbours \cup q\_neighbours&amp;lt;/math&amp;gt;  &lt;br /&gt;
         if &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; has no cluster mark:&lt;br /&gt;
           mark &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; as part of cluster &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
     else:&lt;br /&gt;
       mark &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы проверить принадлежность элемента множества к кластеру необходимо получить список соседей в его &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности. При использовании пространственной структуры данных данная операция может быть выполнена со сложностью &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. Так как для необходимо определить принадлежность к кластеру всех элементов множества, то сложность самого алгоритма &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;. При отказе от использования таких сткрутр сложность возрастает до &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, так как для каждого элемента требуется проверить на нахождение в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности все остальные элементы множества.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных узлах двух областей двумерной размерности.&lt;br /&gt;
&lt;br /&gt;
Первой группе вершин соответствует операция Neighbours. Естественно введённые координаты области таковы:&lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k + f&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — число результирующих кластеров, &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — число элементов помеченных, как шум&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, принимая все целочисленные значения, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — число вершин в кластере &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
Второй группе вершин соответствует операция Check. Естественно введённые координаты области аналогичны предыдущей.&lt;br /&gt;
&lt;br /&gt;
[[File:DBSCAN algo graph.png|thumb|center|800px| Граф алгоритма DBSCAN]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Так как в данном алгоритме присутствует параллелизм по данным, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(w)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; — количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|H| \log |H|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;|H|&amp;lt;/math&amp;gt; — максимальное количество элементов в области среди всех частей разбиения. Именно такую сложность имеет алгоритм PDBSCAN&amp;lt;ref&amp;gt;[http://www.ece.northwestern.edu/~choudhar/Publications/ANewScalableParallelDBSCANAlgorithmUsingDisjointSetDataStructure.pdf A New Scalable Parallel DBSCAN Algorithm Using the Disjoint-Set Data Structure \ Md. Mostofa Ali Patwary, Diana Palsetia, Ankit Agrawal, Wei-keng Liao, Fredrik Manne, Alok Choudhary]&amp;lt;/ref&amp;gt;, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, на котором определена функция расстояния &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;, в котором каждому элементу соответствует номер его кластера.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
* Алгоритм может определять кластера произвольной формы; &lt;br /&gt;
* Параллельная реализация при равномерном разбиении сбалансирована по количеству и виду производимых операций;&lt;br /&gt;
* Не требуется задание числа кластеров;&lt;br /&gt;
* Может выделять кластеры в присутствии шума;&lt;br /&gt;
* Не детерминирован относительно граничных точек кластеров.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:DBSCAN]]&lt;/div&gt;</summary>
		<author><name>Elmon</name></author>
	</entry>
</feed>