<?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=%D0%96%D0%B0%D0%BD%D0%BD%D0%B0%D1%82+%D0%A1%D0%B0%D0%B3%D0%B8%D0%BE%D0%BB%D0%B4%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0</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=%D0%96%D0%B0%D0%BD%D0%BD%D0%B0%D1%82+%D0%A1%D0%B0%D0%B3%D0%B8%D0%BE%D0%BB%D0%B4%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0"/>
	<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/%D0%96%D0%B0%D0%BD%D0%BD%D0%B0%D1%82_%D0%A1%D0%B0%D0%B3%D0%B8%D0%BE%D0%BB%D0%B4%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0"/>
	<updated>2026-10-22T22:39:26Z</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:Elena777mc/%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=15668</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=15668"/>
		<updated>2016-11-01T20:52:51Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: &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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]] (1.2,1.4-1.8,2.7), [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]] (1.1-1.3,1.9-1.10,3)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера.&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма &amp;lt;ref&amp;gt;http://stats.stackexchange.com/questions/194734/dbscan-what-is-a-core-point&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е.&lt;br /&gt;
 &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-соседей каждого объекта входного множества &amp;lt;math&amp;gt;X&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;
Алгоритм DBSCAN использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &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;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;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;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для того, чтобы алгоритм мог кластеризовать все объекты, необходимо пройти по каждому из них хотя бы один раз. Если использовать R*-дерево или kd-дерево для определения соседних объектов со сложностью &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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:Dbscan_schema.jpg|1000px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры&amp;lt;ref&amp;gt;https://github.com/bwoneill/pypardis/blob/master/plots/median_search_split/clusters_partitions.png&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
На каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных). Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных логарифмическая.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10683</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10683"/>
		<updated>2016-10-15T17:01:50Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: &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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера.&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е.&lt;br /&gt;
 &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10671</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10671"/>
		<updated>2016-10-15T16:59:30Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: &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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера.&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е.&lt;br /&gt;
 &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10632</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10632"/>
		<updated>2016-10-15T16:53:29Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера.&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е.&lt;br /&gt;
 &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10629</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10629"/>
		<updated>2016-10-15T16:52:47Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера.&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10623</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10623"/>
		<updated>2016-10-15T16:51:39Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10621</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10621"/>
		<updated>2016-10-15T16:51:25Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10618</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10618"/>
		<updated>2016-10-15T16:50:07Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с /varepsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10615</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10615"/>
		<updated>2016-10-15T16:49:46Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;varepsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10605</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10605"/>
		<updated>2016-10-15T16:47:42Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10602</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10602"/>
		<updated>2016-10-15T16:47:26Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &amp;lt;math&amp;gt;varepsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10599</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10599"/>
		<updated>2016-10-15T16:46:35Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \var{epsilon});&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10596</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10596"/>
		<updated>2016-10-15T16:46:02Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon\);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10591</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10591"/>
		<updated>2016-10-15T16:45:16Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10563</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10563"/>
		<updated>2016-10-15T16:39:34Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
* может определять кластера произвольной формы; &lt;br /&gt;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
* не требуется задание числа кластеров;&lt;br /&gt;
* может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
* число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
* не может построить иерархическую структуру кластеров;&lt;br /&gt;
* не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10165</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10165"/>
		<updated>2016-10-15T15:11:56Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10141</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10141"/>
		<updated>2016-10-15T15:07:59Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10134</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10134"/>
		<updated>2016-10-15T15:06:39Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10117</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10117"/>
		<updated>2016-10-15T15:04:14Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10106</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10106"/>
		<updated>2016-10-15T15:01:50Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10103</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10103"/>
		<updated>2016-10-15T15:01:35Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;.АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10097</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10097"/>
		<updated>2016-10-15T15:00:18Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;.АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10094</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10094"/>
		<updated>2016-10-15T14:59:50Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;.АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Proc. Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10091</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10091"/>
		<updated>2016-10-15T14:59:20Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;.Ester, M. 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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.  &amp;lt;ref&amp;gt;.АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ&lt;br /&gt;
СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ/ И. А. Пестунов, Ю. Н. Синявский// Proc. Вестник Кемеровского государственного университета. – 2012. – P. 263–&lt;br /&gt;
299.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10064</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10064"/>
		<updated>2016-10-15T14:54:52Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;.Ester, M. 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. – P. 226 –&lt;br /&gt;
231.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10036</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10036"/>
		<updated>2016-10-15T14:49:58Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;Ester, Martin, et al. &amp;quot;A density-based algorithm for discovering clusters in large spatial databases with noise.&amp;quot; Kdd. Vol. 96. No. 34. 1996.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;&amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10034</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10034"/>
		<updated>2016-10-15T14:49:31Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;Ester, Martin, et al. &amp;quot;A density-based algorithm for discovering clusters in large spatial databases with noise.&amp;quot; Kdd. Vol. 96. No. 34. 1996.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: разбиение объектов по кластерам. Количество кластеров зависит от исходных данных.  &amp;lt;ref&amp;gt;Ester, Martin, et al. &amp;quot;Xu, X. A fast parallel clustering algorithm for large spatial databases / X. Xu, M. Ester, H.-P. Kriegel // Proc. 1999 Intern. Conf. on Knowledge Discovery and Data Mining. – 1999. – Vol. 3, is. 3. – P. 263 – 290.&amp;lt;/ref&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;x \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10009</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10009"/>
		<updated>2016-10-15T14:43:12Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) &amp;lt;ref&amp;gt;Ester, Martin, et al. &amp;quot;A density-based algorithm for discovering clusters in large spatial databases with noise.&amp;quot; Kdd. Vol. 96. No. 34. 1996.&amp;lt;/ref&amp;gt; –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=10003</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=10003"/>
		<updated>2016-10-15T14:41:37Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n (размерность входящего множества)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n (размерность выходящего множества)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9988</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9988"/>
		<updated>2016-10-15T14:39:52Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: n &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: n&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9981</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9981"/>
		<updated>2016-10-15T14:39:23Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из &amp;lt;math&amp;gt;{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;:  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9975</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9975"/>
		<updated>2016-10-15T14:38:51Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из math{R}^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;:  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9968</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9968"/>
		<updated>2016-10-15T14:37:57Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из mathbb{R}^n&amp;lt;/mathbb&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;:  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Преимущества алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
# может определять кластера произвольной формы; &lt;br /&gt;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&lt;br /&gt;
# не требуется задание числа кластеров;&lt;br /&gt;
# может выделять кластеры в присутствии «шума»и выбросов;&lt;br /&gt;
# число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Недостатки алгоритма &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера;&lt;br /&gt;
# не может построить иерархическую структуру кластеров;&lt;br /&gt;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9962</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9962"/>
		<updated>2016-10-15T14:37:28Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из mathbb{R}^n&amp;lt;/mathbb&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;:  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;:&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9938</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9938"/>
		<updated>2016-10-15T14:33:41Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&amp;lt;references \&amp;gt;[https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
&amp;lt;references \&amp;gt;[http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9931</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9931"/>
		<updated>2016-10-15T14:33:15Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9929</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9929"/>
		<updated>2016-10-15T14:32:58Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9928</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9928"/>
		<updated>2016-10-15T14:32:43Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9927</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9927"/>
		<updated>2016-10-15T14:32:13Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
==== Литература ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9924</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9924"/>
		<updated>2016-10-15T14:31:48Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9921</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9921"/>
		<updated>2016-10-15T14:31:31Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Законченные статьи]]&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9904</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9904"/>
		<updated>2016-10-15T14:29:07Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* 1.10.2 Недостатки алгоритма [править] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9900</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9900"/>
		<updated>2016-10-15T14:28:43Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* 1.10.1 Преимущества алгоритма [править] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
== 1.10.2 Недостатки алгоритма [править] ==&lt;br /&gt;
1. не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован. &lt;br /&gt;
2. не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера.&lt;br /&gt;
3. не может построить иерархическую структуру кластеров&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9898</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9898"/>
		<updated>2016-10-15T14:28:32Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
# параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon);&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;
# не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован.&lt;br /&gt;
&lt;br /&gt;
== 1.10.1 Преимущества алгоритма [править] ==&lt;br /&gt;
1. алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
2. может определять кластера произвольной формы;&lt;br /&gt;
3. параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon).&lt;br /&gt;
4. не требуется задание числа кластеров;&lt;br /&gt;
5. может выделять кластеры в присутствии «шума»и выбросов&lt;br /&gt;
6. число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
== 1.10.2 Недостатки алгоритма [править] ==&lt;br /&gt;
1. не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован. &lt;br /&gt;
2. не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера.&lt;br /&gt;
3. не может построить иерархическую структуру кластеров&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9888</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9888"/>
		<updated>2016-10-15T14:25:38Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
