<?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=JuliaA</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=JuliaA"/>
	<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/JuliaA"/>
	<updated>2026-10-22T19:53:46Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15370</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15370"/>
		<updated>2016-10-31T20:52:30Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; [1].]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации по выборке строк из точки-представителей сформировать &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров, их число задано заранее. Для каждой точки считается расстояние для всех остальных. Затем сравнивается расстояние между кластерами. За определение кластеров отвечают эти же точки. Похожие кластеры объединяются и их точки тоже. На каждом шаге алгоритма точки сдвигаются к центроиде. Алгоритм выполняется, пока не будет достигнуто необходимое число кластеров.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE4.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;log_2{n}&amp;lt;/math&amp;gt;. Эффективный метод описан в статье.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt; Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 log_2{n})&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные шаги алгоритма информационно зависят от предыдущих шагов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:InfoCURE.jpg|1100px|thumb|center|Общий информационных граф алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15369</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15369"/>
		<updated>2016-10-31T20:52:16Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; [1].]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации по выборке строк из точки-представителей сформировать &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров, их число задано заранее. Для каждой точки считается расстояние для всех остальных. Затем сравнивается расстояние между кластерами. За определение кластеров отвечают эти же точки. Похожие кластеры объединяются и их точки тоже. На каждом шаге алгоритма точки сдвигаются к центроиде. Алгоритм выполняется, пока не будет достигнуто необходимое число кластеров.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE4.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;log_2{n}&amp;lt;/math&amp;gt;. Эффективный метод описан в статье.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt; Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 log_2{n})&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные шаги алгоритма информационно зависят от предыдущих шагов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:InfoCURE.jpg|1100px|thumb|center|Общий информационных граф алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15367</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15367"/>
		<updated>2016-10-31T20:47:15Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; [1].]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации по выборке строк из точки-представителей сформировать &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, их число задано заранее. Для каждой точки считается расстояние для всех остальных. Затем сравнивается расстояние между кластерами. За определение кластеров отвечают эти же точки. Похожие кластеры объединяются и их точки тоже. На каждом шаге алгоритма точки сдвигаются к центроиде. Алгоритм выполняется, пока не будет достигнуто необходимое число кластеров.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE4.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;log_2{n}&amp;lt;/math&amp;gt;. Эффективный метод описан в статье.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt; Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 log_2{n})&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные шаги алгоритма информационно зависят от предыдущих шагов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:InfoCURE.jpg|1100px|thumb|center|Общий информационных граф алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:KittyTest.jpg|1100px|thumb|center|Котёнок]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15359</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15359"/>
		<updated>2016-10-31T20:35:47Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; [1].]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE4.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;log_2{n}&amp;lt;/math&amp;gt;. Эффективный метод описан в статье.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt; Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 log_2{n})&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные шаги алгоритма информационно зависят от предыдущих шагов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:InfoCURE.jpg|1100px|thumb|center|Общий информационных граф алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15354</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15354"/>
		<updated>2016-10-31T20:30:41Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE4.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;log_2{n}&amp;lt;/math&amp;gt;. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 log_2{n})&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные шаги алгоритма информационно зависят от предыдущих шагов.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15347</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15347"/>
		<updated>2016-10-31T20:26:12Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE4.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;log_2{n}&amp;lt;/math&amp;gt;. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 log_2{n})&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15346</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15346"/>
		<updated>2016-10-31T20:25:46Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE4.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;log_2 n&amp;lt;/math&amp;gt;. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 log_2 n)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15344</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15344"/>
		<updated>2016-10-31T20:25:05Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE3.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;logn&amp;lt;/math&amp;gt;. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15342</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15342"/>
		<updated>2016-10-31T20:24:50Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE3.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;logn&amp;lt;/math&amp;gt;. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15335</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15335"/>
		<updated>2016-10-31T20:15:54Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE2.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;logn&amp;lt;/math&amp;gt;. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15328</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15328"/>
		<updated>2016-10-31T20:05:51Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE2.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Сложность этого этапа &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;logn&amp;lt;/math&amp;gt;. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2n)&amp;lt;/math&amp;gt;. Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15325</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15325"/>
		<updated>2016-10-31T20:04:29Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE2.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; репрезентативных точек в d мерном пространстве и необходимое число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров. Для каждой точки необходимо вычислить расстояние до другой. Если искать ближайший кластер простым перебором, то сложность поиска будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; для каждого кластера. Но для эффективного поиска сложность составляет &amp;lt;math&amp;gt;logn&amp;lt;/math&amp;gt;. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции &amp;lt;math&amp;gt;O(2n)&amp;lt;/math&amp;gt;. Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15323</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=15323"/>
		<updated>2016-10-31T20:02:28Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Общее описание алгоритма|1.1]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]] - [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Математическое описание алгоритма|1.2]] - [[#Схема реализации последовательного алгоритма|1.5]], [[#Информационный граф|1.7]], [[#Масштабируемость алгоритма и его реализации|2.4]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; &amp;lt;ref&amp;gt;Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &amp;lt;/ref&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(a,b)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;a = (a_{1},\dots,a_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b = (b_{1},\dots,b_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(a,b) = \sqrt{\sum_{i=1}^n (a_{i} - b_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек-представителей. Для наилучшего отображения формы множества предполагается использование точек, максимально удалённых друг от друга.&lt;br /&gt;
&lt;br /&gt;
Для этого используем следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; - текущее количество представителей, &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й кластер, &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; - множество номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, назначенных представителями &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера, а &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - вектор-строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, задающая точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-мерном пространстве.&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt; = [] % Пустое множество&lt;br /&gt;
  a = Choose(&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) % Выбор произвольного номера точки, входящей в кластер &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
  Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,a) % Добавление точки а во множество представителей&lt;br /&gt;
  i = 1 % Текущее количество представителей кластера&lt;br /&gt;
  While (i&amp;lt;c) do % Хотим найти с представителей для кластера&lt;br /&gt;
  - rmax = 0&lt;br /&gt;
  - For ( (y &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt;) and (y &amp;lt;math&amp;gt;\notin&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt;) ) do % Поиск следующего представителя среди оставшихся точек кластера&lt;br /&gt;
  - - rmin = &amp;lt;math&amp;gt;\rho(x^{a}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt;&lt;br /&gt;
  - - For ( (j &amp;lt;math&amp;gt;\in&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;) and (j &amp;lt;math&amp;gt;\neq&amp;lt;/math&amp;gt; a) ) do % Поиск расстояния от точки с номером y до ближайшего представителя &lt;br /&gt;
  - - - d = &amp;lt;math&amp;gt;\rho(x^{j}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;x^{y})&amp;lt;/math&amp;gt; % вычисление расстояния&lt;br /&gt;
  - - - If (d &amp;lt; rmin) then&lt;br /&gt;
  - - - - rmin = d&lt;br /&gt;
  - - - endif&lt;br /&gt;
  - - enddo&lt;br /&gt;
  - - If (rmin &amp;gt; rmax) % Поиск точки, для которой расстояние до ближайшего представителя является максимальным&lt;br /&gt;
  - - - rmax = rmin&lt;br /&gt;
  - - - b = y % искомая точка&lt;br /&gt;
  - - endif&lt;br /&gt;
  - enddo&lt;br /&gt;
  - Add(&amp;lt;math&amp;gt;R_{k}&amp;lt;/math&amp;gt;,b) % Добавление новой точки в множество представителей&lt;br /&gt;
  - i = i + 1 % текущее число представителей&lt;br /&gt;
  enddo&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя &amp;lt;math&amp;gt;x^{y}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го кластера выполняется сдвиг к его центроиде &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{x}^{y} = \alpha\mu_{k} + (1-\alpha)x^{y}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получаем множество &amp;lt;math&amp;gt;\hat{R}_{k}&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек, которые будут далее использоваться как представители этого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE2.jpg|1100px|thumb|center|Схема работы алгоритма кластеризации CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.6 приведенные оценки сложности не обоснованы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Входные данные для кластеризации - это n репрезентативных точек в d мерном пространстве и необходимое число k кластеров. Для каждой точки необходимо вычислить расстояние до другой. Если искать ближайший кластер простым перебором, то сложность поиска будет O(n) для каждого кластера. Но для эффективного поиска сложность составляет logn. Далее каждую точку необходимо вдвинуть к центроиде, сложность этой операции O(2n). Таким образом худшее время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике &amp;lt;ref&amp;gt;Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&amp;lt;/ref&amp;gt;. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</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:%D0%9B%D1%83%D0%BA%D1%8C%D1%8F%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BD%D0%BD%D0%B0/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B92&amp;diff=12080</id>
		<title>Участник:Лукьянова Анна/Алгоритм кластеризации с использованием представлений2</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:%D0%9B%D1%83%D0%BA%D1%8C%D1%8F%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BD%D0%BD%D0%B0/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B92&amp;diff=12080"/>
		<updated>2016-10-15T21:02:15Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: А.Я. Лукьянова&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмa =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
===Понятие кластеризации===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны. Главное отличие кластеризации от классификации состоит в том, что перечень групп четко не задан и определяется в процессе работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
Применение кластерного анализа в общем виде сводится к следующим этапам:&lt;br /&gt;
&lt;br /&gt;
#Отбор выборки объектов для кластеризации.&lt;br /&gt;
#Определение множества переменных, по которым будут оцениваться объекты в выборке. При необходимости – нормализация значений переменных.&lt;br /&gt;
#Вычисление значений меры сходства между объектами.&lt;br /&gt;
#Применение метода кластерного анализа для создания групп сходных объектов (кластеров).&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;
&#039;&#039;Иерархические методы:&#039;&#039;&lt;br /&gt;
*Агломеративные методы AGNES (Agglomerative Nesting):&lt;br /&gt;
*Дивизимные методы DIANA (Divisive Analysis):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неиерархические методы.&#039;&#039;&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;
*Нечеткие. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Методы по количеству применений алгоритмов кластеризации:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*С одноэтапной кластеризацией;&lt;br /&gt;
&lt;br /&gt;
*С многоэтапной кластеризацией. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Методы по возможности расширения объема обрабатываемых данных:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Масштабируемые;&lt;br /&gt;
&lt;br /&gt;
*Немасштабируемые&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Методы по времени выполнения кластеризации:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Потоковые (on-line);&lt;br /&gt;
&lt;br /&gt;
*Не потоковые (off-line). &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
===CURE===&lt;br /&gt;
&lt;br /&gt;
Алгоритм &#039;&#039;&#039;CURE (Clustering Using REpresentatives)&#039;&#039;&#039; выполняет иерархическую кластеризацию с использованием набора определяющих точек для определения объекта в кластер. Относится к алгомеративным методам.&lt;br /&gt;
&lt;br /&gt;
Эта группа методов характеризуется последовательным объединением исходных элементов и соответствующим уменьшением числа кластеров.&lt;br /&gt;
&lt;br /&gt;
Назначение: кластеризация очень больших наборов числовых данных.&lt;br /&gt;
&lt;br /&gt;
Ограничения: эффективен для данных низкой размерности, работает только на числовых данных. &lt;br /&gt;
&lt;br /&gt;
Достоинства: &lt;br /&gt;
*выполняет кластеризацию на высоком уровне даже при наличии выбросов;&lt;br /&gt;
*выделяет кластеры сложной формы и различных размеров, &lt;br /&gt;
*обладает линейно зависимыми требованиями к месту хранения данных и временную сложность для данных высокой размерности.&lt;br /&gt;
&lt;br /&gt;
Недостатки: есть необходимость в задании пороговых значений и количества кластеров. &lt;br /&gt;
&lt;br /&gt;
Описание алгоритма :&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
[[file:Page1.png|thumb|center|1400px|Рисунок 1: Обзор CURE ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1:&#039;&#039;&#039; Построение дерева кластеров, состоящего из каждой строки входного набора данных.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2:&#039;&#039;&#039; Формирование «кучи» в оперативной памяти, расчет расстояния до ближайшего кластера (строки данных) для каждого кластера. При формировании кучи кластеры сортируются по возрастанию дистанции от кластера до ближайшего кластера. Расстояние между кластерами определяется по двум ближайшим элементам из соседних кластеров. Для определения расстояния между кластерами используются «манхеттенская», «евклидова» метрики или похожие на них функции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метрика Евклида:&#039;&#039; &amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;«Манхеттенская» метрика:&#039;&#039; &amp;lt;math&amp;gt;\rho(p,k) =\sum_{i=1}^n |p_{i} - k_{i}|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3:&#039;&#039;&#039; Слияние ближних кластеров в один кластер. Новый кластер получает все точки входящих в него входных данных. Расчет расстояния до остальных кластеров для новообразованного кластера. Для расчета расстояния кластеры делятся на две группы: первая группа – кластеры, у которых ближайшими кластерами считаются кластеры, входящие в новообразованный кластер, остальные кластеры – вторая группа. И при этом для кластеров из первой группы, если расстояние до новообразованного кластера меньше чем до предыдущего ближайшего кластера, то ближайший кластер меняется на новообразованный кластер. В противном случае ищется новый ближайший кластер, но при этом не берутся кластеры, расстояния до которых больше, чем до новообразованного кластера. Для кластеров второй группы выполняется следующее: если расстояние до новообразованного  кластера ближе, чем предыдущий ближайший кластер, то ближайший кластер меняется. В противном случае ничего не происходит.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 4:&#039;&#039;&#039; Переход на шаг 3, если не получено требуемое количество кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Factor_a.png|400px|thumb|center| Рисунок 2: Чувствительность алгоритма к параметру &amp;lt;math&amp;gt;\alpha &amp;lt;/math&amp;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; p &amp;lt;/math&amp;gt; частей, которые могут поместиться в память отдельной машины кластера. Затем во время первого прохода алгоритм уменьшает число кластеров в каждой подвыборке до &amp;lt;math&amp;gt; \frac{n}{pq} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; q \geq 1 &amp;lt;/math&amp;gt; – некоторая константа. Для последующего шага на вход кластеризации подаются только представительные точки &amp;lt;math&amp;gt;c&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;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Псевдокод&lt;br /&gt;
&lt;br /&gt;
Input : A set of points S&lt;br /&gt;
&lt;br /&gt;
Output : &#039;&#039;k&#039;&#039; clusters&lt;br /&gt;
&lt;br /&gt;
*   For every cluster u (each input point), in u.mean and u.rep store the mean of the points in the cluster and a set of &#039;&#039;c&#039;&#039; representative points of the cluster (initially &#039;&#039;c&#039;&#039; = 1 since each cluster has one data point). Also u.closest stores the cluster closest to u.&lt;br /&gt;
*   All the input points are inserted into a k-d tree T&lt;br /&gt;
*   Treat each input point as separate cluster, compute u.closest for each u and then insert each cluster into the heap Q. (clusters are arranged in increasing order of distances between u and u.closest).&lt;br /&gt;
*   While size(Q) &amp;amp;gt; &#039;&#039;k&#039;&#039;&lt;br /&gt;
*       Remove the top element of Q(say u) and merge it with its closest cluster u.closest(say v) and compute the new representative points for the merged cluster w.&lt;br /&gt;
*       Remove u and v from T and Q.&lt;br /&gt;
*       For all the clusters x in Q, update x.closest and relocate x&lt;br /&gt;
*           insert w into Q&lt;br /&gt;
*       repeat &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Являясь представителем иерархических алгоритмов кластеризации, имеет сложность &amp;lt;math&amp;gt; O(n^2 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;
&lt;br /&gt;
В начале работы алгоритма все объекты являются отдельными кластерами. На первом шаге наиболее похожие объекты объединяются в кластер. На последующих шагах объединение продолжается до тех пор, пока все объекты не будут составлять один кластер.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Metod.png|400px|thumb|center| Рисунок 3: Дендрограмма агломеративных методов]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Т.к все действия алгорима (вычисления центроид для кластеров, расстояния между кластерами, представители кластеров и изменение положения представителей) на каждом шаге можно делать независимо (как от представителей данного кластера, так и представителей других кластеров), можно сделать вывод, что возможно распараллеливание&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; набор данных &amp;lt;math&amp;gt; S &amp;lt;/math&amp;gt; , количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Param_c.png|400px|thumb|center| Рисунок 4: Результат работы алгоритка в зависимости от количесва представлений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Из рисунка видно, что при меньших значениях &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; качество работы алгоритма ухудшается&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; требуемое количество &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; крастеров&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма == &lt;br /&gt;
&lt;br /&gt;
* является масштабируемым алгоритмом&lt;br /&gt;
&lt;br /&gt;
* неважна форма кластера и размер&lt;br /&gt;
&lt;br /&gt;
*работает только на числовых данных&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [4]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Theodoridis, Sergios; Koutroumbas, Konstantinos (2006). Pattern recognition. Academic Press. pp. 572–574. ISBN 978-0-12-369531-4.&lt;br /&gt;
&lt;br /&gt;
[3] Guha, Sudipto; Rastogi, Rajeev; Shim, Kyuseok (2001). &amp;quot;CURE: An Efficient Clustering Algorithm for Large Databases&amp;quot; (PDF). Information Systems. 26 (1): 35–58. doi:10.1016/S0306-4379(01)00008-4&lt;br /&gt;
&lt;br /&gt;
[4] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=12078</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=12078"/>
		<updated>2016-10-15T21:01:58Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого кластера требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=12032</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=12032"/>
		<updated>2016-10-15T20:56:07Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=12025</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=12025"/>
		<updated>2016-10-15T20:55:42Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=12006</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=12006"/>
		<updated>2016-10-15T20:53:39Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Описанный в разделе иерархический алгоритм кластеризации является последовательным, так как на каждом шаге сравниваются расстояния между центроидами кластеров, некоторые из которых меняются при объединении кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Данный шаг выполняется независимо для каждой точки-представителя каждого кластера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вычисление расстояний до точек представителей можно выполнять независимо между собой.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 1 (вычисление центроид):&lt;br /&gt;
&lt;br /&gt;
Вычисления центроид для кластеров выполняется независимо, возможно их распараллеливание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Шаг 2 (поиск &amp;quot;наилучших кластеров для объединения):&lt;br /&gt;
&lt;br /&gt;
На данном этапе вычисляются расстояния между кластерами, что можно сделать независимо друг от друга. Если для определения расстояния между кластерами использовать минимальное расстояние между парами элементов (по одному элементу из каждого кластера), то эти расстояния вычисляются опять же независимо друг от друга, и их можно &amp;quot;распараллелить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Представители внутри каждого кластера определяются независимо от других кластеров и поддаются распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Изменение положения представителей можно сделать независимо как от представителей данного кластера, так и представителей других кластеров. Это также хорошо поддаётся распараллеливанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном этапе для каждой точки из таблицы, не использованной на этапе инициализации, выполняется вычисление расстояний до всех точек-представителей. Сравнение расстояний и добавление новых листьев в поддеревья кластеров можно выполнить независимо друг от друга, а значит можно выполнить распараллеливание.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&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;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11749</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11749"/>
		<updated>2016-10-15T20:20:07Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithm2.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11747</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11747"/>
		<updated>2016-10-15T20:19:53Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithm2.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|800px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11744</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11744"/>
		<updated>2016-10-15T20:19:12Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|800px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithm2.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|800px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11743</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11743"/>
		<updated>2016-10-15T20:18:56Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithm2.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|800px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11741</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11741"/>
		<updated>2016-10-15T20:18:34Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithm2.png|800px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|800px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11733</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11733"/>
		<updated>2016-10-15T20:17:44Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithm2.png|400px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Points c.png|400px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11727</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11727"/>
		<updated>2016-10-15T20:17:04Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров и нахождение точек-представителей для каждого кластера.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithm2.png|400px|thumb|center|Схема работы алгоритма кластеризаци CURE]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В зависимости от алгоритма случайная выборка номеров строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; может производится либо зависимо, либо независимо друг от друга.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:points c.png|400px|thumb|center|Последовательный информационный граф для точек-представителей]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11521</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11521"/>
		<updated>2016-10-15T19:41:51Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* ЧАСТЬ. Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&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;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11512</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11512"/>
		<updated>2016-10-15T19:40:51Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* ЧАСТЬ. Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча, часть которой используется для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Шаг 1:&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2:&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге для каждого кластера определяются &amp;lt;math&amp;gt;c&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;c&amp;lt;/math&amp;gt; ВЫПОЛНЯТЬ&lt;br /&gt;
  Назначаем представителем точку, наименьшее расстояние от которой до уже выбранных точек-представителей является максимальным среди всех оставшихся точек.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результатом работы алгоритма является дерево, ветвями которого являются отдельные кластеры. Листьями кластеров являются строки из матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой итерационное построение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, вычисление их центроид и назначение точек-представителей.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основную часть метода составляют разбиение случайной выборки строк на &amp;lt;math&amp;gt;k&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;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
===Масштабируемость реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11217</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11217"/>
		<updated>2016-10-15T18:54:58Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча соответствующего размера для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В самом начале шага считаем каждую выбранную точку одноточечным кластером с центроидой в этой же точке.&lt;br /&gt;
&lt;br /&gt;
Далее выполняем следующие шаги 1-2, пока количество кластеров не станет равно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
== Шаг 1 ==&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Шаг 2 ==&lt;br /&gt;
&lt;br /&gt;
Выполняется поиск пары кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения. В качестве критерия выбора можно рассматривать: наименьшее расстояние между центроидами кластеров или наименьшее расстояние между элементами, входящими в рассматриваемую пару кластеров. Существуют также другие критерии выбора &amp;quot;подходящих&amp;quot; классов, например, сравнение плотности кластеров до объединения и после. Далее выполняется слияние найденных кластеров. Для дерева это означает добавление новой вершины, соединённой ребром с корнем; поддеревья кластеров становятся ветвями этой новой вершины.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
(ПОЯСНЕНИЯ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Именно их поиск авторы статьи и предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11190</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11190"/>
		<updated>2016-10-15T18:48:16Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Каждая строка матрицы представляет собой точку в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - мерном пространстве.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
Расстояние &amp;lt;math&amp;gt;\rho(p,k)&amp;lt;/math&amp;gt; между точками &amp;lt;math&amp;gt;p = (p_{1},\dots,p_{n})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k = (k_{1},\dots,k_{n})&amp;lt;/math&amp;gt; будем вычислять по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\rho(p,k) = \sqrt{\sum_{i=1}^n (p_{i} - k_{i})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча соответствующего размера для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го кластера вычисляется центроида &amp;lt;math&amp;gt;\mu_{i}&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mu_{i} = \frac{1}{s_{i}}\sum_{j\in S_{i}} x^{j}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt; - номера строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, входящие в &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й кластер; &amp;lt;math&amp;gt;s_{i}&amp;lt;/math&amp;gt; - количество элементов в множестве &amp;lt;math&amp;gt;S_{i}&amp;lt;/math&amp;gt;; &amp;lt;math&amp;gt;x^{j}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-я строка матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого представителя выполняется сдвиг к центроиде соответствующего кластера в &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; раз. &lt;br /&gt;
(ПОЯСНЕНИЯ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данном шаге происходит присвоение неиспользованных точек (строк матрицы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;) к кластерам. Для точки-строки &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вычисляется расстояние до каждого представителя. Результат: строка &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; добавляется в поддерево кластера, которому принадлежит наиближайший представитель.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. Алгоритм предложенный в статье использует массив данных состоящий из размеров кластера, его центроида и репрезентативных точек, а при объединении кластеров информацию о новом кластере просто записывают в строчку предыдущего. Также для каждого алгоритма требуется считать индекс и расстояние до ближайшего кластера. Поиск индекса и расстояния авторы предлагают распараллелить.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11007</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=11007"/>
		<updated>2016-10-15T18:03:03Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча соответствующего размера для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparameters2.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. (ДОБАВИТЬ: ЧТО ПРЕДЛАГАЮТ СДЕЛАТЬ АВТОРЫ)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=10998</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=10998"/>
		<updated>2016-10-15T18:02:09Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча соответствующего размера для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. (ДОБАВИТЬ: ЧТО ПРЕДЛАГАЮТ СДЕЛАТЬ АВТОРЫ)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=10988</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=10988"/>
		<updated>2016-10-15T18:00:07Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* ЧАСТЬ. Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча соответствующего размера для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
(ВЫХОДНЫЕ ДАННЫЕ??)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. (ДОБАВИТЬ: ЧТО ПРЕДЛАГАЮТ СДЕЛАТЬ АВТОРЫ)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=10981</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=10981"/>
		<updated>2016-10-15T17:58:45Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Пример работы алгоритма для разных параметров &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча соответствующего размера для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
(ВЫХОДНЫЕ ДАННЫЕ??)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. (ДОБАВИТЬ: ЧТО ПРЕДЛАГАЮТ СДЕЛАТЬ АВТОРЫ)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=10975</id>
		<title>Участник:JuliaA/Алгоритм кластеризации с использованием представлений</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:JuliaA/%D0%90%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_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=10975"/>
		<updated>2016-10-15T17:57:52Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Ю.А. Антохина, С.А. Шатков&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дан набор точек и заданы правила определения расстояния между ними. Задача кластеризации сгруппировать эти точки в определенное число кластеров. Члены одного кластера похожи, а члены разных классов различны.&lt;br /&gt;
&lt;br /&gt;
В алгоритме CURE применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в CURE.&lt;br /&gt;
&lt;br /&gt;
Результат кластеризации зависит от того, как будут представлены кластеры. Например, средним всех точек кластера, или всеми точками кластера. Применение среднего возможно только в евклидовом пространстве. А использование всех точек неустойчиво к случайным выбросам. В CURE используется другой метод: для каждого кластера выбираются точки представители. Выбирается постоянное число точек, которые будут представлять каждый кластер. Кластеры с наиболее похожими наборами репрезентативных точек объединяются на каждом шаге алгоритма.&lt;br /&gt;
&lt;br /&gt;
За счет использования точек представителей алгоритм CURE устойчив к выбросам и может выделять кластеры сложной формы и различных размеров.&lt;br /&gt;
&lt;br /&gt;
Описание шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;. Если все данные использовать сразу как входные для CURE, то эффективность алгоритма будет низкая, а время выполнения большим. Поэтому на первом шаге мы случайным образом выбираем часть точек которые помещаются в память, затем группируем наиболее похожие с помощью иерархического метода.&lt;br /&gt;
Дальше работаем с кластерами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 2&#039;&#039;&#039;. Для каждого кластера выбираем &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; точек представителей, максимально удаленных друг от друга. Чисто &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; остается постоянным.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 3&#039;&#039;&#039;. Объединяем кластеры с наиболее похожими наборами точек представителей.&lt;br /&gt;
Если не достигнуто нужное число кластеров, то перейти на шаг 2.&lt;br /&gt;
Чтобы при объединении кластеров не выбирать каждый раз c точек представителей из всех точек, мы выбираем их только из &amp;lt;math&amp;gt;2c&amp;lt;/math&amp;gt; точек объединенных кластеров.&lt;br /&gt;
&lt;br /&gt;
Выбранные точки сдвигаются на следующем шаге на &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; к центроиду кластера. Алгоритм становится основанным на методе поиска центроида при &amp;lt;math&amp;gt;\alpha = 1&amp;lt;/math&amp;gt;, и основанным на всех точках кластера при &amp;lt;math&amp;gt;\alpha = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Exampleofalgorithmparametrs1.png|400px|thumb|center|Text]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
m число точек для кластеризации, n размерность.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Инициализация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выбираются &amp;lt;math&amp;gt;\lceil \gamma m\rceil&amp;lt;/math&amp;gt; строк матрицы случайным образом. Например, можно использовать [https://ru.wikipedia.org/wiki/Reservoir_sampling Алгоритм R]. &lt;br /&gt;
&lt;br /&gt;
В основной памяти выделяется куча соответствующего размера для размещения дерева, листьями которого являются выбранные строки, соединённые ребром с вершиной дерева. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Кластеризация&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Назначение представителей&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Сдвиг представителей к центроиде&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг &amp;quot;Присваивание&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Максимальное время выполнения алгоритма &amp;lt;math&amp;gt;O(n^2 logn)&amp;lt;/math&amp;gt;. Для двумерного пространства временная сложность может быть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Так что сложность алгоритма не хуже чем у центроидного. То есть при такой размерности входных данных CURE выполняется за полиномиальное время. &lt;br /&gt;
&lt;br /&gt;
(ПОЯСНЕНИЯ, ЕСЛИ ЕСТЬ ВРЕМЯ)&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: матрица &amp;lt;math&amp;gt;x \in R^{m\times n}&amp;lt;/math&amp;gt;, количество кластеров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, число точек представителей &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;, параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; число точек для кластеризации, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; размерность.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; для сжатия точек представления к центру кластера. В оригинальной статье авторы показывают что &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0.2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;0.7&amp;lt;/math&amp;gt; помогает хорошо выявлять несферические кластеры и подавлять редкие выбросы.&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; задаёт какая часть от &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек будет использована при случайной выборке точек на шаге &amp;quot;Инициализация&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Число точек представителей выбирается в зависимости от данных. Если возможно появление кластеров сложной формы, то точек должно быть больше, чтобы выявить их форму. В оригинальной статье авторы показывают что уже при &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; равном &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt; достигается неплохая эффективность.&lt;br /&gt;
&lt;br /&gt;
(ВЫХОДНЫЕ ДАННЫЕ??)&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм CURE выполняет иерархическую кластеризацию с использованием набора определяющих точек. Он действует только в евклидовом пространстве и предназначен для кластеризации очень больших наборов числовых данных.&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;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет заполнен к 15 ноября.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация CURE-алгоритма для кластеризации для Python/C++ представлена в пакете: [https://github.com/annoviko/pyclustering pyclustering].&lt;br /&gt;
&lt;br /&gt;
Также существует параллельная реализация алгоритма, описанная в сборнике [3]. (ДОБАВИТЬ: ЧТО ПРЕДЛАГАЮТ СДЕЛАТЬ АВТОРЫ)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Sudipto Guha (Stanford), Rajeev Rastogi (Bell Labs), Kyuseok Shim (Korea Institute of Technology). CURE: an efficient clustering algorithm for large databases. SIGMOD &#039;98 Proceedings of the 1998 ACM SIGMOD international conference on Management of data, pp 73-84 &lt;br /&gt;
&lt;br /&gt;
[3] Panagiotis E. Hadjidoukas, Laurent Amsaleg. OpenMP Shared Memory Parallel Programming.&lt;br /&gt;
Volume 4315 of the series Lecture Notes in Computer Science pp 289-299&lt;br /&gt;
Parallelization of a Hierarchical Data Clustering Algorithm Using OpenMP&lt;/div&gt;</summary>
		<author><name>JuliaA</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Exampleofalgorithmparametrs1.png&amp;diff=10961</id>
		<title>Файл:Exampleofalgorithmparametrs1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Exampleofalgorithmparametrs1.png&amp;diff=10961"/>
		<updated>2016-10-15T17:54:34Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: JuliaA загрузил новую версию Файл:Exampleofalgorithmparametrs1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Exampleofalgorithmparametrs1.png&amp;diff=10960</id>
		<title>Файл:Exampleofalgorithmparametrs1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Exampleofalgorithmparametrs1.png&amp;diff=10960"/>
		<updated>2016-10-15T17:54:16Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: JuliaA загрузил новую версию Файл:Exampleofalgorithmparametrs1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Exampleofalgorithmparametrs1.png&amp;diff=10950</id>
		<title>Файл:Exampleofalgorithmparametrs1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Exampleofalgorithmparametrs1.png&amp;diff=10950"/>
		<updated>2016-10-15T17:53:14Z</updated>

		<summary type="html">&lt;p&gt;JuliaA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>JuliaA</name></author>
	</entry>
</feed>