<?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=Elena777mc</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=Elena777mc"/>
	<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/Elena777mc"/>
	<updated>2026-10-22T20:43:32Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Elena777mc&amp;diff=18629</id>
		<title>Обсуждение участника:Elena777mc</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Elena777mc&amp;diff=18629"/>
		<updated>2016-11-20T18:39:06Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) п1.1 - что такое плоское разбиение? Поясните&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
2) п1.2 - рисунок малоинформативный. Что такое Border, Core и т.д.? Наверно, лучше сделать надписи по-русски, раз уж статья на русском&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
3) п1.4 - про деревья здесь лишнее, макроструктура - это описание алгоритма с &amp;quot;птичьего полета&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
4) п1.5 вместо &amp;quot;ядровой объект&amp;quot; лучше &amp;quot;объект, являющийся ядром&amp;quot; ; вместо комментариев &amp;quot;// Вспомогательная функция&amp;quot; лучше сделать подписи к кускам кода&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
5) п1.7 - что такое PDBSCAN? На рис.2 с разбиением не очень понятно, что значат разноцветные    &lt;br /&gt;
  прямоугольники.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;/div&gt;</summary>
		<author><name>Elena777mc</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=18627</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=18627"/>
		<updated>2016-11-20T18:38:24Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&lt;br /&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|Малахова Е.С.]] (1.2, 1.4-1.8, 2.4, 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_picture.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма. Точка A - ядровая, точки  B и С - граничные, N - шум. В данном примере MinPts = 4, Eps равен радиусу окружности &amp;lt;ref&amp;gt;https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/DBSCAN-Illustration.svg/400px-DBSCAN-Illustration.svg.png&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 использует пространственную структуру данных для определения соседних объектов. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &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;
На каждой части объектов применяется алгоритм PDBSCAN. PDBSCAN - это последовательный алгоритм DBSCAN, применяемый только к одной части объектов, и для каждой из этих частей он определяет кандидатов на слияние. PDBSCAN использует пространственную структуру, которая распределяется вместе с данными.&lt;br /&gt;
Если для ядрового объекта части &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;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры. Каждый прямоугольник соответствует части данных, каждая из которых подается на вход алгоритму PDBSCAN &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;
&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективности на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Elena777mc&amp;diff=18626</id>
		<title>Обсуждение участника:Elena777mc</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Elena777mc&amp;diff=18626"/>
		<updated>2016-11-20T18:37:43Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) п1.1 - что такое плоское разбиение? Поясните&lt;br /&gt;
-- Сделано&lt;br /&gt;
&lt;br /&gt;
2) п1.2 - рисунок малоинформативный. Что такое Border, Core и т.д.? Наверно, лучше сделать надписи по-русски, раз уж статья на русском&lt;br /&gt;
-- Сделано&lt;br /&gt;
&lt;br /&gt;
3) п1.4 - про деревья здесь лишнее, макроструктура - это описание алгоритма с &amp;quot;птичьего полета&amp;quot;&lt;br /&gt;
-- Сделано&lt;br /&gt;
&lt;br /&gt;
4) п1.5 вместо &amp;quot;ядровой объект&amp;quot; лучше &amp;quot;объект, являющийся ядром&amp;quot; ; вместо комментариев &amp;quot;// Вспомогательная функция&amp;quot; лучше сделать подписи к кускам кода&lt;br /&gt;
&lt;br /&gt;
5) п1.7 - что такое PDBSCAN? На рис.2 с разбиением не очень понятно, что значат разноцветные    &lt;br /&gt;
  прямоугольники.&lt;br /&gt;
