<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0"/>
	<updated>2026-10-22T18:13:21Z</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:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=21255</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=21255"/>
		<updated>2016-12-18T20:11:02Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследовалась масштабируемость параллельной реализации алгоритма для 4 и 8 потоков.&amp;lt;ref name=&amp;quot;tr&amp;quot;&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результаты отображены в виде графика. Можно отметить, что с увеличением объема входных данных растут ускорение и эффективность работы алгоритма. Однако эффективность снижается при увеличении числа потоков.&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|1000px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=21082</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=21082"/>
		<updated>2016-12-16T22:40:09Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации&lt;br /&gt;
&lt;br /&gt;
Исследовалась масштабируемость параллельной реализации алгоритма для 4 и 8 потоков.&amp;lt;ref name=&amp;quot;tr&amp;quot;&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результаты отображены в виде графика. Можно отметить, что с увеличением объема входных данных растут ускорение и эффективность работы алгоритма. Однако эффективность снижается при увеличении числа потоков.&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|1000px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=21081</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=21081"/>
		<updated>2016-12-16T22:39:45Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации&lt;br /&gt;
&lt;br /&gt;
Исследовалась масштабируемость параллельной реализации алгоритма для 4 и 8 потоков.&amp;lt;ref name=&amp;quot;tr&amp;quot;&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результаты отображены в виде графика. Можно отметить, что с увеличением объема входных данных растут ускорение и эффективность работы алгоритма. Однако эффективность снижается при увеличении числа потоков.&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20106</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20106"/>
		<updated>2016-12-05T13:00:10Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Было проведено исследование эффективности пробной версии параллельной реализации алгоритма&amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;. Полученные результаты отображены на графике(Рис.3). &lt;br /&gt;
&lt;br /&gt;
По рисунку видно, что с ростом объема данных ускорение и эффективность алгоритма увеличиваются. Однако с ростом числа потоков эффективность уменьшается.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|thumb|700px|center|Рис.3 Масштабируемость алгоритма динамической иерархической кластеризации CHAMELEON в зависимости от числа процессоров и размера задачи]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20099</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20099"/>
		<updated>2016-12-05T12:50:25Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Было проведено исследование эффективности пробной версии параллельной реализации алгоритма&amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;. Полученные результаты отображены на графике(Рис.3). &lt;br /&gt;
 По рисунку видно, что с ростом объема данных ускорение и эффективность алгоритма увеличиваются. Однако с ростом числа потоков эффективность уменьшается.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|thumb|700px|center|Рис.3 Масштабируемость алгоритма динамической иерархической кластеризации CHAMELEON в зависимости от числа процессоров и размера задачи]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20098</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20098"/>
		<updated>2016-12-05T12:48:31Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Было проведено исследование эффективности пробной версии параллельной реализации алгоритма&amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;. Полученные результаты отображены на графике(Рис.3). &lt;br /&gt;
По рисунку видно, что с ростом объема данных ускорение и эффективность алгоритма увеличиваются. Однако с ростом числа потоков эффективность уменьшается.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|thumb|700px|center|Рис.3 Масштабируемость алгоритма динамической иерархической кластеризации CHAMELEON в зависимости от числа процессоров и размера задачи]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20049</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20049"/>
		<updated>2016-12-05T09:29:44Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|thumb|700px|center|Рис.3 Масштабируемость алгоритма динамической иерархической кластеризации CHAMELEON в зависимости от числа процессоров и размера задачи]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20048</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=20048"/>
		<updated>2016-12-05T09:28:00Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|700px|center|Рис.3 Масштабируемость алгоритма динамической иерархической кластеризации CHAMELEON в зависимости от числа процессоров и размера задачи]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=19984</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=19984"/>
		<updated>2016-12-03T19:15:02Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Kronberg}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.jpg|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18594</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18594"/>
		<updated>2016-11-20T15:27:42Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&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;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
