<?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=Cookie</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=Cookie"/>
	<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/Cookie"/>
	<updated>2026-10-22T21:40:41Z</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=17421</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=17421"/>
		<updated>2016-11-15T20:18:54Z</updated>

		<summary type="html">&lt;p&gt;Cookie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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|600px|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; кластеров с помощью иерархического метода, вычисление их центроид &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; и назначение точек-представителей. В ходе работы вычислительного ядра формируется дерево, в котором точки, выбранные на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039; собраны в &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; поддеревьев. Точки-представители хранятся в отдельной структуре. Эти точки будут использованы для выбора кластеров для неиспользованных (на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039;) точек после работы вычислительного ядра.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации состоит в формировании &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;. Слишком малое значение &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; может привести к объединению удалённых кластеров (если ни одна из точек предполагаемого кластера не была выбрана, они были присоединены к другому кластеру на этапе присваивания), а также к разделению кластеров на части (так как конечное количество кластеров фиксировано, а некоторые кластеры могут не набрать достаточное количество мест в выборке, чтобы их кластер сформировался). С другой стороны, скорость вычислений зависит от величины выборки: увеличение выборки при фиксированном числе кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; приведёт к дополнительным шагам на этапе кластеризации, а также к дополнительным вычислениям при нахождении кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения на каждом шаге. Кроме того, увеличение выборки приводит к уменьшению числа оставшихся точек, присвоение которых не входит в [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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; достигается неплохая эффективность, в то время как при &amp;lt;math&amp;gt;c = 5&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17417</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=17417"/>
		<updated>2016-11-15T20:13:56Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Входные и выходные данные алгоритма */&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|600px|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; кластеров с помощью иерархического метода, вычисление их центроид &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; и назначение точек-представителей. В ходе работы вычислительного ядра формируется дерево, в котором точки, выбранные на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039; собраны в &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; поддеревьев. Точки-представители хранятся в отдельной структуре. Эти точки будут использованы для выбора кластеров для неиспользованных (на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039;) точек после работы вычислительного ядра.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации состоит в формировании &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;. Слишком малое значение &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; может привести к объединению удалённых кластеров (если ни одна из точек предполагаемого кластера не была выбрана, они были присоединены к другому кластеру на этапе присваивания), а также к разделению кластеров на части (так как конечное количество кластеров фиксировано, а некоторые кластеры могут не набрать достаточное количество мест в выборке, чтобы их кластер сформировался). С другой стороны, скорость вычислений зависит от величины выборки: увеличение выборки при фиксированном числе кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; приведёт к дополнительным шагам на этапе кластеризации, а также к дополнительным вычислениям при нахождении кластеров, &amp;quot;наиболее подходящих&amp;quot; для объединения на каждом шаге. Кроме того, увеличение выборки приводит к уменьшению числа оставшихся точек, присвоение которых не входит в [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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; достигается неплохая эффективность, в то время как при &amp;lt;math&amp;gt;c = 5&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17397</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=17397"/>
		<updated>2016-11-15T19:53:00Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Общее описание алгоритма */&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|600px|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; кластеров с помощью иерархического метода, вычисление их центроид &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; и назначение точек-представителей. В ходе работы вычислительного ядра формируется дерево, в котором точки, выбранные на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039; собраны в &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; поддеревьев. Точки-представители хранятся в отдельной структуре. Эти точки будут использованы для выбора кластеров для неиспользованных (на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039;) точек после работы вычислительного ядра.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации состоит в формировании &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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; достигается неплохая эффективность, в то время как при &amp;lt;math&amp;gt;c = 5&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17396</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=17396"/>
		<updated>2016-11-15T19:52:30Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Входные и выходные данные алгоритма */&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; кластеров с помощью иерархического метода, вычисление их центроид &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; и назначение точек-представителей. В ходе работы вычислительного ядра формируется дерево, в котором точки, выбранные на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039; собраны в &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; поддеревьев. Точки-представители хранятся в отдельной структуре. Эти точки будут использованы для выбора кластеров для неиспользованных (на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039;) точек после работы вычислительного ядра.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации состоит в формировании &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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; достигается неплохая эффективность, в то время как при &amp;lt;math&amp;gt;c = 5&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17361</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=17361"/>
		<updated>2016-11-15T19:03:28Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Информационный граф */&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; кластеров с помощью иерархического метода, вычисление их центроид &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; и назначение точек-представителей. В ходе работы вычислительного ядра формируется дерево, в котором точки, выбранные на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039; собраны в &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; поддеревьев. Точки-представители хранятся в отдельной структуре. Эти точки будут использованы для выбора кластеров для неиспользованных (на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039;) точек после работы вычислительного ядра.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации состоит в формировании &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17360</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=17360"/>
		<updated>2016-11-15T19:02:44Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Математическое описание алгоритма */&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; кластеров с помощью иерархического метода, вычисление их центроид &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; и назначение точек-представителей. В ходе работы вычислительного ядра формируется дерево, в котором точки, выбранные на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039; собраны в &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; поддеревьев. Точки-представители хранятся в отдельной структуре. Эти точки будут использованы для выбора кластеров для неиспользованных (на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039;) точек после работы вычислительного ядра.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации состоит в формировании &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17359</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=17359"/>
		<updated>2016-11-15T19:01:50Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Общее описание алгоритма */&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; кластеров с помощью иерархического метода, вычисление их центроид &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; и назначение точек-представителей. В ходе работы вычислительного ядра формируется дерево, в котором точки, выбранные на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039; собраны в &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; поддеревьев. Точки-представители хранятся в отдельной структуре. Эти точки будут использованы для выбора кластеров для неиспользованных (на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039;) точек после работы вычислительного ядра.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации состоит в формировании &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17346</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=17346"/>
		<updated>2016-11-15T18:44:50Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Вычислительное ядро алгоритма */&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; кластеров с помощью иерархического метода, вычисление их центроид &amp;lt;math&amp;gt;\mu_{k}&amp;lt;/math&amp;gt; и назначение точек-представителей. В ходе работы вычислительного ядра формируется дерево, в котором точки, выбранные на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039; собраны в &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; поддеревьев. Точки-представители хранятся в отдельной структуре. Эти точки будут использованы для выбора кластеров для неиспользованных (на этапе &#039;&#039;&#039;Инициализации&#039;&#039;&#039;) точек после работы вычислительного ядра.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Задача алгоритма кластеризации состоит в формировании &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17342</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=17342"/>
		<updated>2016-11-15T18:25:55Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Вычислительное ядро алгоритма */&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; кластеров, вычисление их центроид &amp;lt;math&amp;gt;\mu_{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; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17341</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=17341"/>
		<updated>2016-11-15T18:25:03Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Вычислительное ядро алгоритма */&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; кластеров, вычисление их центроид &amp;lt;math&amp;gt;mu_{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; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17340</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=17340"/>
		<updated>2016-11-15T18:22:40Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Макроструктура алгоритма */&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; кластеров из &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; точек; число &amp;lt;math&amp;gt;h&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;x&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17332</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=17332"/>
		<updated>2016-11-15T17:58:41Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Входные и выходные данные алгоритма */&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
- &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
- вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;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;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17328</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=17328"/>
		<updated>2016-11-15T17:55:45Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Входные и выходные данные алгоритма */&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; листьев (векторов из &amp;lt;math&amp;gt;R^{1 \times n}&amp;lt;/math&amp;gt;); вершины-кластеры представляют собой массивы указателей на листья (число таких указателей равно &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;); корень представляет собой массив указателей на вершины-кластеры (число таких указателей равно числу кластеров &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;); также имеется указатель на корень дерева.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + kp*(m + h + 1)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;kp&amp;lt;/math&amp;gt; - коэффициент, равный отношению размера элемента из &amp;lt;math&amp;gt;R&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;
Увы&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>Cookie</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=17321</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=17321"/>
		<updated>2016-11-15T17:10:23Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Входные и выходные данные алгоритма */&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;m\times n + 4&amp;lt;/math&amp;gt;&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;
Увы&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>Cookie</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=17320</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=17320"/>
		<updated>2016-11-15T17:06:06Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Информационный граф */&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
Увы&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>Cookie</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=17318</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=17318"/>
		<updated>2016-11-15T17:01:23Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Общее описание алгоритма */&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
Увы&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>Cookie</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=17314</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=17314"/>
		<updated>2016-11-15T16:50:45Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Масштабируемость алгоритма и его реализации */&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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;
Увы&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>Cookie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:JuliaA&amp;diff=15448</id>
		<title>Обсуждение участника:JuliaA</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:JuliaA&amp;diff=15448"/>
		<updated>2016-11-01T09:04:37Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Статья Алгоритм кластеризации с использованием представлений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Статья [[Алгоритм кластеризации с использованием представлений]] =&lt;br /&gt;
* Не указан вклад каждого автора [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* В заголовках разделов 1 и 2 слово &amp;quot;ЧАСТЬ&amp;quot; лишнее [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.2 начиная с шага &amp;quot;Назначение представителей&amp;quot; математическое описание превращается в словесное [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.3 состоит из одного предложения, не дает разумной детализации [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Не исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.4 состоит из одного предложения, не дает разумной детализации [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Не исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.5 состоит из одного рисунка, достаточность информации под вопросом [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Не исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.6 приведенные оценки сложности не обоснованы [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Не исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.8. не приведено оценок параллельной сложности алгоритма [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Не исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.9 не приведено оценок объема входных и выходных данных [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
** Не исправлено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* Ссылки на п. 1 и 2 из списка литературы в тексте отсутствуют [[Участник:Coctic|Coctic]] ([[Обсуждение участника:Coctic|обсуждение]]) 12:31, 25 октября 2016 (MSK)&lt;br /&gt;
* Исправлено&lt;br /&gt;
-----&lt;br /&gt;
Неисправленные замечания:&lt;br /&gt;
&lt;br /&gt;
* п. 1.3 состоит из одного предложения, не дает разумной детализации [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.4 состоит из одного предложения, не дает разумной детализации [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.5 состоит из одной подписи к рисунку без самого рисунка, фактически пункт отсутствует [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK) - &amp;quot;Я нашёл небольшую опечатку: одном из блоков IF ветвь &#039;Нет&#039; не была подписана. Попытался перезагрузить картинку несколько раз, но ничего не изменилось&amp;quot; [[Участник:Cookie|С. Шатков]] 12:04, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.7 приведен рисунок чего-то, отдаленно напоминающее информационный граф, для одного из шагов алгоритма, информационного графа для алгоритма в целом не приведено [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.8 не приведено оценок параллельной сложности алгоритма [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;br /&gt;
* п. 1.9 не приведено оценок объема входных и выходных данных [[Участник:Coctic|К. Стефанов]] ([[Обсуждение участника:Coctic|обсуждение]]) 11:03, 1 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Cookie</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=15377</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=15377"/>
		<updated>2016-10-31T20:59:59Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;math&amp;gt;~^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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>Cookie</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=15376</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=15376"/>
		<updated>2016-10-31T20:59:29Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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;math&amp;gt;.^{[1]}&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; может производится либо зависимо, либо независимо друг от друга.&lt;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>Cookie</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=15375</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=15375"/>
		<updated>2016-10-31T20:58:39Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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 выполняется за полиномиальное время.[1]&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>Cookie</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=15372</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=15372"/>
		<updated>2016-10-31T20:54:34Z</updated>

		<summary type="html">&lt;p&gt;Cookie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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>Cookie</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=15368</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=15368"/>
		<updated>2016-10-31T20:51:41Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Информационный граф */&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>Cookie</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=15360</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=15360"/>
		<updated>2016-10-31T20:37:56Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Информационный граф */&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>Cookie</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=15358</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=15358"/>
		<updated>2016-10-31T20:33:28Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Последовательная сложность алгоритма */&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;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>Cookie</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=15356</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=15356"/>
		<updated>2016-10-31T20:33:06Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Общее описание алгоритма */&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;
&#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;
[[Файл: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>Cookie</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=15355</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=15355"/>
		<updated>2016-10-31T20:32:08Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Информационный граф */&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;
[[Файл: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>Cookie</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=15351</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=15351"/>
		<updated>2016-10-31T20:28:59Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Информационный граф */&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;Шаг &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>Cookie</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=15348</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=15348"/>
		<updated>2016-10-31T20:26:59Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Информационный граф */&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;Шаг &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>Cookie</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=15345</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=15345"/>
		<updated>2016-10-31T20:25:18Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Схема реализации последовательного алгоритма */&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;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>Cookie</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=15338</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=15338"/>
		<updated>2016-10-31T20:18:48Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Схема реализации последовательного алгоритма */&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(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>Cookie</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=15305</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=15305"/>
		<updated>2016-10-31T19:53:36Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Схема реализации последовательного алгоритма */&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;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>Cookie</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=15301</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=15301"/>
		<updated>2016-10-31T19:50:45Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Входные и выходные данные алгоритма */&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;
[[Файл:SubCURE.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;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>Cookie</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=15298</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=15298"/>
		<updated>2016-10-31T19:50:32Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Ресурс параллелизма алгоритма */&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;
[[Файл:SubCURE.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;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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15297</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=15297"/>
		<updated>2016-10-31T19:50:17Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Макроструктура алгоритма */&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;
[[Файл:SubCURE.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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15296</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=15296"/>
		<updated>2016-10-31T19:50:05Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Вычислительное ядро алгоритма */&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
[[Файл:SubCURE.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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15282</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=15282"/>
		<updated>2016-10-31T19:43:24Z</updated>

		<summary type="html">&lt;p&gt;Cookie: &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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
[[Файл:SubCURE.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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15278</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=15278"/>
		<updated>2016-10-31T19:32:47Z</updated>

		<summary type="html">&lt;p&gt;Cookie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:JuliaA|Ю.А. Антохина]], разделы [[#Вычислительное ядро алгоритма|1.3]] - [[#Свойства алгоритма|1.10]] (базовый алгоритм), [[#Особенности реализации последовательного алгоритма|2.1]], [[#Возможные способы и особенности параллельной реализации алгоритма|2.3]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации алгоритма|2.7]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Cookie|С.А. Шатков]], разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]] - [[#Свойства алгоритма|1.10]] ((алгоритм с преобразованием к матрице Хессенберга) &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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
[[Файл:SubCURE.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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15275</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=15275"/>
		<updated>2016-10-31T19:27:50Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
[[Файл:SubCURE.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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15274</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=15274"/>
		<updated>2016-10-31T19:27:31Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
[[Файл:SubCURE.jpg|1200px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15273</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=15273"/>
		<updated>2016-10-31T19:27:17Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
[[Файл:SubCURE.jpg|1000px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15271</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=15271"/>
		<updated>2016-10-31T19:26:47Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE.jpg|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15267</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=15267"/>
		<updated>2016-10-31T19:22:53Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:SubCURE.png|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15177</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=15177"/>
		<updated>2016-10-31T16:25:21Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15175</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=15175"/>
		<updated>2016-10-31T16:24:38Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;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(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;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;
Пусть &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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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>Cookie</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=15170</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=15170"/>
		<updated>2016-10-31T16:15:34Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;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(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;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;
Пусть &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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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;
Также существует параллельная реализация алгоритма, описанная в сборнике &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>Cookie</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=15164</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=15164"/>
		<updated>2016-10-31T16:03:38Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;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;
Пусть &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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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;
Также существует параллельная реализация алгоритма, описанная в сборнике &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>Cookie</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=15161</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=15161"/>
		<updated>2016-10-31T16:01:56Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;начиная с шага &amp;quot;Назначение представителей&amp;quot; математическое описание превращается в словесное&#039;&#039;&#039;&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;
Пусть &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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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;
Также существует параллельная реализация алгоритма, описанная в сборнике &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>Cookie</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=15152</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=15152"/>
		<updated>2016-10-31T15:50:45Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;начиная с шага &amp;quot;Назначение представителей&amp;quot; математическое описание превращается в словесное&#039;&#039;&#039;&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;
Пусть &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} = x^{y} + \alpha\cdot(\mu_{k} - 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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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;
Также существует параллельная реализация алгоритма, описанная в сборнике &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>Cookie</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=15150</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=15150"/>
		<updated>2016-10-31T15:49:28Z</updated>

		<summary type="html">&lt;p&gt;Cookie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[U:JuliaA|Ю.А. Антохина]], [[Участник:Cookie|С.А. Шатков]]&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 применяется иерархическая кластеризация. Есть два подхода к иерархической кластеризации. В одном случае один большой кластер на каждом шаге разбивается на несколько, пока число кластеров не будет равно заданному заранее числу кластеров. В другом случае наоборот кластеры, состоящие каждый из одной точки объединяются в большие. Второй метод используется в 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;
&#039;&#039;&#039;начиная с шага &amp;quot;Назначение представителей&amp;quot; математическое описание превращается в словесное&#039;&#039;&#039;&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;
Пусть &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} = x^{y} + \alpha\cdot\frac{\mu_{k} - x^{y}}{\rho(\mu_{k},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;
&#039;&#039;&#039;п. 1.3 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039;&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;
&#039;&#039;&#039;п. 1.4 состоит из одного предложения, не дает разумной детализации&#039;&#039;&#039; &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;
&#039;&#039;&#039;п. 1.5 состоит из одного рисунка, достаточность информации под вопросом&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Examplealgorithm11.png|800px|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;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;п. 1.8. не приведено оценок параллельной сложности алгоритма&#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;
&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;
&#039;&#039;&#039;п. 1.9 не приведено оценок объема входных и выходных данных&#039;&#039;&#039;&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;
Также существует параллельная реализация алгоритма, описанная в сборнике &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>Cookie</name></author>
	</entry>
</feed>