-- Сделано&lt;/div&gt;</summary>
		<author><name>Elena777mc</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=18624</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=18624"/>
		<updated>2016-11-20T18:35:29Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&lt;br /&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|Малахова Е.С.]] (1.2, 1.4-1.8, 2.4, 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_picture.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма. Точка A - ядровая, точки  B и С - граничные, N - шум. В данном примере MinPts = 4, Eps равен радиусу окружности &amp;lt;ref&amp;gt;https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/DBSCAN-Illustration.svg/400px-DBSCAN-Illustration.svg.png&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 использует пространственную структуру данных для определения соседних объектов. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &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;
На каждой части объектов применяется алгоритм PDBSCAN. PDBSCAN - это последовательный алгоритм DBSCAN, применяемый только к одной части объектов, и для каждой из этих частей он определяет кандидатов на слияние. PDBSCAN использует пространственную структуру, которая распределяется вместе с данными.&lt;br /&gt;
Если для ядрового объекта части &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;
[[File:dbscan_clusters_partitions.png|500px|thumb|center|Рис.2. Пример разбиения объектов на части на основе пространственной структуры. Каждый прямоугольник соответствует части данных, каждая из которых подается на вход алгоритму PDBSCAN &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;
&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективности на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=18623</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=18623"/>
		<updated>2016-11-20T18:32:07Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&lt;br /&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|Малахова Е.С.]] (1.2, 1.4-1.8, 2.4, 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_picture.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма. Точка A - ядровая, точки  B и С - граничные, N - шум. В данном примере MinPts = 4, Eps равен радиусу окружности &amp;lt;ref&amp;gt;https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/DBSCAN-Illustration.svg/400px-DBSCAN-Illustration.svg.png&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 использует пространственную структуру данных для определения соседних объектов. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &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. PDBSCAN - это последовательный алгоритм DBSCAN, применяемый только к одной части объектов, и для каждой из этих частей он определяет кандидатов на слияние. PDBSCAN использует пространственную структуру, которая распределяется вместе с данными.&lt;br /&gt;
Если для ядрового объекта части &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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективности на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=18621</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=18621"/>
		<updated>2016-11-20T18:20:58Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&lt;br /&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|Малахова Е.С.]] (1.2, 1.4-1.8, 2.4, 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_picture.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма. Точка A - ядровая, точки  B и С - граничные, N - шум. В данном примере MinPts = 4, Eps равен радиусу окружности &amp;lt;ref&amp;gt;https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/DBSCAN-Illustration.svg/400px-DBSCAN-Illustration.svg.png&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 использует пространственную структуру данных для определения соседних объектов. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективности на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=18620</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=18620"/>
		<updated>2016-11-20T18:19:15Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&lt;br /&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|Малахова Е.С.]] (1.2, 1.4-1.8, 2.4, 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_picture.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма. Точка A - ядровая, точки  B и С - граничные, N - шум. В данном примере MinPts = 4, Eps равен радиусу окружности &amp;lt;ref&amp;gt;https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/DBSCAN-Illustration.svg/400px-DBSCAN-Illustration.svg.png&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 использует пространственную структуру данных для определения соседних объектов. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Сложность построения таких структур &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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективности на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=18618</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=18618"/>
		<updated>2016-11-20T18:17:45Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&lt;br /&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|Малахова Е.С.]] (1.2, 1.4-1.8, 2.4, 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_picture.png|thumb|right|500px| Рис. 1. Пример ядровых, граничных и шумовых точек алгоритма. Точка A - ядровая, точки  B и С - граничные, N - шум. В данном примере MinPts = 4, Eps равен радиусу окружности &amp;lt;ref&amp;gt;https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/DBSCAN-Illustration.svg/400px-DBSCAN-Illustration.svg.png&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективности на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=18616</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=18616"/>
		<updated>2016-11-20T18:07:47Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&lt;br /&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|Малахова Е.С.]] (1.2, 1.4-1.8, 2.4, 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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективности на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17764</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=17764"/>
		<updated>2016-11-16T18:11:31Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&lt;br /&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|Малахова Е.С.]] (1.2, 1.4-1.8, 2.4, 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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективности на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17763</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=17763"/>
		<updated>2016-11-16T18:07:28Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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.4, 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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.  Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективность на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17762</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=17762"/>
		<updated>2016-11-16T18:02:49Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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.4, 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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
Перечислим некоторые особенности тестируемой параллельной реализации:&lt;br /&gt;
&lt;br /&gt;
* Алгоритм тестировался на известном датасете для кластеризации: [https://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption Machine Learning Repository]&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективность на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17759</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=17759"/>
		<updated>2016-11-16T17:50:38Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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.4, 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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
Перечислим некоторые особенности тестируемой параллельной реализации:&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективность на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - При увеличении размерности системы при фиксированном количестве процессов на области изменений значений параметров наблюдается увеличение эффективности. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается уменьшение эффективности. При этом скорость убывания эффективности крайне низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17758</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=17758"/>
		<updated>2016-11-16T17:42:43Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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.4, 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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
Перечислим некоторые особенности тестируемой параллельной реализации:&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективность на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается увеличение эффективности. При этом скорость возрастания эффективности достаточно низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17757</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=17757"/>
		<updated>2016-11-16T17:41:50Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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.4,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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
Перечислим некоторые особенности тестируемой параллельной реализации:&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективность на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается увеличение эффективности. При этом скорость возрастания эффективности достаточно низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17755</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=17755"/>
		<updated>2016-11-16T17:35:28Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
Перечислим некоторые особенности тестируемой параллельной реализации:&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективность на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается увеличение эффективности. При этом скорость возрастания эффективности достаточно низкая.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/elena777mc/dbscan/tree/master Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17754</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=17754"/>
		<updated>2016-11-16T17:32:41Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Перечислим некоторые особенности тестируемой параллельной реализации:&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности распараллеливания алгоритма DBSCAN в зависимости от изменяемых параметров запуска.&lt;br /&gt;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости протестированной параллельной реализации алгоритма DBSCAN: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов наблюдается уменьшение эффективность на всей области рассматриваемых значений параметров. При этом с ростом числа процессов снижение эффективности замедляется. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; - &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При одновременном увеличении количества процессов и размерности системы&#039;&#039;&#039; наблюдается увеличение эффективности. При этом скорость возрастания эффективности достаточно низкая.&lt;br /&gt;
&lt;br /&gt;
[http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17750</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=17750"/>
		<updated>2016-11-16T16:24:44Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&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;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
[http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17512</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=17512"/>
		<updated>2016-11-16T00:04:14Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 24] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&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;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
[http://cucis.ece.northwestern.edu/projects/Clustering/download_code_dbscan.html Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17511</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=17511"/>
		<updated>2016-11-16T00:03:26Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 24] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&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;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
&lt;br /&gt;
[ Исследованная параллельная реализация на языке C++]&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>Elena777mc</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=17510</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=17510"/>
		<updated>2016-11-16T00:00:11Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 24] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&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;
[[File:Dbscan_perfomance.png|800px|thumb|center|Рис.1. Изменение производительности в зависимости от числа процессов и числа входных данных]]&lt;br /&gt;
[[File:Dbscan_efficiency.png|800px|thumb|center|Рис.2. Изменение эффективности распараллеливания в зависимости от числа процессов и числа входных данных]]&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>Elena777mc</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=17503</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=17503"/>
		<updated>2016-11-15T22:24:11Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Sleo}}&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;