=== 1. алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных; 2. может определять кластера произвольной формы; 3. параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon). 4. не требуется задание числа кластеров; 5. может выделять кластеры в присутствии «шума»и выбросов 6. число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
== 1.10.1 Преимущества алгоритма [править] ==&lt;br /&gt;
1. алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
2. может определять кластера произвольной формы;&lt;br /&gt;
3. параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon).&lt;br /&gt;
4. не требуется задание числа кластеров;&lt;br /&gt;
5. может выделять кластеры в присутствии «шума»и выбросов&lt;br /&gt;
6. число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
== 1.10.2 Недостатки алгоритма [править] ==&lt;br /&gt;
1. не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован. &lt;br /&gt;
2. не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера.&lt;br /&gt;
3. не может построить иерархическую структуру кластеров&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9876</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9876"/>
		<updated>2016-10-15T14:24:19Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
== 1.10.1 Преимущества алгоритма [править] ==&lt;br /&gt;
1. алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
2. может определять кластера произвольной формы;&lt;br /&gt;
3. параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon).&lt;br /&gt;
4. не требуется задание числа кластеров;&lt;br /&gt;
5. может выделять кластеры в присутствии «шума»и выбросов&lt;br /&gt;
6. число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
== 1.10.2 Недостатки алгоритма [править] ==&lt;br /&gt;
1. не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован. &lt;br /&gt;
2. не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера.&lt;br /&gt;
3. не может построить иерархическую структуру кластеров&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9873</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9873"/>
		<updated>2016-10-15T14:23:45Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