График показывает, что эффективность и скорость работы алгоритма растут с увеличением объема входных данных. Однако, в упомянутой выше работе отмечается, что эффективность алгоритма падает с ростом количества потоков.&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18592</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18592"/>
		<updated>2016-11-20T15:25:32Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&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;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
График показывает, что эффективность и скорость работы алгоритма растут с увеличением объема входных данных. Однако, в упомянутой выше работе отмечается, что эффективность алгоритма падает с ростом количества потоков.&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, оно было рассмотрено в пункте 2.4.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18591</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18591"/>
		<updated>2016-11-20T15:24:07Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&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;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
График показывает, что эффективность и скорость работы алгоритма растут с увеличением объема входных данных. Однако, в упомянутой выше работе отмечается, что эффективность алгоритма падает с ростом количества потоков.&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18590</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18590"/>
		<updated>2016-11-20T15:23:12Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Масштабируемость исследовалась на основе работы, презентующей пробную версию параллельной реализации алгоритма для различного числа потоков.&lt;br /&gt;
График показывает, что эффективность и скорость работы алгоритма растут с увеличением объема входных данных. Однако, в упомянутой выше работе отмечается, что эффективность алгоритма падает с ростом количества потоков.&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18589</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18589"/>
		<updated>2016-11-20T15:22:23Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Масштабируемость исследовалась на основе работы, презентующей пробную версию параллельной реализации алгоритма для различного числа потоков.&lt;br /&gt;
График показывает, что эффективность и скорость работы алгоритма растут с увеличением объема входных данных. Однако, в упомянутой выше работе отмечается, что эффективность алгоритма падает с ростом количества потоков.&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18585</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18585"/>
		<updated>2016-11-20T13:53:42Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18584</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18584"/>
		<updated>2016-11-20T13:52:45Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|700px]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18583</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18583"/>
		<updated>2016-11-20T13:52:24Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18582</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=18582"/>
		<updated>2016-11-20T13:50:35Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[File:Масштабирование.png|1000px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке &amp;lt;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17372</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=17372"/>
		<updated>2016-11-15T19:10:26Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Algoman}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://read.pudn.com/downloads36/sourcecode/math/115779/chameleon/chameleon.c__.htm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15341</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15341"/>
		<updated>2016-10-31T20:23:57Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m^2})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m^2+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15300</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15300"/>
		<updated>2016-10-31T19:50:39Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15294</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15294"/>
		<updated>2016-10-31T19:48:13Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                  для 1-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m})&amp;lt;/math&amp;gt;   для 2-го этапа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m+n})&amp;lt;/math&amp;gt; для 3-го этапа;&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15289</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15289"/>
		<updated>2016-10-31T19:47:00Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;              ::       для 1-го этапа&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m})&amp;lt;/math&amp;gt;    :  для 2-го этапа&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m+n})&amp;lt;/math&amp;gt; для 3-го этапа&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%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:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0&amp;diff=15285</id>
		<title>Обсуждение участника:ЕкатеринаКозырева</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0&amp;diff=15285"/>
		<updated>2016-10-31T19:44:58Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Замечания к Участник:ЕкатеринаКозырева/Алгоритм_динамической_иерархической_кластеризации_CHAMELEON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:ЕкатеринаКозырева/Алгоритм_динамической_иерархической_кластеризации_CHAMELEON]] ==&lt;br /&gt;