Было проведено исследование масштабируемости параллельной реализации алгоритма DBSCAN . Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Исследовалась параллельная реализация алгоритма, написанная с использованием стандарта MPI. Распараллеливание проводилось по числу входных объектов, поэтому исследование масштабируемости проводилось для числа входных объектов.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 24] с шагом по степеням двойки;&lt;br /&gt;
*	число входных объектов [1000 : 40000].&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;
* [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>Elena777mc</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=15686</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=15686"/>
		<updated>2016-11-01T21:04:08Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Плотностный алгоритм кластеризации DBSCAN&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(|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>Elena777mc</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:%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&amp;diff=15672</id>
		<title>Обсуждение участницы:Жаннат Сагиолданова</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:%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&amp;diff=15672"/>
		<updated>2016-11-01T20:53:54Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Замечания к оформлению статьи:&lt;br /&gt;
&lt;br /&gt;
0. Если рисунок не ваш, то требуется указать ссылку на ресурс, откуда он был взят. &lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
1. Пункт 1.3 стоит расписать подробнее. Например, привести основные операции, которые применяются выч. ядре алгоритма.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
2. Пункт 1.6: &amp;quot;Если использовать специальную пространственную структуру данных&amp;quot; - поясните термин.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
3. Пункт 1.5 стоит подписать комментарии к всем трем блокам псевдокода.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
4. Почему в пункте 1.9 два описания входных и выходных данных?&lt;br /&gt;
&lt;br /&gt;
- Описание одно, просто для входных и выходных данных еще указан объем&lt;br /&gt;
&lt;br /&gt;
5. В постановке задачи имелось ввиду более подробное графическое описание информационного графа. (см. пример: https://algowiki-project.org/ru/%D0%A0%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A5%D0%BE%D0%BB%D0%B5%D1%86%D0%BA%D0%BE%D0%B3%D0%BE_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F). Информационный граф - ациклический.&lt;br /&gt;
&lt;br /&gt;
-Сделано&lt;br /&gt;
&lt;br /&gt;
6. Не указан вклад каждого из авторов статьи. &lt;br /&gt;
&lt;br /&gt;
-Сделано&lt;br /&gt;
&lt;br /&gt;
7. Вычислительная мощность не приведена. (см. пример: https://algowiki-project.org/ru/%D0%A0%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A5%D0%BE%D0%BB%D0%B5%D1%86%D0%BA%D0%BE%D0%B3%D0%BE_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F)&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;/div&gt;</summary>
		<author><name>Elena777mc</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=15667</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=15667"/>
		<updated>2016-11-01T20:52:09Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&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. Пример ядровых, граничных и шумовых точек алгоритма &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>Elena777mc</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=15660</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=15660"/>
		<updated>2016-11-01T20:48:27Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&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. Пример ядровых, граничных и шумовых точек алгоритма &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. Пример разбиения объектов на части на основе пространственной структуры]]&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>Elena777mc</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:%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&amp;diff=15632</id>
		<title>Обсуждение участницы:Жаннат Сагиолданова</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:%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&amp;diff=15632"/>
		<updated>2016-11-01T18:52:19Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Замечания к оформлению статьи:&lt;br /&gt;
&lt;br /&gt;
0. Если рисунок не ваш, то требуется указать ссылку на ресурс, откуда он был взят. &lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
1. Пункт 1.3 стоит расписать подробнее. Например, привести основные операции, которые применяются выч. ядре алгоритма.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
2. Пункт 1.6: &amp;quot;Если использовать специальную пространственную структуру данных&amp;quot; - поясните термин.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
3. Пункт 1.5 стоит подписать комментарии к всем трем блокам псевдокода.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
4. Почему в пункте 1.9 два описания входных и выходных данных?&lt;br /&gt;
&lt;br /&gt;
- Описание одно, просто для входных и выходных данных еще указан объем&lt;br /&gt;
&lt;br /&gt;
5. В постановке задачи имелось ввиду более подробное графическое описание информационного графа. (см. пример: https://algowiki-project.org/ru/%D0%A0%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A5%D0%BE%D0%BB%D0%B5%D1%86%D0%BA%D0%BE%D0%B3%D0%BE_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F). Информационный граф - ациклический.&lt;br /&gt;
&lt;br /&gt;
6. Не указан вклад каждого из авторов статьи. &lt;br /&gt;
&lt;br /&gt;
7. Вычислительная мощность не приведена. (см. пример: https://algowiki-project.org/ru/%D0%A0%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A5%D0%BE%D0%BB%D0%B5%D1%86%D0%BA%D0%BE%D0%B3%D0%BE_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F)&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;/div&gt;</summary>
		<author><name>Elena777mc</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=15631</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=15631"/>
		<updated>2016-11-01T18:51:56Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Свойства алгоритма */&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. Пример ядровых, граничных и шумовых точек алгоритма &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_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;
* параллельная реализация сбалансирована по количеству и виду производимых операций (вычисление расстояния, сравнение с &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>Elena777mc</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:%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&amp;diff=15629</id>
		<title>Обсуждение участницы:Жаннат Сагиолданова</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:%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&amp;diff=15629"/>
		<updated>2016-11-01T18:43:49Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Замечания к оформлению статьи:&lt;br /&gt;
&lt;br /&gt;
0. Если рисунок не ваш, то требуется указать ссылку на ресурс, откуда он был взят. &lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
1. Пункт 1.3 стоит расписать подробнее. Например, привести основные операции, которые применяются выч. ядре алгоритма.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
2. Пункт 1.6: &amp;quot;Если использовать специальную пространственную структуру данных&amp;quot; - поясните термин.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
3. Пункт 1.5 стоит подписать комментарии к всем трем блокам псевдокода.&lt;br /&gt;
&lt;br /&gt;
- Сделано&lt;br /&gt;
&lt;br /&gt;
4. Почему в пункте 1.9 два описания входных и выходных данных?&lt;br /&gt;
&lt;br /&gt;
- Описание одно, просто для входных и выходных данных еще указан объем&lt;br /&gt;
&lt;br /&gt;
5. В постановке задачи имелось ввиду более подробное графическое описание информационного графа. (см. пример: https://algowiki-project.org/ru/%D0%A0%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A5%D0%BE%D0%BB%D0%B5%D1%86%D0%BA%D0%BE%D0%B3%D0%BE_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F). Информационный граф - ациклический.&lt;br /&gt;
&lt;br /&gt;
6. Не указан вклад каждого из авторов статьи. &lt;br /&gt;
&lt;br /&gt;
7. Вычислительная мощность не приведена. (см. пример: https://algowiki-project.org/ru/%D0%A0%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A5%D0%BE%D0%BB%D0%B5%D1%86%D0%BA%D0%BE%D0%B3%D0%BE_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F)&lt;/div&gt;</summary>
		<author><name>Elena777mc</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:%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&amp;diff=15628</id>
		<title>Обсуждение участницы:Жаннат Сагиолданова</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:%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&amp;diff=15628"/>
		<updated>2016-11-01T18:43:25Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Замечания к оформлению статьи:&lt;br /&gt;
&lt;br /&gt;
0. Если рисунок не ваш, то требуется указать ссылку на ресурс, откуда он был взят. &lt;br /&gt;
&lt;br /&gt;
# Сделано&lt;br /&gt;
&lt;br /&gt;
1. Пункт 1.3 стоит расписать подробнее. Например, привести основные операции, которые применяются выч. ядре алгоритма.&lt;br /&gt;
&lt;br /&gt;
# Сделано&lt;br /&gt;
&lt;br /&gt;
2. Пункт 1.6: &amp;quot;Если использовать специальную пространственную структуру данных&amp;quot; - поясните термин.&lt;br /&gt;
&lt;br /&gt;
# Сделано&lt;br /&gt;
&lt;br /&gt;
3. Пункт 1.5 стоит подписать комментарии к всем трем блокам псевдокода.&lt;br /&gt;
&lt;br /&gt;
# Сделано&lt;br /&gt;
&lt;br /&gt;
4. Почему в пункте 1.9 два описания входных и выходных данных?&lt;br /&gt;
&lt;br /&gt;
# Описание одно, просто для входных и выходных данных еще указан объем&lt;br /&gt;
&lt;br /&gt;
5. В постановке задачи имелось ввиду более подробное графическое описание информационного графа. (см. пример: https://algowiki-project.org/ru/%D0%A0%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A5%D0%BE%D0%BB%D0%B5%D1%86%D0%BA%D0%BE%D0%B3%D0%BE_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F). Информационный граф - ациклический.&lt;br /&gt;
&lt;br /&gt;
6. Не указан вклад каждого из авторов статьи. &lt;br /&gt;
&lt;br /&gt;
7. Вычислительная мощность не приведена. (см. пример: https://algowiki-project.org/ru/%D0%A0%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A5%D0%BE%D0%BB%D0%B5%D1%86%D0%BA%D0%BE%D0%B3%D0%BE_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F)&lt;/div&gt;</summary>
		<author><name>Elena777mc</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=15627</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=15627"/>
		<updated>2016-11-01T18:41:47Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Схема реализации последовательного алгоритма */&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. Пример ядровых, граничных и шумовых точек алгоритма &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_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>Elena777mc</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=15624</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=15624"/>
		<updated>2016-11-01T18:34:53Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Последовательная сложность алгоритма */&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. Пример ядровых, граничных и шумовых точек алгоритма &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;
 &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;
Для того, чтобы алгоритм мог кластеризовать все объекты, необходимо пройти по каждому из них хотя бы один раз. Если использовать 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_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>Elena777mc</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=15623</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=15623"/>
		<updated>2016-11-01T18:30:39Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Вычислительное ядро алгоритма */&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. Пример ядровых, граничных и шумовых точек алгоритма &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;
 &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>Elena777mc</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=15619</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=15619"/>
		<updated>2016-11-01T18:14:07Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Макроструктура алгоритма */&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. Пример ядровых, граничных и шумовых точек алгоритма &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;. На эту часть алгоритма приходится основное время работы алгоритма, так как требуется найти всех соседей для каждого объекта заданного множества.&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>Elena777mc</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=15618</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=15618"/>
		<updated>2016-11-01T18:06:27Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Математическое описание алгоритма */&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. Пример ядровых, граничных и шумовых точек алгоритма &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;. На эту часть алгоритма приходится основное время работы алгоритма, так как требуется найти всех соседей для каждого объекта заданного множества.&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>Elena777mc</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=9778</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=9778"/>
		<updated>2016-10-15T13:51:39Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Макроструктура алгоритма */&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;
* [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>Elena777mc</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=9756</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=9756"/>
		<updated>2016-10-15T13:45:11Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&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]&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>Elena777mc</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=9731</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=9731"/>
		<updated>2016-10-15T13:35:37Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &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;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elena777mc</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=9670</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=9670"/>
		<updated>2016-10-15T13:22:12Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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. В наиболее распространенном случае пространственной кластеризации используется Евлидово метрика между векторами из \mathbb{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;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elena777mc</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=9626</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=9626"/>
		<updated>2016-10-15T13:13:54Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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;
== Свойства алгоритма ==&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9625</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=9625"/>
		<updated>2016-10-15T13:13:29Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Схема реализации последовательного алгоритма */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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*-дерево, которая разбивает все множество объектов &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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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;
== Свойства алгоритма ==&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9624</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=9624"/>
		<updated>2016-10-15T13:13:05Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Общее описание алгоритма */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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; //функция возвращает соседей на основе пространственной структуры данных (R*-дерево, kd-дерево)&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*-дерево, которая разбивает все множество объектов &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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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;
== Свойства алгоритма ==&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9623</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=9623"/>
		<updated>2016-10-15T13:12:59Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Макроструктура алгоритма */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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;
в каком-то смысле. 𝑥𝑖 могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&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; //функция возвращает соседей на основе пространственной структуры данных (R*-дерево, kd-дерево)&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*-дерево, которая разбивает все множество объектов &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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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;
== Свойства алгоритма ==&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9622</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=9622"/>
		<updated>2016-10-15T13:12:40Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Схема реализации последовательного алгоритма */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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;
в каком-то смысле. 𝑥𝑖 могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&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*-дерево или k-d дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &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;
 &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; //функция возвращает соседей на основе пространственной структуры данных (R*-дерево, kd-дерево)&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*-дерево, которая разбивает все множество объектов &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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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;
== Свойства алгоритма ==&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9621</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=9621"/>
		<updated>2016-10-15T13:12:00Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: &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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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;
в каком-то смысле. 𝑥𝑖 могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&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*-дерево или k-d дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &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;
 &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; //функция возвращает соседей на основе структуры R*-дерево&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*-дерево, которая разбивает все множество объектов &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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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;
== Свойства алгоритма ==&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9615</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=9615"/>
		<updated>2016-10-15T13:10:46Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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;
в каком-то смысле. 𝑥𝑖 могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&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*-дерево или k-d дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &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;
 &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; //функция возвращает соседей на основе структуры R*-дерево&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(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;
Разбиение данных происходит с помощью пространственной структуры данных, которая разбивает все множество объектов &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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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;
== Свойства алгоритма ==&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9589</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=9589"/>
		<updated>2016-10-15T13:04:13Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Ресурс параллелизма алгоритма */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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;
в каком-то смысле. 𝑥𝑖 могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&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*-дерево или k-d дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &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;
 &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; //функция возвращает соседей на основе структуры R*-дерево&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(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*-дерево, которая разбивает все множество объектов &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(n)&amp;lt;/math&amp;gt;, где n - количество частей, на которые разбиваются все входное множество объектов &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. Высотой ярусно-параллельной формы алгоритма является &amp;lt;math&amp;gt;O(\mid X \mid \log \mid X \mid)&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;
== Свойства алгоритма ==&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9383</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=9383"/>
		<updated>2016-10-15T12:06:48Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Математическое описание алгоритма */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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;
в каком-то смысле. 𝑥𝑖 могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&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*-дерево или k-d дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &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;
 &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; //функция возвращает соседей на основе структуры R*-дерево&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(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*-дерево, которая разбивает все множество объектов &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;
&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9355</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=9355"/>
		<updated>2016-10-15T11:56:05Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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;
в каком-то смысле. 𝑥𝑖 могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&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;
Исходные данные: объекты, которые нужно кластеризовать, параметры &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*-дерево или k-d дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &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;
 &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; //функция возвращает соседей на основе структуры R*-дерево&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(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*-дерево, которая разбивает все множество объектов &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;
&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;/div&gt;</summary>
		<author><name>Elena777mc</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=9336</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=9336"/>
		<updated>2016-10-15T11:50:41Z</updated>

		<summary type="html">&lt;p&gt;Elena777mc: /* Информационный граф */&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;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;-&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;
в каком-то смысле. 𝑥𝑖 могут быть числовыми, категориальными или смешанными данными.  В плотностных методах кластеры рассматриваются как регионы пространства данных с высокой плотностью объектов, которые разделены регионами с низкой плотностью объектов.&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;
Исходные данные: объекты, которые нужно кластеризовать, параметры &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*-дерево или k-d дерево. Такие структуры данных позволяют найти все объекты в пределах определенного расстояния от текущего объекта. Также для построения этих деревьев нужно уметь находить расстояние между объектами &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;
 &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; //функция возвращает соседей на основе структуры R*-дерево&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(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*-дерево, которая разбивает все множество объектов &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;.  Далее на каждой части объектов применяется алгоритм PDBSCAN, структура которого представлена ниже.&lt;br /&gt;
[[File:dbscan_schema2.jpg|500px|thumb|center|Рис.2. информационная структура алгоритма 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;
&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;/div&gt;</summary>
		<author><name>Elena777mc</name></author>
	</entry>
</feed>