1.10.1 Преимущества алгоритма [править]&lt;br /&gt;
1. алгоритм может обрабатывать большой объем данных и не зависит от порядка ввода данных;&lt;br /&gt;
2. может определять кластера произвольной формы;&lt;br /&gt;
3. параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon).&lt;br /&gt;
4. не требуется задание числа кластеров;&lt;br /&gt;
5. может выделять кластеры в присутствии «шума»и выбросов&lt;br /&gt;
6. число итераций определяется заранее&lt;br /&gt;
&lt;br /&gt;
1.10.2 Недостатки алгоритма [править]&lt;br /&gt;
1. не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован. &lt;br /&gt;
2. не может выделять кластеры сложной структуры, например, имеющие разную плотность, так как параметры алгоритма не могут быть выбраны отдельно для каждого кластера.&lt;br /&gt;
3. не может построить иерархическую структуру кластеров&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9819</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9819"/>
		<updated>2016-10-15T14:08:11Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &amp;lt;math&amp;gt;O(n \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;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность, как отношение числа операций к суммарному объему входных и выходных данных линейна.&lt;br /&gt;
&lt;br /&gt;
1. может определять кластера произвольной формы;&lt;br /&gt;
2. параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с \varepsilon).&lt;br /&gt;
3. не требует указывать число кластеров;&lt;br /&gt;
4. может определять шум и устойчив к выбросам;&lt;br /&gt;
5. требует всего два параметра и по в большинстве случаев не чувствителен к порядку заданных точек;&lt;br /&gt;
6. не детерминирован, так как граничные точки, достижимые из более, чем одного кластера, могут быть частью любого из них в зависимости от порядка обрабатываемых данных. Однако такая ситуация возникает редко, а относительно ядровых точек и шума DBSCAN детерминирован. Впрочем, от недетерминизма можно избавиться, если считать все граничные точки шумом (алгоритм DBSCAN*);&lt;br /&gt;
качество алгоритма зависит от используемой функции расстояния D. Наиболее часто используемое Евклидово расстояние в многомерных множествах может оказаться практически бесполезным из-за так называемого &amp;quot;проклятия размерности&amp;quot;, значительно затрудняя нахождение подходящего значения \varepsilon;&lt;br /&gt;
не может выделять кластеры, имеющие разную плотность, так как параметры алгоритма не могут быть выбранны отдельно для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9768</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9768"/>
		<updated>2016-10-15T13:47:20Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</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:Elena777mc/%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=9765</id>
		<title>Участник:Elena777mc/Плотностный алгоритм кластеризации 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:Elena777mc/%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=9765"/>
		<updated>2016-10-15T13:46:38Z</updated>

		<summary type="html">&lt;p&gt;Жаннат Сагиолданова: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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(|X| \log |X|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&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;
Основные авторы описания: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Кластеризация – это процесс разбиения множества с &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; элементами &amp;lt;math&amp;gt;x_1, x_2, ... , x_n (x_n&amp;lt;/math&amp;gt; имеет размерность  &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;) на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, так, чтобы в каждом кластере все элементы были схожи&lt;br /&gt;
в каком-то смысле. &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм DBSCAN (Density Based Spatial Clustering of Applications with Noise) –плотностной алгоритм для кластеризации пространственных данных с присутствием шума, был предложен Мартином Эстер, Гансом-Питером Кригель и их коллегами в 1996 году как решение проблемы разбиения (изначально пространственных) данных на кластеры произвольной формы. &lt;br /&gt;
&lt;br /&gt;
Большинство алгоритмов, производящих плоское разбиение, создают кластеры по форме близкие к сферическим, так как минимизируют расстояние точки до центра кластера&lt;br /&gt;
&lt;br /&gt;
Авторы DBSCAN экспериментально показали, что их алгоритм способен распознать кластеры различной формы.&lt;br /&gt;
Идея, положенная в основу алгоритма, заключается в том, что внутри каждого кластера плотность точек (объектов) заметно выше, чем плотность снаружи кластера, а также плотность в областях с шумом ниже плотности любого из кластеров. Еще точнее, для каждой точки кластера ее окрестность в диапазоне заданного радиуса должна содержать не менее некоторого числа точек, которое задается пороговым значением.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:dbscan_osn.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Исходные данные: объекты, которые нужно кластеризовать, параметры &amp;lt;math&amp;gt;MinPts, \  \varepsilon&amp;lt;/math&amp;gt; . Между объектами можно считать расстояния.&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 \in X&amp;lt;/math&amp;gt; понимается множество точек, расстояние до которых не превышает &amp;lt;math&amp;gt;\varepsilon &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt;N_\varepsilon (x) = \{y \in X | D(x, y) \le \varepsilon\}&amp;lt;/math&amp;gt;. Тогда точка &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; достижима из точки &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, если существует последовательность точек &amp;lt;math&amp;gt;x^{(1)}=x, x^{(2)},... , x^{(p-1)}, x^{(p)}=y&amp;lt;/math&amp;gt;, для которой выполнено:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
  \begin{align}&lt;br /&gt;
x^{(i+1)} \in N_\varepsilon (x^{(i)}), i=1,... ,p-1 \\&lt;br /&gt;
\mid  N_\varepsilon (x^{(i)}) \mid \ge MinPts, i=1,... ,p-1&lt;br /&gt;
  \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь значение &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; задаётся пользователем и регулирует порог «шума». Согласно второму условию, у точек, находящихся внутри кластера, должно быть не менее &amp;lt;math&amp;gt;MinPts \   \varepsilon&amp;lt;/math&amp;gt; -соседей. Такие точки называются «ядрами». Остальные точки разделяются на граничные (имеющие менее &amp;lt;math&amp;gt;MinPts \   \varepsilon &amp;lt;/math&amp;gt; -cоседей, но достижимые из какого-либо «ядра») и шумовые. Две точки связны, если существует «ядро», из которого они обе достижимы.&lt;br /&gt;
При такой постановке задачи, под кластером понимается максимальное связное подмножество множества &amp;lt;math&amp;gt;X&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;
Вычислительным ядром алгоритма является нахождение &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 использует пространственную структуру данных для определения соседних объектов. Это может быть R*-дерево или kd-дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt;, в, это расстояние можно вводить разными способами. Например, если &amp;lt;math&amp;gt;\rho(u,v)&amp;lt;/math&amp;gt; - метрика в евклидовом пространстве, &amp;lt;math&amp;gt;u=(u_1,...,u_n)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(v_1,...,v_n)&amp;lt;/math&amp;gt;, то расстояние вычисляется следующим образом: &amp;lt;math&amp;gt;\rho(u,v)=\sqrt{(u_1-v_1)^2+(u_2-v_2)^2+...+(u_n-v_n)^2} = \sqrt{\sum_{k=1}^n(u_k-v_k)^2}&amp;lt;/math&amp;gt;&lt;br /&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;X&amp;lt;/math&amp;gt;не кластеризованы&lt;br /&gt;
    &amp;lt;math&amp;gt;FORALL&amp;lt;/math&amp;gt;  objects  &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;X\  DO&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;IF\  x&amp;lt;/math&amp;gt; is unclassified&lt;br /&gt;
         call function &amp;lt;math&amp;gt;expand\_cluster&amp;lt;/math&amp;gt; to construct a cluster wrt. &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;MinPts&amp;lt;/math&amp;gt; containing &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ expand\_cluster(x,X,\varepsilon, MinPts):&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(x) \mid &amp;lt; MinPts&amp;lt;/math&amp;gt; //т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - не ядровой объект&lt;br /&gt;
       mark &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;  and &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;;&lt;br /&gt;
    &amp;lt;math&amp;gt;ELSE&amp;lt;/math&amp;gt;//т.е. &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - ядровой объект&lt;br /&gt;
       select a new cluster-id and mark all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt; with this current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;; &lt;br /&gt;
       push all objects from &amp;lt;math&amp;gt;N_{\varepsilon}(x)&amp;lt;/math&amp;gt;\&amp;lt;math&amp;gt;(x)&amp;lt;/math&amp;gt; onto the stack seeds;&lt;br /&gt;
       &amp;lt;math&amp;gt;WHILE\ NOT&amp;lt;/math&amp;gt; seeds.empty() &amp;lt;math&amp;gt;DO&amp;lt;/math&amp;gt; &lt;br /&gt;
         &amp;lt;math&amp;gt;currentObject&amp;lt;/math&amp;gt; := seeds.top();&lt;br /&gt;
         seeds.pop();&lt;br /&gt;
         &amp;lt;math&amp;gt;retrive\_\varepsilon neighborhood(currentObject, \varepsilon)&amp;lt;/math&amp;gt;;&lt;br /&gt;
         &amp;lt;math&amp;gt;IF \mid N_{\varepsilon}(currentObjects) \mid \ge MinPts&amp;lt;/math&amp;gt;&lt;br /&gt;
           select all objects in &amp;lt;math&amp;gt;N_{\varepsilon}(currentObject)&amp;lt;/math&amp;gt; not yet classified or marked as &amp;lt;math&amp;gt;noise&amp;lt;/math&amp;gt;,&lt;br /&gt;
           push the unclassified objects onto seeds and mark all of these objects with current &amp;lt;math&amp;gt;cluster-id&amp;lt;/math&amp;gt;;&lt;br /&gt;
     &amp;lt;math&amp;gt;RETURN&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;FUNCTION\ retrive\_\varepsilon neighborhood(x, \varepsilon)&amp;lt;/math&amp;gt; //функция возвращает соседей на основе пространственной структуры данных&lt;br /&gt;
   return &amp;lt;math&amp;gt;\{ x&#039; \ | \ \forall x&#039; \in X: \rho(x, x&#039;) &amp;lt; \varepsilon \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&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;, так как придется считать полную матрицу расстояний между объектами.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В настоящем алгоритме осуществляется параллелизм по данным. Ниже представлена общая структура данного алгоритма. &lt;br /&gt;
[[File:dbscan_schema1.jpg|500px|thumb|center|Рис.1. Общая информационная структура алгоритма]]&lt;br /&gt;
Разбиение данных происходит с помощью пространственной структуры данных (R*-дерево, kd-дерево), которая разбивает все множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; частей: &amp;lt;math&amp;gt;X_1,X_2,...,X_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры]]&lt;br /&gt;
Далее на каждой части объектов применяется алгоритм PDBSCAN (каждая часть использует пространственную структуру данных, которая распределяется вместе с каждой частью данных), структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.3. Информационная структура алгоритма PDBSCAN]]&lt;br /&gt;
Данный алгоритм отличается от общего алгоритма DBSCAN тем, что применяется к части объектов и для каждой из этих частей определяет кандидатов на слияние. Если для ядрового объекта части &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-окрестности находится объект из другой части &amp;lt;math&amp;gt;X_j&amp;lt;/math&amp;gt;, то такие объекты становятся кандидатами на слияние. &lt;br /&gt;
&lt;br /&gt;
Само слияние осуществляется следующим образом: для каждой пары кандидатов на слияние, объединяем кластеры, соответствующие этим кандидатам в один общий кластер.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Как видно из общей структуры графа алгоритма, ширина ярусно-параллельной формы алгоритма &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, где m - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(|X| \log |X|)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mid X \mid&amp;lt;/math&amp;gt; - максимальное количество среди числа объектов в каждой части разбиения. Именно такую сложность имеет алгоритм PDBSCAN, применяемый к каждой отдельной части разбиения.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входной информацией является множество точек X из n-мерного пространства, на котором определена функция расстояния D. В наиболее распространенном случае пространственной кластеризации используется Евлидова метрика между векторами из \mathb{R}^n.&lt;br /&gt;
&lt;br /&gt;
Выходом алгоритма является размеченное множество точек X, в котором каждой точке соответствует номер ее кластера. Обычно каждой точке из X сопоставляется ее номер, а на выходе алгоритм дает отображение номеров точек в номера соответствующих им кластеров, например в виде вектора размера |X|&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;
* [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html Scikit learn (Python, последовательная реализация)]&lt;br /&gt;
* [http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Northwestern University (C++, параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/ContinuumIO/parallel_dbscan github/ContinuumIO (Python, параллельная реализация)]&lt;br /&gt;
* [https://github.com/propanoid/DBSCAN github/propanoid (C++, последовательная реализация VP tree)]&lt;br /&gt;
* [https://github.com/dparks1134/DBSCAN github/dparks1134 (С++, последовательная реализация)]&lt;br /&gt;
* [https://github.com/ahbarnett/validspike/tree/master/contrib/dbscan_patwary Disjoint-Set Data Structure based Parallel DBSCAN (C++ параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/bwoneill/pypardis github/bwoneill (Spark/Python параллельная реализация kd-tree)]&lt;br /&gt;
* [https://github.com/alitouka/spark_dbscan github/alitouka (Spark/Scala параллельная реализация)]&lt;br /&gt;
* [https://github.com/mhahsler/dbscan CRAN (R, последовательная реализация)]&lt;br /&gt;
* [https://pdfs.semanticscholar.org/a3f8/a3948e5999def4a0819d0dbaef2ae05e1599.pdf (A Fast Parallel Clustering Algorithm for Large&lt;br /&gt;
Spatial Databases, JOCHEN JAGER, HANS-PETER KRIEGEL)]&lt;br /&gt;
* [http://cyberleninka.ru/article/n/algoritmy-klasterizatsii-v-zadachah-segmentatsii-sputnikovyh-izobrazheniy (АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ В ЗАДАЧАХ СЕГМЕНТАЦИИ СПУТНИКОВЫХ ИЗОБРАЖЕНИЙ, Пестунов Игорь Алексеевич, Синявский Юрий Николаевич)]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Жаннат Сагиолданова</name></author>
	</entry>
</feed>