&lt;br /&gt;
1) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи&lt;br /&gt;
&lt;br /&gt;
2) требуется какая-то подпись или ссылка на рисунок в п 1.1&lt;br /&gt;
&lt;br /&gt;
3) подпись к рисунку 1.2 должны быть выполнена средствами разметки, а не на самой картинке&lt;br /&gt;
&lt;br /&gt;
4) для оформления (псевдо) кода следует использовать тег &amp;lt;nowiki&amp;gt;&amp;lt;source lang=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) отсутствует оценка вычислительной мощности алгоритма в п 1.10 &lt;br /&gt;
&lt;br /&gt;
6) пункты 2.1 и 2.2 должны быть 2.4 и 2.7, согласно формату описания [[Структура_описания_свойств_алгоритмов]]&lt;br /&gt;
&lt;br /&gt;
7) список литературы оформлен неправильно - см. как сделано в [[Разложение_Холецкого_(метод_квадратного_корня)]]&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15284</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15284"/>
		<updated>2016-10-31T19:44:27Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;                     для 1-го этапа&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m})&amp;lt;/math&amp;gt;      для 2-го этапа&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m+n})&amp;lt;/math&amp;gt; для 3-го этапа&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15283</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15283"/>
		<updated>2016-10-31T19:43:55Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Оценка &#039;&#039;вычислительной мощности&#039;&#039; выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; для 1-го этапа&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{nm}{n^2+m})&amp;lt;/math&amp;gt; для 2-го этапа&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(\frac{m^2log(m)}{m+n})&amp;lt;/math&amp;gt; для 3-го этапа&lt;br /&gt;
&lt;br /&gt;
Алгоритм является &#039;&#039;недетерминированным&#039;&#039;. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15256</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15256"/>
		<updated>2016-10-31T18:57:27Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15255</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15255"/>
		<updated>2016-10-31T18:57:12Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&amp;lt;/ref&amp;gt;; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15254</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15254"/>
		<updated>2016-10-31T18:55:40Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15249</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15249"/>
		<updated>2016-10-31T18:51:55Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15248</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15248"/>
		<updated>2016-10-31T18:51:15Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства&amp;lt;ref&amp;gt;https://algowiki-project.org/algowiki/ru/index.php?title=Участник:ЕкатеринаКозырева/Алгоритм_динамической_иерархической_кластеризации_CHAMELEON&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15245</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15245"/>
		<updated>2016-10-31T18:48:42Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15244</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15244"/>
		<updated>2016-10-31T18:47:47Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&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;ref&amp;gt;http://www.codeforge.com/article/192925&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&amp;lt;/ref&amp;gt;, hMETIS &amp;lt;ref&amp;gt;http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&amp;lt;/ref&amp;gt; и RANN &amp;lt;ref&amp;gt;https://cran.r-project.org/web/packages/RANN/index.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь &amp;lt;ref&amp;gt;http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15243</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15243"/>
		<updated>2016-10-31T18:44:52Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|2000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15242</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15242"/>
		<updated>2016-10-31T18:44:22Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15241</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15241"/>
		<updated>2016-10-31T18:43:53Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15240</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15240"/>
		<updated>2016-10-31T18:43:23Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|1000px|thumb|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15239</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15239"/>
		<updated>2016-10-31T18:42:54Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon 2.png|1000px|thumb|center|Рисунок 2. Объекты в пространстве - слева, граф по принципу 1-го ближайшего соседа - по центру, граф по принципу 3-х ближайших соседей - справа ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15234</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15234"/>
		<updated>2016-10-31T18:37:02Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15232</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15232"/>
		<updated>2016-10-31T18:34:38Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15231</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15231"/>
		<updated>2016-10-31T18:32:21Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;source lang=int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
&amp;gt;&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15230</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15230"/>
		<updated>2016-10-31T18:30:07Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png|1000px|thumb|center|Рисунок 1. Общая структура алгоритма CHAMELEON]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</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:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0&amp;diff=15228</id>
		<title>Обсуждение участника:ЕкатеринаКозырева</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0&amp;diff=15228"/>
		<updated>2016-10-31T18:26:53Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Замечания к Участник:ЕкатеринаКозырева/Алгоритм_динамической_иерархической_кластеризации_CHAMELEON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Замечания к [[Участник:ЕкатеринаКозырева/Алгоритм_динамической_иерархической_кластеризации_CHAMELEON]] ==&lt;br /&gt;
&lt;br /&gt;
+1) отсутствует оценка высоты и ширины ЯПФ параллельного алгоритма во врезке в начале статьи&lt;br /&gt;
&lt;br /&gt;
2) требуется какая-то подпись или ссылка на рисунок в п 1.1&lt;br /&gt;
&lt;br /&gt;
3) подпись к рисунку 1.2 должны быть выполнена средствами разметки, а не на самой картинке&lt;br /&gt;
&lt;br /&gt;
4) для оформления (псевдо) кода следует использовать тег &amp;lt;nowiki&amp;gt;&amp;lt;source lang=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) отсутствует оценка вычислительной мощности алгоритма в п 1.10 &lt;br /&gt;
&lt;br /&gt;
+6) пункты 2.1 и 2.2 должны быть 2.4 и 2.7, согласно формату описания [[Структура_описания_свойств_алгоритмов]]&lt;br /&gt;
&lt;br /&gt;
7) список литературы оформлен неправильно - см. как сделано в [[Разложение_Холецкого_(метод_квадратного_корня)]]&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15226</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15226"/>
		<updated>2016-10-31T18:26:16Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15225</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15225"/>
		<updated>2016-10-31T18:25:56Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* часть. Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15224</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15224"/>
		<updated>2016-10-31T18:25:19Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* часть. Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= часть. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15221</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=15221"/>
		<updated>2016-10-31T18:23:47Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /*  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= часть. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
== ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
== ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=14945</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=14945"/>
		<updated>2016-10-30T20:53:41Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar&amp;lt;ref&amp;gt;George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= часть. Программная реализация алгоритма =&lt;br /&gt;
== ==&lt;br /&gt;
== ==&lt;br /&gt;
== ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
== ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=14943</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=14943"/>
		<updated>2016-10-30T20:48:15Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: /* часть. Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar[1].&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= часть. Программная реализация алгоритма =&lt;br /&gt;
== ==&lt;br /&gt;
== ==&lt;br /&gt;
== ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
== ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=14932</id>
		<title>Участник:ЕкатеринаКозырева/Алгоритм динамической иерархической кластеризации CHAMELEON</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0%D0%9A%D0%BE%D0%B7%D1%8B%D1%80%D0%B5%D0%B2%D0%B0/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_CHAMELEON&amp;diff=14932"/>
		<updated>2016-10-30T20:27:21Z</updated>

		<summary type="html">&lt;p&gt;ЕкатеринаКозырева: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм динамической иерархической кластеризации CHAMELEON&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm + n log n + m^2 log m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания [[Участник:ЕкатеринаКозырева|Е.А.Козырева]]&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм CHAMELEON был предложен в 1999 году тремя учеными из университета Миннесоты – George Karypis, Eui-Hong (Sam) Han и Vipin Kumar[1].&lt;br /&gt;
&lt;br /&gt;
Предназначен для решения задач кластеризации. Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON - это агломеративный иерархический алгоритм кластеризации, ключевой особенностью которого является то, что он учитывает и взаимную связность, и сходство при определении наиболее похожей пары подкластеров, основываясь на динамической модели. Это означает, что в процессе кластеризации два кластера объединяются, только если их относительная взаимная связность и относительное взаимное сходство являются высокими по отношению к внутренней взаимосвязанности кластеров и близости элементов внутри кластеров. Кроме того, CHAMELEON использует подход для моделирования степени взаимосвязанности и близости между каждой парой кластеров, который учитывает внутренние характеристики самих кластеров. Таким образом, он может автоматически адаптироваться к внутренним характеристикам объединяемых кластеров.&lt;br /&gt;
&lt;br /&gt;
CHAMELEON находит кластеры в наборе данных с помощью трехфазного алгоритма. На первой фазе происходит построение графа, путём добавления рёбер по принципу k ближайших соседей. На второй фазе CHAMELEON группирует полученные элементы в множество относительно небольших подграфов. Во время третьей фазы применяется агломеративный иерархический алгоритм кластеризации, с помощью которого находятся естесственные кластеры путем многократного объединения подграфов, полученных на прошлом этапе.&lt;br /&gt;
&lt;br /&gt;
[[File:Chameleon.png]]&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
* Множество из n точек &amp;lt;math&amp;gt;V= {v_{ij}}&amp;lt;/math&amp;gt; в метрическом пространстве, которое задано симметрической матрицей расстояний &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин, &amp;lt;math&amp;gt;k \in N, k \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подграф на 2-м этапе, &amp;lt;math&amp;gt;l \in N, l \leq n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Обозначения&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; - граф, полученный путём соединения каждой точки с её &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайшими соседями.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; - разбиение множества &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; на набор попарно непересекающихся связных подмножеств, полученное в результате выполнения второй фазы алгоритма.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt; - взвешенный граф, вершинами которого являются получившиеся подграфы, а ребрами - количество ребер исходного графа, соединяющих соответствующие подграфы.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt; - итоговое разбиение множества вершин графа &amp;lt;math&amp;gt;G_{2}&amp;lt;/math&amp;gt; на набор кластеров.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вспомогательные понятия&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; - абсолютная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как сумма весов ребер, соединяющих вершины, принадлежащие &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; c вершинами из &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt;. Внутренняя связность &amp;lt;math&amp;gt;EC_{(C_{i},C_{i})}&amp;lt;/math&amp;gt; вычисляется как сумма ребер, входящих в разделитель, разбивающий &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; на два равных подграфа.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} = \frac{|EC_{(C_{i},C_{j})}|}{(|EC_{C_{i}}|+|EC_{C_{j}}|)/2}&amp;lt;/math&amp;gt; - относительная взаимная связность пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt; - абсолютное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Подсчитывается как среднее сходство между соединенными вершинами, принадлежащими &amp;lt;math&amp;gt;C{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C{j}&amp;lt;/math&amp;gt; соответственно. Соединения обусловлены разбиением общего графа, полученного на первом этапе алгоритма.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}= \frac{S_{EC_{(C_{i},C_{j})}}}{\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{i})}}+\frac{|C_{i}|}{|C_{i}+C_{j}|}*S_{EC_{(C_{j})}}}&amp;lt;/math&amp;gt; - относительное взаимное сходство пары кластеров &amp;lt;math&amp;gt;C_{i}, C{j}&amp;lt;/math&amp;gt;. Определяется как абсолютное сходство между этой парой кластеров, нормализованное с учетом их внутреннего сходства.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На первом этапе, согласно графо-ориентированному подходу, происходит построение графа &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; на матрице сходства объектов по принципу k ближайших соседей. Две вершины такого графа соединяет ребро, если объект, соответствующий любой из этих вершин попадает в число k наиболее близких объектов для объекта, соответствующего другой вершине из данной пары.&lt;br /&gt;
[[Файл:Снимок chameleon.PNG]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм разделяет полученный граф на множество сравнительно малых подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt;. Разделение происходит последовательно. На каждом шаге выбирается подграф, содержащий наибольшее число вершин. Этот граф разделяется на два подграфа так, что разделитель ребер графа минимален и каждый из получаемых подграфов содержит не менее 25 % вершин исходного графа. Процесс разделения останавливается, когда наибольший подграф содержит меньше некоторого заданного числа вершин. Обычно величина этого параметра задается равной значению от 1 до 5 % от числа объектов. Полученное множество связных графов считается множеством начальных кластеров, на котором требуется провести последовательное иерархическое объединение.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Третий этап заключается в итеративном преобразовании множества подграфов &amp;lt;math&amp;gt;K= \{K_{i}\}&amp;lt;/math&amp;gt; в множество кластеров &amp;lt;math&amp;gt;C = \{C_{i}\}&amp;lt;/math&amp;gt;. Алгоритм осуществляет агломеративную иерархическую кластеризацию на основании показателей &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Существует две стратегии анализа показателей сходства. Первая подразумевает наличие некоторых пороговых значений &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt;. В соответствии с этой стратегией, алгоритм для каждого кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; проверяет, отвечают ли смежные (наиболее близкие) ему кластеры условиям:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если более одного смежного кластера отвечает этим условиям, то алгоритм выбирает для объединения наиболее связный кластер (граф), то есть такой кластер &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;, с которым у кластера &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; получается наибольшая абсолютная взаимная связность. По завершению прохода по всем кластерам, созданные таким образом пары объединяются. Параметры &amp;lt;math&amp;gt;T_{RI}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{RC}&amp;lt;/math&amp;gt; могут использоваться для изменения характеристик получаемых кластеров.&lt;br /&gt;
&lt;br /&gt;
Вторая стратегия заключается в использовании специальной функции, объединяющей понятия относительной взаимной связности и относительного взаимного сходства. На каждом шаге выбираются те кластеры для объединения, которые максимизируют эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}*RC_{(C_{i},C_{j})}^\alpha&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;gt; 1 &amp;lt;/math&amp;gt;, то алгоритм придает большее значение относительному взаимному сходству, а если &amp;lt;math&amp;gt;\alpha &amp;lt;  1 &amp;lt;/math&amp;gt;, то большее значение имеет относительная взаимная связность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Вычисляемые данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U = (u_1, u_2, ..., u_n)&amp;lt;/math&amp;gt; - n-мерный вектор, где &amp;lt;math&amp;gt;u_i \in N_{[C]}&amp;lt;/math&amp;gt; - порядковый номер кластера, к которому принадлежит вершина i исходного множества V.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет три вычислительных ядра, по одному на каждый этап.&lt;br /&gt;
&lt;br /&gt;
На первом этапе вычислительным ядром является процесс нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей для каждой вершины, который заключается в анализе матрицы расстояний.&lt;br /&gt;
&lt;br /&gt;
На втором этапе вычислительным ядром является процесс поиска подходящего разбиения очередного подграфа на два графа с минимизацией разделителя ребер графа.&lt;br /&gt;
&lt;br /&gt;
На третьем этапе вычислительным ядром является расчет величин &amp;lt;math&amp;gt;EC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_{EC_{(C_{i},C_{j})}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; для каждой пары смежных кластеров.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Как уже рассказывалось ранее, алгоритм включает в себя три основных этапа, каждый из которых, по сути, является отдельным алгоритмом. Этапы выполняются последовательно относительно друг друга. &lt;br /&gt;
&lt;br /&gt;
Макрооперация на первом этапе - процедура нахождения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей, на втором - процедура разбиения наибольшего подграфа на два графа, на третьем - процедура вычисления показателей сходства, на основе которых принимается решение о слиянии подграфов в кластер.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первый этап&#039;&#039;&#039;&lt;br /&gt;
 int n; //количество вершин&lt;br /&gt;
 int k; //количество соседей&lt;br /&gt;
 int A[n][n] //матрица расстояний&lt;br /&gt;
 int D[k] //массив вершин-соседей&lt;br /&gt;
 int E[n][n] //матрица ребер графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
 for i=1 to n-1 do&lt;br /&gt;
     {&lt;br /&gt;
       for j=i+1 to n do &lt;br /&gt;
            {&lt;br /&gt;
               //заполняем массив вершин-соседей вставляя новые вершины, если они ближе, чем самая далекая из массива. &lt;br /&gt;
            }&lt;br /&gt;
       for j=0 to k do &lt;br /&gt;
            {&lt;br /&gt;
               //для каждой вершины соседа заполняем соответствующую ячейку из матрицы E[n][n] единицей&lt;br /&gt;
            }&lt;br /&gt;
   &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Все связные подграфы в отсортированном порядке помещаются в список;&lt;br /&gt;
 2. Берем наибольший элемент списка, вычисляем количество его вершин. Если число вершин &amp;gt; l, то идем в пункт 3. Иначе в пункт 5;&lt;br /&gt;
 3. Разбиваем подграф на два подграфа таким образом, чтобы разделитель ребер графа был минимален и каждый из получаемых подграфов содержал не менее 25 % вершин исходного графа;&lt;br /&gt;
 4. Добавляем полученные элементы в список подграфов таким образом, чтобы список оставался отсортированным. Идем в пункт 2;&lt;br /&gt;
 5. Нашли искомое множество подграфов math&amp;gt;K = \{K_{i}\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 6. Создаем и заполняем матрицу матрицу расстояний для графа &amp;lt;math&amp;gt;G_{2} = (K, E_{2})&amp;lt;/math&amp;gt;. Получаем искомый набор рёбер &amp;lt;math&amp;gt;E_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третий этап&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 1. Заводим два массива: а) массив кластеров C, полученных на предыдущем этапе, б) массив объединений кластеров F, которые мы будем получать на этом этапе;&lt;br /&gt;
 2. Берем следующий кластер &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; (на первом шаге - первый). Если все кластеры просмотрены, идем в пункт 6;&lt;br /&gt;
 3. Берем следующий кластер &amp;lt;math&amp;gt;C_{j}, i&amp;lt;&amp;gt;j&amp;lt;/math&amp;gt;. Если все кластеры просмотрены, то идем в пункт 2;&lt;br /&gt;
 4. Проверяем смежность &amp;lt;math&amp;gt;C_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_{j}&amp;lt;/math&amp;gt;. Если не смежны, то возвращаемся в пункт 3. Если смежны, идем в пункт 5;&lt;br /&gt;
 5. Рассчитываем показатели &amp;lt;math&amp;gt;RI_{(C_{i},C_{j})}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; RC_{(C_{i},C_{j})}&amp;lt;/math&amp;gt;. Проверяем, удовлетворяют ли найденные значения условиям:&lt;br /&gt;
 *&amp;lt;math&amp;gt;RI_{(C_{i},C_{j})} \geqslant T_{RI}&amp;lt;/math&amp;gt;&lt;br /&gt;
 *&amp;lt;math&amp;gt;RC_{(C_{i},C_{j})} \geqslant T_{RC}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Если нет, то идем в пункт 3. Иначе если смежность пары кластеров выше, чем у предыдущих найденных, то &amp;lt;math&amp;gt;F_{i}=j&amp;lt;/math&amp;gt;. Идем в пункт 3;&lt;br /&gt;
 6. Если в списке F есть хотя бы одна пара кластеров для слияния, то выполняем слияние, обновляем массив кластеров и массив объединений кластеров. Идем в пункт 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1) Для построения графа на основе метода k ближайших соседей для n вершин требуется &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt; операций [3]; для наборов данных большой размерности эта величина составляет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций [4];&lt;br /&gt;
&lt;br /&gt;
2) Для выделения множества сравнительно малых связных подграфов требуется &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество подграфов, полученных на втором этапе алгоритма;&lt;br /&gt;
&lt;br /&gt;
3) Формирование набора кластеров, на основе множества подграфов, полученных на предыдущем этапе, требует &amp;lt;math&amp;gt;m^2log(m)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Итого, для n вершин получаем последовательную сложность &amp;lt;math&amp;gt;O(n log(n)+nm+m^2log(m))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:СК.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Первый этап работы алгоритма можно распределить между &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессами. На вход каждому процессу подается своя вершина, далее происходит процедура поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ближайших соседей. Параллельная сложность составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второй и третий этапы можно распараллелить частично.&lt;br /&gt;
&lt;br /&gt;
Второй этап распараллеливается путем подачи на вход свободному процессу очередного подграфа для разделения. Число итераций оценивается в &amp;lt;math&amp;gt;O(n log(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Третий этап делится на расчет показателей схожести и соединение подграфов в кластеры. Процесс расчета показателей можно распараллелить, подавая каждому процессу на вход пару подграфов. Сложность этого процесса оценивается как &amp;lt;math&amp;gt;m log(m)&amp;lt;/math&amp;gt;. Соединение подграфов в кластеры выполняется последовательно, сложность процесса составляет &amp;lt;math&amp;gt;m^2 log(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом получаем общую параллельную сложность алгоритма: &amp;lt;math&amp;gt;O(n+ n log(n) + m^2 log (m) + m log(m))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; расстояний между элементами данных размера &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; с нулями на главной диагонали  (&amp;lt;math&amp;gt;a_{ii}= 0, i = 1, \ldots, N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - количество ближайших соседей для вершин (рекомендуемое значение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; от 5 до 20 в зависимости от количества анализируемых объектов).&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; - наименьшее число вершин, которое может содержать наибольший подкластер на 2-м этапе . Величина этого параметра варьируется от 1 до 5 % от общего числа объектов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности и нулевой главной диагонали достаточно хранить только  над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вектор из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел &amp;lt;math&amp;gt;u_{1}, u_{2}, \ldots, u_{N}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; - целое число, соответствующее кластеру &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го объекта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности на первом этапе является &#039;&#039;линейным&#039;&#039; для больших наборов данных и логарифмическим для n вершин. На втором этапе сложно оценить это соотношение - оно сильно зависит от параметров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt;. На третьем этапе соотношение равно &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Алгоритм является недетерминированным. Хотя 1-й этап детерминирован, на 2-ом этапе могут быть найдены различные разбиения на подграфы, что повлияет и на итоговый результат работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
= часть. Программная реализация алгоритма =&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
см. позднее&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Последовательная реализация алгоритма доступна по ссылке [5].&lt;br /&gt;
&lt;br /&gt;
CHAMELEON можно реализовать с использованием графовых библиотек METIS [6], hMETIS [7] и RANN [8].&lt;br /&gt;
&lt;br /&gt;
Существует исследование, связанное с реализацией CHAMELEON посредством технологии OpenMP, с которым можно ознакомиться здесь [9].&lt;br /&gt;
&lt;br /&gt;
Параллельных реализаций алгоритма CHAMELEON не найдено.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] George Karypis, Eui-Hong (Sam) Han и Vipin Kumar, «Chameleon: Hierarchical Clustering Using Dynamic Modeling», 1999.&lt;br /&gt;
&lt;br /&gt;
[2] http://studopedia.ru/7_41934_algoritm-dinamicheskoy-ierarhicheskoy-klasterizatsii-CHAMELEON.html&lt;br /&gt;
&lt;br /&gt;
[3] J.H. Friedman, J.L. Bentley, and R.A. Finkel. An algorithm for ﬁnding best matches in logarithmic expected time. ACM Transactions on Mathematical Software, 3:209–226, 1977.&lt;br /&gt;
&lt;br /&gt;
[4] S. Berchtold, C. Bohm, D. Keim, and H.-P. Kriegel. Cost model for nearest neighbor search in high dimensional data space. In Proc. of Symposium on Principles of Database Systems, Tucson, Arizona, 1997.&lt;br /&gt;
&lt;br /&gt;
[5] http://www.codeforge.com/article/192925&lt;br /&gt;
&lt;br /&gt;
[6] http://glaros.dtc.umn.edu/gkhome/metis/metis/overview&lt;br /&gt;
&lt;br /&gt;
[7] http://glaros.dtc.umn.edu/gkhome/metis/hmetis/overview&lt;br /&gt;
&lt;br /&gt;
[8] https://cran.r-project.org/web/packages/RANN/index.html&lt;br /&gt;
&lt;br /&gt;
[9] http://research.ijcaonline.org/volume79/number8/pxc3891600.pdf&lt;/div&gt;</summary>
		<author><name>ЕкатеринаКозырева</name></author>
	</entry>
</feed>